Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何补偿Javascript音频中的setInterval定时漂移_Javascript_Html5 Audio - Fatal编程技术网

如何补偿Javascript音频中的setInterval定时漂移

如何补偿Javascript音频中的setInterval定时漂移,javascript,html5-audio,Javascript,Html5 Audio,我有两个setInterval实例。每一个都以重复的间隔触发不同的函数(这两个函数是titlequartnotefunc和eighthNoteFunc)。quartnotefunc的间隔为600毫秒。eighthNoteFunc的间隔为300毫秒。这两个功能都会以重复的间隔触发不同的音频文件,从而创建基本的音乐节奏。两个函数调用之间的节奏最终在谷歌浏览器中“漂移”,使两个声音之间的节奏消失。我的问题是: 看起来,即使基于浏览器的计时是垃圾,它们也应该是一种创建某种“硬”计时参考的方法,这样即使“

我有两个setInterval实例。每一个都以重复的间隔触发不同的函数(这两个函数是titlequartnotefunceighthNoteFunc)。quartnotefunc的间隔为600毫秒。eighthNoteFunc的间隔为300毫秒。这两个功能都会以重复的间隔触发不同的音频文件,从而创建基本的音乐节奏。两个函数调用之间的节奏最终在谷歌浏览器中“漂移”,使两个声音之间的节奏消失。我的问题是:

看起来,即使基于浏览器的计时是垃圾,它们也应该是一种创建某种“硬”计时参考的方法,这样即使“全局”计时偏移,声音也会被锁定,从而保持声音同步。我认为分配相同的变量毫秒(下面的代码)会抑制这种情况,但我错了

(缩写)代码如下所示

毫秒=600

quarterNote=设置间隔(quarterNoteFunc,毫秒)


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){…}
。我是编程新手,因此在我有足够的能力理解它之前,我无法将其指定为“答案”。现在,我只想投赞成票——但我非常感激这一点。非常感谢你。