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 中计时器的这些基本问题,我真的没有更好的解决方案来解决您的问题,但这至少可以解释正在发生的事情。
我在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),但我认为这一点是微不足道的。
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 中计时器的这些基本问题,我真的没有更好的解决方案来解决您的问题,但这至少可以解释正在发生的事情。