File size: 2,439 Bytes
af6912c |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 |
// 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;
|