Я выполнил инструкции в this article и создал метроном Javascript. Он использует API веб-аудио и имеет audioContext.currentTime
в своем ядре для точного времени.Проблемы с синхронизацией аудиоконтекста при минимизации окна
Моя версия, доступная по адресу this plunker, является очень упрощенной версией оригинала, сделанной Крисом Уилсоном и доступна here. Для того, чтобы моя работала, поскольку она использует фактический звуковой файл и не синтезирует звуки через осциллятор, вам нужно загрузить плункер и this audio file, поместив его в корневую папку (это звук метронома «галочка», но вы может использовать любой звук, который вы хотите).
Это работает как шарм - если бы не тот факт, что если пользователь сводит к минимуму окно, то в противном случае очень точный метроном начинает икать мгновенно и ужасно. Я действительно не понимаю, в чем проблема, здесь.
Javascript
var context, request, buffer;
var tempo = 120;
var tickTime;
function ticking() {
var source = context.createBufferSource();
source.buffer = buffer;
source.connect(context.destination);
source.start(tickTime);
}
function scheduler() {
while (tickTime < context.currentTime + 0.1) { //while there are notes to schedule, play the last scheduled note and advance the pointer
ticking();
tickTime += 60/tempo;
}
}
function loadTick() {
request = new XMLHttpRequest(); //Asynchronous http request (you'll need a local server)
request.open('GET', 'tick.wav', true); //You need to download the file @ http://s000.tinyupload.com/index.php?file_id=89415137224761217947
request.responseType = 'arraybuffer';
request.onload = function() {
context.decodeAudioData(request.response, function (theBuffer) {
buffer = theBuffer;
});
};
request.send();
}
function start() {
tickTime = context.currentTime;
scheduleTimer = setInterval(function() {
scheduler();
}, 25);
}
window.onload = function() {
window.AudioContext = window.AudioContext || window.webkitAudioContext;
context = new AudioContext();
loadTick();
start();
};