abcjs / examples /synth-reuse.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: Synth Demo</title>
<style>
main {
max-width: 770px;
margin: 0 auto;
}
.hidden {
display: none;
}
</style>
<script src="../dist/abcjs-basic.js" type="text/javascript"></script>
<script type="text/javascript">
var abc =
"X:1\n" +
"T: Sonata (fragment)\n" +
"C: J.S. Bach\n" +
"M: C\n" +
"L: 1/8\n" +
"K:C\n" +
"[V:1] c/gf/ E/ed/ c/c'b/ A/ag/ | ^f/e/d- d/(c/B/A/) G/(e/c/e/) Aa| d2-d/g/_b/a/ a3 g/=f/|\n" +
"[V:2] c8- | cB/A/ {A}B>c (e/c/A/c/) (E//^F//E//F//TF3//E///F///) | G/(D/G/A/) _B/G/g/e/ ^cA d2|\n" +
"[V:3] edcB AG^FE | D^FGg c3d/c/| _BG g2-gf/e/ f>g|\n"
var synthControl;
var abcOptions = {
add_classes: true,
responsive: "resize"
};
var visualObj;
function load() {
document.querySelector(".prime").addEventListener("click", prime);
document.querySelector(".play1").addEventListener("click", play1);
document.querySelector(".play12").addEventListener("click", play12);
document.querySelector(".play23").addEventListener("click", play23);
document.querySelector(".play123").addEventListener("click", play123);
document.querySelector(".play1s").addEventListener("click", play1s);
document.querySelector(".play3s").addEventListener("click", play3s);
visualObj = ABCJS.renderAbc("paper", abc, abcOptions)[0];
}
var buffers = []
function create(voices, ms) {
return new Promise(function(resolve, reject) {
var midiBuffer = new ABCJS.synth.CreateSynth();
midiBuffer.init({
visualObj: visualObj,
millisecondsPerMeasure: ms,
options: {
chordsOff: true,
voicesOff: voices
}
}).then(function (response) {
midiBuffer.prime().then(function () {
resolve({buffer: midiBuffer})
});
}).catch(function (error) {
console.warn("Audio problem:", error);
reject(error)
});
})
}
function prime() {
var button = document.querySelector(".prime")
button.classList.add("hidden")
var progress = document.querySelector(".progress")
progress.classList.remove("hidden")
var controls = document.querySelector(".after-prime")
create([1,2], 4000).then(function(r1) {
buffers[0] = r1.buffer
return create([2], 4000)
}).then(function(r2) {
buffers[1] = r2.buffer
return create([0], 4000)
}).then(function(r3) {
buffers[2] = r3.buffer
return create([], 4000)
}).then(function(r4) {
buffers[3] = r4.buffer
return create([1,2], 8000)
}).then(function(r5) {
buffers[4] = r5.buffer
return create([0,1], 8000)
}).then(function(r6) {
buffers[5] = r6.buffer
progress.classList.add("hidden")
controls.classList.remove("hidden")
})
}
function play1() {
buffers[0].start();
}
function play12() {
buffers[1].start();
}
function play23() {
buffers[2].start();
}
function play123() {
buffers[3].start();
}
function play1s() {
buffers[4].start();
}
function play3s() {
buffers[5].start();
}
</script>
</head>
<body onload="load()">
<header>
<img src="https://paulrosen.github.io/abcjs/img/abcjs_comp_extended_08.svg" alt="abcjs logo">
<h1>Reusing Synth</h1>
</header>
<div class="container">
<main>
<p>This shows how you can create and save snippets of music so that it is easy to replay them.</p>
<p>When you click "Prime" all of the buffers are created from the same music - playing different sets of voices
at different tempos.</p>
<p>Then the user can play them repeatedly with very little additional processing.</p>
<button class="prime">Prime</button>
<div class="progress hidden">Loading. Please wait...</div>
<div class="after-prime hidden">
<button class="play1">Play V1</button>
<button class="play12">Play V1 & V2</button>
<button class="play23">Play V2 & V3</button>
<button class="play123">Play V1 & V2 & V3</button>
<button class="play1s">Play V1 slow</button>
<button class="play3s">Play V3 slow</button>
</div>
<div id="paper"></div>
</main>
</div>
</body>
</html>