如何补偿Javascript音频中的setInterval定时漂移
我有两个setInterval实例。每一个都以重复的间隔触发不同的函数(这两个函数是titlequartnotefunc和eighthNoteFunc)。quartnotefunc的间隔为600毫秒。eighthNoteFunc的间隔为300毫秒。这两个功能都会以重复的间隔触发不同的音频文件,从而创建基本的音乐节奏。两个函数调用之间的节奏最终在谷歌浏览器中“漂移”,使两个声音之间的节奏消失。我的问题是: 看起来,即使基于浏览器的计时是垃圾,它们也应该是一种创建某种“硬”计时参考的方法,这样即使“全局”计时偏移,声音也会被锁定,从而保持声音同步。我认为分配相同的变量毫秒(下面的代码)会抑制这种情况,但我错了 (缩写)代码如下所示 毫秒=600 quarterNote=设置间隔(quarterNoteFunc,毫秒)如何补偿Javascript音频中的setInterval定时漂移,javascript,html5-audio,Javascript,Html5 Audio,我有两个setInterval实例。每一个都以重复的间隔触发不同的函数(这两个函数是titlequartnotefunc和eighthNoteFunc)。quartnotefunc的间隔为600毫秒。eighthNoteFunc的间隔为300毫秒。这两个功能都会以重复的间隔触发不同的音频文件,从而创建基本的音乐节奏。两个函数调用之间的节奏最终在谷歌浏览器中“漂移”,使两个声音之间的节奏消失。我的问题是: 看起来,即使基于浏览器的计时是垃圾,它们也应该是一种创建某种“硬”计时参考的方法,这样即使“
eighthNote=setInterval(eighthNoteFunc,毫秒/2) 最好的方法可能是设置一个始终处于活动状态的1/8音符间隔,然后每隔一个勾号调用四分之一音符:
// wrapped in a closure to allow for a private tickCount variable
// alternatively, you could use a more advanced object with start/stop methods, etc.
(function() {
var tickCount = 0,
tick = function() {
eighthNoteFunc();
if(tickCount %2 == 0) {
quarterNoteFunc();
}
tickCount++;
};
setInterval(tick, 300);
})();
这确保了方法总是在同一时间被调用。您还可以将其扩展以支持半个注释(tickCount%4==0
)和整个注释(tickCount%8==0
)
这让我感兴趣,所以我决定创建一个完全工作的示例(除了使用动画背景而不是音频): 这允许您看到第八、四分之一和半音符同步滴答作响,以及启动和停止计时器,并单独启用或禁用音符
享受吧 我应该提到,如果您需要能够单独启动和停止不同的注释,您可以在闭包之外添加全局“标志”。例如,添加
quartentnoteactive=true
并将if
语句修改为if(quartentnoteactive&&tickCount%2==0){…}
。我是编程新手,因此在我有足够的能力理解它之前,我无法将其指定为“答案”。现在,我只想投赞成票——但我非常感激这一点。非常感谢你。