abcjs / examples /basic-transpose.html
KEXEL's picture
Upload 337 files
af6912c verified
<!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>