Javascript Web Audio API调度以构建音序器。我不知道';我不明白

Javascript Web Audio API调度以构建音序器。我不知道';我不明白,javascript,audio,html5-audio,web-audio-api,Javascript,Audio,Html5 Audio,Web Audio Api,我正在尝试学习如何编写一个基本程序,让我看到使用web audio API安排声音事件的正确方法,从而加深我对构建简单声音序列器所需模式的理解。我试着去理解,但这完全超出了我的理解范围。所以基本上我希望那些理解它的人可以尝试用不同的方式来解释它,希望其中一个会“坚持”,就像StackOverflow有一个线程鼓励对闭包进行不同的解释一样。让我来说明我到目前为止所了解的情况 我知道您可以使用以下代码安排播放声音: playSound.start(audioContext.currentTime+

我正在尝试学习如何编写一个基本程序,让我看到使用web audio API安排声音事件的正确方法,从而加深我对构建简单声音序列器所需模式的理解。我试着去理解,但这完全超出了我的理解范围。所以基本上我希望那些理解它的人可以尝试用不同的方式来解释它,希望其中一个会“坚持”,就像StackOverflow有一个线程鼓励对闭包进行不同的解释一样。让我来说明我到目前为止所了解的情况

我知道您可以使用以下代码安排播放声音:

playSound.start(audioContext.currentTime+numb);
我在概念上不理解的是,如何以使用web audio api计时而不是setInterval/setTimeout的方式将可视QUE与音频播放事件挂钩

我正在研究这一点,以确切了解其工作原理:


但与此同时,我想我会发布这个帖子,以帮助从其他人那里学到更多。我不确定你所说的“将视频队列与音频播放事件挂钩”是什么意思,如果这不能解决你的问题,那么请详细说明

在实现良好的sequencer中,仍然需要使用setInterval(或setTimeout)进行调度。问题是setInterval/setTimeout的准确性可能很低,特别是在主线程中(即,当您说“setTimeout(600)”时,您可能会在600ms后被回调;您可能会在640ms后被回调)。这是由于主线程中发生的其他事情(如布局、渲染和Javascript垃圾收集)以及Javascript中的事件处理系统本身造成的

为了解决这个问题,您需要第二层调度-换句话说,您不需要调用setInterval回调“start(0)”(这基本上意味着“在接到此调用后立即开始播放”),您需要尽早地说“start(sequenceStartTime+offset)”,以便它在正确的时间开始,但是足够晚了,所以你可以决定不打电话(也就是说,你不需要在音频事件中提示整首歌)。音频事件以非常高的精度发送-如果您说“在时间t开始播放此缓冲区”,它将在时间t开始-不可能在30毫秒后

如果你问“当用户点击键盘时,我如何使它这样做,它会记住在序列中的正确时间播放”——那么,你会记得在音频和系统时间中启动序列时:

sequenceStartTime = Date.now();
sequenceAudioStartTime = audioContext.currentTime;

然后用循环的长度乘以序列的长度来计算开始时间。(这基本上就是metronome所做的。)很高兴在聊天中实时浏览。

我能想象的最接近的方法是使用setInterval作为web音频时间事件的“外壳”。简言之,您调用setInterval以持续x(毫秒)秒,并在循环开始时启动一个包含web audio api计划事件的函数。这些网络音频事件在正确的时间触发。然而,我知道这不可能完全是你所说的,因为在某种程度上,整件事仍将受setInterval波动的支配。我写这一小段是为了告诉你我的意思。我终于“明白了”,我将为此写一篇教程。这是我的例子,如果它能帮助其他人。工作示例@William你写过那个教程吗?