为什么网络音频振荡器只播放一次音符?

时间:2012-10-27 00:32:00

标签: javascript webkit web-audio

当我使用网络音频振荡器(使用noteOn)成功创建音频时,请调用其noteOff功能,随后对noteOn的呼叫不再播放音调。我似乎不得不创造一个新的振荡器来发挥新的音符。这是为什么?

var ctx = new webkitAudioContext();
var osc = ctx.createOscillator();
osc.connect(ctx.destination);
osc.start(0); // tone is heard (previously noteOn(0))

// ... some time later
osc.stop(0); // tone falls silent (previously noteOff(0))

// ... some time later
osc.start(0); // no effect! (previously noteOn(0))

3 个答案:

答案 0 :(得分:9)

简单地说 - API就是这样设计的,并针对这种用途进行了优化。除了为每个音符创建一个新的振荡器之外,没有多少选择。

答案 1 :(得分:6)

使用振荡器池并使用增益节点控制音符开/关。与模拟合成器一样,振荡器一直在池中运行。

虽然可以创建振荡器池,但Web Audio API已经过优化,不值得做。我之前认为振荡器池是一个好主意,但事实并非如此。每次需要一个新注释时创建一个新的振荡器非常简单 - 比维护一个池简单得多 - 并且这个持续的创建/垃圾收集过程不会对性能产生重大影响。

如果你考虑一下,这是一个非常干净的编程模型。无需维护对象的引用,然后再重用它们。减少维持状态。

答案 2 :(得分:5)

如何将频率更改为0?它似乎适用于此Dataflow + Web Audio API沙箱。 (startstop使用断开/重新连接模式。)