我按照本文中的说明创建了一个 Javascript 节拍器。它利用 Web Audio API 并audioContext.currentTime
以精确计时为核心。
我的版本,可在此 plunker 获得,是原始版本的一个非常简化的版本,由 Chris Wilson 制作,可在此处获得。为了让我的工作,因为它使用一个实际的音频文件并且不通过振荡器合成声音,你需要下载 plunker 和这个音频文件,将它放在根文件夹中(它是一个节拍器的“滴答声”,但你可以使用任何你想要的声音)。
它就像一个魅力 - 如果不是因为如果用户最小化窗口,否则非常准确的节拍器会立即开始打嗝并且非常糟糕。我真的不明白这是什么问题,在这里。
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();
};