Ich folgte den Anweisungen in this article und erstellte ein Javascript-Metronom. Es nutzt die Web Audio API und hat audioContext.currentTime
in seinem Kern für präzises Timing.AudioContext Timing-Probleme, wenn Fenster minimiert wird
Meine Version, verfügbar unter this plunker, ist eine sehr vereinfachte Version des Originals, hergestellt von Chris Wilson und erhältlich here. Damit meine Arbeit funktioniert, da sie eine tatsächliche Audiodatei verwendet und keine Klänge über einen Oszillator synthetisiert, müssen Sie den Plocker und this audio file herunterladen und in den Stammordner stellen (es ist ein Metronom-Tick-Ton, aber Sie könnte jeden Ton verwenden, den Sie wollen).
Es funktioniert wie ein Zauber - wenn es nicht die Tatsache wäre, dass, wenn der Benutzer das Fenster minimiert, das ansonsten sehr genaue Metronom sofort und schrecklich schluckt. Ich verstehe wirklich nicht, was das Problem ist, hier.
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();
};