| <!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> |
|
|