<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta http-equiv="x-ua-compatible" content="ie=edge"> <meta name="viewport" content="width=device-width, initial-scale=1"> <link rel="icon" href="favicon.ico" type="image/x-icon"/> <link rel="stylesheet" href="examples-styles.css"/> <title>abcjs: Basic Demo</title> <link rel="stylesheet" type="text/css" href="../abcjs-audio.css"> <script src="../dist/abcjs-basic.js" type="text/javascript"></script> <style> #audio { margin-top: 20px; max-width: 760px; } </style> <script type="text/javascript"> var abc = "T: Cooley's\n" + "M: 4/4\n" + "L: 1/8\n" + "R: reel\n" + "K: Emin\n" + "|:D2|EB{c}BA B2 EB|~B2 AB dBAG|FDAD BDAD|FDAD dAFD|\n" + "EBBA B2 EB|B2 AB defg|afe^c dBAF|DEFD E2:|\n" + "|:gf|eB B2 efge|eB B2 gedB|A2 FA DAFA|A2 FA defg|\n" + "eB B2 eBgB|eB B2 defg|afe^c dBAF|DEFD E2:|"; function load() { var showPlayer = document.querySelector('#show-player'); var transposeHalfSteps = document.querySelector(".transpose-half-steps"); var transposeVisual = document.querySelector(".transpose-visual"); var transposeAudio = document.querySelector(".transpose-audio"); var visualObj = ABCJS.renderAbc("paper", abc); var createSynth; var synthControl; // Initialize sound buffer and playback widget on a user gesture because of browser constraints on AudioContexts. showPlayer.addEventListener('click', () => { if (ABCJS.synth.supportsAudio()){ createSynth = new ABCJS.synth.CreateSynth(); // sound buffer synthControl = new ABCJS.synth.SynthController(); // widget // preloads and caches the notes to be played createSynth.init({ visualObj: visualObj[0] }).then(function() { redraw(); }); // creates playback widget with no visual cursor var cursorControl = null; synthControl.load('#audio', cursorControl, { displayRestart: true, displayPlay: true, displayProgress: true, }); } else { document.querySelector('#audio').innerHTML = 'Audio is not supported in this browser.' } showPlayer.style.display = 'none'; }); function redraw() { var transposeBy = transposeHalfSteps.value; var doVisual = transposeVisual.checked ? transposeBy : 0; var doAudio = transposeAudio.checked ? transposeBy : 0; // re-render visualObj visualObj = ABCJS.renderAbc("paper", abc, { visualTranspose: doVisual }); if(createSynth && synthControl) { // re-set tune stored in SynthController synthControl.setTune(visualObj[0], true, { midiTranspose: doAudio }) .then(function(){ console.log('Audio successfully loaded.') }).catch(function(error) { console.warn('Audio problem: ', error); }); } } transposeHalfSteps.addEventListener("change", function() { redraw(); }); transposeVisual.addEventListener("change", function() { redraw(); }); transposeAudio.addEventListener("change", function() { redraw(); }); } </script> </head> <body onload="load()"> <header> <img src="https://paulrosen.github.io/abcjs/img/abcjs_comp_extended_08.svg" alt="abcjs logo"> <h1>Basic Transposition</h1> </header> <div class="container"> <p>This transposes either/both the visual music and the synth.</p> <label>Transpose half-steps: <input class="transpose-half-steps" type="number" min="-24" max="24" step="1" value="0"></label> <label><input type="checkbox" class="transpose-visual" checked>Visual?</label> <label><input type="checkbox" class="transpose-audio" checked>Audio?</label> <button id="show-player">Show Audio Player</button> <div id="audio"></div> <div id="warnings"></div> <div id="paper"></div> </div> </body> </html>