我正在尝试学习如何编写一个基本程序,让我看到使用Web音频API安排声音事件的正确方法,以便了解构建简单声音序列器所需的模式。我试图理解Chris Wilson's tales of two clocks article,它完全超越了我的脑海。因此,基本上我希望那些理解它的人可以尝试以不同的方式解释它,希望其中一个人能够坚持下去,类似于StackOverflow如何有一个鼓励不同解释的线程。关闭。让我展示一下到目前为止我所理解的内容。
I understand how to make a simple sequencer with setInterval
据我所知,您可以使用以下代码安排播放声音:
playSound.start(audioContext.currentTime+numb);
我从概念上理解的是如何以使用web音频api时序而不是setInterval / setTimeout的方式将视觉问题挂钩到音频播放事件。
我正在用这个来了解它是如何工作的: http://www.html5rocks.com/en/tutorials/audio/scheduling/goodmetronome.html
但与此同时,我认为我会发布这个帖子,以帮助从SO上获得更多信息。
答案 0 :(得分:1)
我不确定你的意思是什么"将视觉队列挂钩到音频播放事件",如果这不能解决您的问题,请详细说明。
您仍然需要使用setInterval(或setTimeout)在良好实现的顺控程序中进行调度。问题是setInterval / setTimeout的准确性,特别是在主线程中,可能非常低(即当你说" setTimeout(600)"时,你可能会在600ms内回调;你可能被称为回到640毫秒)。这是由于主线程中发生的其他事情(如布局,渲染和Javascript垃圾收集)以及Javascript中的事件处理系统本身而发生的。
要解决这个问题,你需要第二层调度 - 换句话说,而不是你的setInterval回调调用" start(0)" (这基本上意味着"一旦你接到这个电话就开始播放"),你说" start(sequenceStartTime + offset)"足够早,所以它在正确的时间开始,但足够晚,所以你可以决定不打电话(即你不需要在音频事件中提示整首歌)。音频事件以非常高的精度发送 - 如果您说"在时间t"开始播放此缓冲区,它将在时间t开始 - 不可能在30毫秒后开始。
如果您要求"当用户敲击打击垫时如何制作它,它会记住在序列中的正确时间播放它" - 好吧,你还记得在音频和系统时间内开始音序的时候:
sequenceStartTime = Date.now();
sequenceAudioStartTime = audioContext.currentTime;
并使用你对循环的#次数来计算开始时间的序列长度。 (这基本上就是节拍器所做的。)很高兴在聊天中实时浏览。