假设您使用Web Audio API播放纯音:
ctx = new AudioContext();
src = ctx.createOscillator();
src.frequency = 261.63; //Play middle C
src.connect(ctx.destination);
src.start();
但是,稍后您决定要停止该声音:
src.stop();
从现在开始,src
已经完全无用了;如果您尝试重新启动它,您会得到:
src.start()
VM564:1 Uncaught DOMException: Failed to execute 'start' on 'AudioScheduledSourceNode': cannot call start more than once.
at <anonymous>:1:5
比方说,如果你在做一个在线小键盘,你就会不断地打开和关闭音符。从音频节点图中删除旧对象,创建一个全新的对象,然后将其connect()
到图中(然后在以后丢弃该对象),这似乎真的很笨拙,而在需要时只打开和关闭它会更简单。
Web Audio API做这样的事情有什么重要的原因吗?或者,有没有更干净的方法来重新启动音频源?
发布于 2020-03-27 22:18:15
这正是web音频api的工作方式。声音生成器节点,如振荡器节点和音频缓冲源节点,只需使用一次。每次您想要播放您的振荡器,您必须创建它并设置它,就像您所说的。我知道这看起来很麻烦,但是你可以把它抽象成一个play()
方法来为你处理这些细节,这样你就不必在每次玩振荡器的时候都去想它了。此外,不要担心创建这么多节点对性能的影响。web音频api就是这样使用的。
如果您只想在internet上制作音乐,而对学习web audio api的细节不感兴趣,那么您可能会对使用我编写的一个库感兴趣,该库使事情变得更简单:https://github.com/rserota/wad。
发布于 2020-06-02 21:53:55
我正在研究一个12声道复调合成器与2 Osc每声音。
我现在不会停止Osc,我会断开Osc的连接,你可以通过setTimeout
来做到这一点。从amp Enveloop中选择最长的释放阶段(第1个,共2个),减去AudioContext.currentTime()
,乘以1000 (setTimeout
适用于milisecs,网络音频适用于秒)。
https://stackoverflow.com/questions/60805252
复制相似问题