UNPKG

abcjs

Version:

Renderer for abc music notation

113 lines (95 loc) 2.44 kB
// abc_animation.js: handles animating the music in real time. var TimingCallbacks = require('./abc_timing_callbacks'); var animation = {}; (function() { "use strict"; var timer; var cursor; animation.startAnimation = function(paper, tune, options) { //options.bpm //options.showCursor //options.hideCurrentMeasure //options.hideFinishedMeasures if (timer) { timer.stop(); timer = undefined; } if (options.showCursor) { cursor = paper.querySelector('.abcjs-cursor'); if (!cursor) { cursor = document.createElement('DIV'); cursor.className = 'abcjs-cursor cursor'; cursor.style.position = 'absolute'; paper.appendChild(cursor); paper.style.position = 'relative'; } } function hideMeasures(elements) { for (var i = 0; i < elements.length; i++) { var element = elements[i]; if (!element.classList.contains('abcjs-bar')) element.style.display = "none"; } } var lastMeasure; function disappearMeasuresAfter(selector) { if (lastMeasure) { var elements = paper.querySelectorAll(lastMeasure); hideMeasures(elements); } lastMeasure = selector; } function disappearMeasuresBefore(selector) { var elements = paper.querySelectorAll(selector); hideMeasures(elements); } function measureCallback(selector) { if (options.hideCurrentMeasure) { disappearMeasuresBefore(selector); } else if (options.hideFinishedMeasures) { disappearMeasuresAfter(selector); } } function getLineAndMeasure(element) { return '.abcjs-l' + element.line + '.abcjs-m' + element.measureNumber; } function setCursor(range) { if (range) { if (range.measureStart) { var selector = getLineAndMeasure(range); if (selector) measureCallback(selector); } if (cursor) { cursor.style.left = range.left + "px"; cursor.style.top = range.top + "px"; cursor.style.width = range.width + "px"; cursor.style.height = range.height + "px"; } } else { timer.stop(); timer = undefined; } } timer = new TimingCallbacks(tune, { qpm: options.bpm, eventCallback: setCursor }); timer.start(); }; animation.pauseAnimation = function(pause) { if (timer) { if (pause) timer.pause(); else timer.start(); } }; animation.stopAnimation = function() { if (timer) { timer.stop(); timer = undefined; } }; })(); module.exports = animation;