abcjs / examples /animation.html
KEXEL's picture
Upload 337 files
af6912c verified
<!DOCTYPE html>
<html>
<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 animation</title>
<script src="../dist/abcjs-basic.js" type="text/javascript"></script>
<style media="screen" type="text/css">
.abcjs-cursor {
stroke: blue;
}
@media (prefers-color-scheme: dark) {
.abcjs-cursor {
stroke: #ffffff;
}
}
path {
transition: opacity 1s;
}
.abcjs-note.hidden, .abcjs-beam-elem.hidden {
opacity: 0;
}
.color {
stroke: red;
fill: red;
}
</style>
</head>
<body onload="load()">
<header>
<img src="https://paulrosen.github.io/abcjs/img/abcjs_comp_extended_08.svg" alt="abcjs logo">
<h1>Animation</h1>
</header>
<div class="container">
<div class="cursor-nav">
<div>
<label><input type="checkbox" id="hide-finished-measures" checked>Hide Finished Measures</label>
<label><input type="checkbox" id="show-cursor" checked>Show Cursor</label>
<label><input type="checkbox" id="color-note" checked>Color Note</label>
<button id="do-animation">Start</button>
</div>
</div>
<div id="paper" class="paper"></div>
<div id="warnings"></div>
</div>
<script>
var abcString = "T: Cooley's\n" +
"M: 4/4\n" +
"L: 1/8\n" +
"R: reel\n" +
"K: Emin\n" +
"|:EBBA B2 EB|~B2 AB dBAG|FDAD BDAD|FDAD dAFD|\n" +
"EBBA B2 EB|B2 AB defg|afe^c dBAF|1 DEFD E2 D2:|2 DEFD E2 gf||\n" +
"|:eB B2 efge|eB B2 gedB|A2 FA DAFA|A2 FA defg|\n" +
"eB B2 eBgB|eB B2 defg|afe^c dBAF|DEFD E2 gf:|";
function load() {
var visualObj = ABCJS.renderAbc("paper", abcString, {add_classes: true});
var timingCallbacks = new ABCJS.TimingCallbacks(visualObj[0], {
beatCallback: beatCallback,
eventCallback: eventCallback,
});
function createCursor() {
var svg = document.querySelector("#paper svg");
var cursor = document.createElementNS("http://www.w3.org/2000/svg", "line");
cursor.setAttribute("class", "abcjs-cursor");
cursor.setAttributeNS(null, 'x1', 0);
cursor.setAttributeNS(null, 'y1', 0);
cursor.setAttributeNS(null, 'x2', 0);
cursor.setAttributeNS(null, 'y2', 0);
svg.appendChild(cursor);
return cursor;
}
var cursor = createCursor();
var button = document.getElementById("do-animation");
button.addEventListener("click", function() { startStop(); });
var hideFinishedMeasures = document.getElementById("hide-finished-measures");
var showCursor = document.getElementById("show-cursor");
var colorNote = document.getElementById("color-note");
var isRunning = false;
var buttonText = ["Start", "Stop"];
var pauseButtonControl = function () {
isRunning = !isRunning;
button.innerText = buttonText[isRunning ? 1 : 0];
};
var startStop = function() {
isRunning = !isRunning;
button.innerText = buttonText[isRunning ? 1 : 0];
if (isRunning)
timingCallbacks.start();
else
timingCallbacks.stop();
}
var restart = function() {
timingCallbacks.start();
}
function beatCallback(currentBeat,totalBeats,lastMoment,position, debugInfo) {
var x1, x2, y1, y2;
if (currentBeat === totalBeats) {
showAllMeasures();
x1 = 0;
x2 = 0;
y1 = 0;
y2 = 0;
} else {
x1 = position.left - 2;
x2 = position.left - 2;
y1 = position.top;
y2 = position.top + position.height;
}
if (showCursor.checked) {
cursor.setAttribute("x1", x1);
cursor.setAttribute("x2", x2);
cursor.setAttribute("y1", y1);
cursor.setAttribute("y2", y2);
}
if (colorNote.checked)
colorElements([]);
}
function hideMeasure(num) {
var els = document.querySelectorAll(".abcjs-mm"+num);
for (var i = 0; i < els.length; i++)
els[i].classList.add("hidden")
}
function showAllMeasures() {
var els = document.querySelectorAll(".hidden");
for (var i = 0; i < els.length; i++)
els[i].classList.remove("hidden")
}
var lastEls = [];
function colorElements(els) {
var i;
var j;
for (i = 0; i < lastEls.length; i++) {
for (j = 0; j < lastEls[i].length; j++) {
lastEls[i][j].classList.remove("color");
}
}
for (i = 0; i < els.length; i++) {
for (j = 0; j < els[i].length; j++) {
els[i][j].classList.add("color");
}
}
lastEls = els;
}
var lastMeasure = -1;
function eventCallback(ev) {
if (!ev) {
pauseButtonControl();
return;
}
if (ev.measureStart && hideFinishedMeasures.checked) {
if (lastMeasure > ev.measureNumber)
showAllMeasures();
else if (lastMeasure >= 0)
hideMeasure(lastMeasure);
lastMeasure = ev.measureNumber;
}
if (colorNote.checked) {
colorElements(ev.elements);
}
}
}
</script>
</body>
</html>