javascript 音序器中的计时

Timing in javascript sequencer

我在javascript开发了一个音乐音序器;像这样:http://stepseq.michd.me/ 我通过以下方式使用 setInterval 函数实现了循环:

var Sequencer = {
...
// every step sequencer ...
next: function(callback) {
        // restart from begin if arrive to last sequecer step
        if(Sequencer.current==Sequencer.steps.length)
            Sequencer.current = 0;
        // play all sounds in array  step contains
        if(Sequencer.steps[Sequencer.current].length>0) {
            var set = Sequencer.steps[Sequencer.current];
            for(var i=0;i<set.length;i++){
                set[i].play();
            }
        }
        callback(Sequencer.current);
        Sequencer.current++;
    },

loop: function(callback) {
        Sequencer.interval = $interval(function(){
            Sequencer.next(callback);
        }, Sequencer.time);
    }
}
...

下面的代码有效,但我认为有更好的方法来实现循环;事实上,有时步骤会超时。 Sequencer.time(传给setInterval函数的时间)是以毫秒为单位的时间(这个值是bpm值的换算,比如可以是125),

有人可以建议我更好的解决方案吗?

N.B.: 这是一个基于 angularjs 的网络应用程序(出于这个原因,在上面的代码中使用 $interval 代替 setInterval),但我认为这一点是微不足道的。

由于 JS 的单线程特性,

Javascript 计时器间隔不能保证在您请求的准确时间 运行。你得到的是一个回调,在间隔到期后排队到 运行,每当引擎空闲时 运行 它

John resig 对此进行了一定程度的介绍:

http://ejohn.org/blog/how-javascript-timers-work/

http://ejohn.org/blog/analyzing-timer-performance/

根据他的结论,这对您的应用很重要:

If a timer is blocked from immediately executing it will be delayed until the next possible point of execution (which will be longer than the desired delay).

由于 JS 中计时器的这些基本问题,我真的没有更好的解决方案来解决您的问题,但这至少可以解释正在发生的事情。