音频同步,呼叫功能每1 / 44.1毫秒

时间:2014-01-06 23:19:36

标签: javascript html5 performance web-audio

在JavaScript中,是否可以调用函数以44.1 kHz播放10种不同的wav声音,并在(1/44100)*(128/60)* 16秒内再次调用相同的函数,精度为1/44.1毫秒与铬/野生动物园,在这种情况下如何?

我正在制作一个音乐循环机器,同时播放几个循环。需要精确度,否则声音会有不必要的可听见问题(定相)。

3 个答案:

答案 0 :(得分:5)

罗伯特,

可以通过performance.now()以高精度测量时间 - 但是你不能以这种精度获得回调。事实上,鉴于主线程中的布局传递和JavaScript执行,以及主线程中发生的垃圾收集的迫在眉睫的威胁,你甚至无法达到甚至毫秒级的精度;你通常应该在数十毫秒的时间内计划潜在的中断以获得稳健性。

这个问题的答案是使用调度,特别是在Web Audio API中 - 我看到你在一年前看到我在HTML5Rocks(http://www.html5rocks.com/en/tutorials/audio/scheduling/)上写过的关于这个的文章,但你错过了重要篇幅 - 你不应该打电话

audioSource2.noteOn(0, 0.1190, 1.875);

您需要时间偏移量才能正确安排:

audioSource2.noteOn(time, 0.1190, 1.875);

如果你查看我的原始代码,那就是我提前安排振荡器的方式。调度程序在一个“慢”回调循环中运行 - 每隔100毫秒左右调用一次 - 但是会提前调度一些节拍。如果您确实需要将可能已在下一个1/10秒安排的音符静音,那么您可以将节点保持在中间以断开连接()。

答案 1 :(得分:0)

我会看一下DOM High Resolution timestamp,可以使用window.performance.now()访问,或request Animation Framewindow.requestAnimationFrame

答案 2 :(得分:0)

您可以使用我写的这个库:https://github.com/sebpiq/WAAClock

它可以让您精确,轻松地安排事情,并提供有用的功能,例如:取消事件,改变速度,......循环机器所需的一切。在幕后,它实现了本文中解释的技巧(已经被其他人链接):http://www.html5rocks.com/en/tutorials/audio/scheduling/

如果使用循环机你意味着连续循环几个样本(而不是鼓机,你只是在某个时间点播放样本),你可能还想看看这个:https://github.com/sebpiq/WAATableNode