在JavaScript中,是否可以调用函数以44.1 kHz播放10种不同的wav声音,并在(1/44100)*(128/60)* 16秒内再次调用相同的函数,精度为1/44.1毫秒与铬/野生动物园,在这种情况下如何?
我正在制作一个音乐循环机器,同时播放几个循环。需要精确度,否则声音会有不必要的可听见问题(定相)。
答案 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 Frame,window.requestAnimationFrame
答案 2 :(得分:0)
您可以使用我写的这个库:https://github.com/sebpiq/WAAClock
它可以让您精确,轻松地安排事情,并提供有用的功能,例如:取消事件,改变速度,......循环机器所需的一切。在幕后,它实现了本文中解释的技巧(已经被其他人链接):http://www.html5rocks.com/en/tutorials/audio/scheduling/
如果使用循环机你意味着连续循环几个样本(而不是鼓机,你只是在某个时间点播放样本),你可能还想看看这个:https://github.com/sebpiq/WAATableNode