为什么Web音频振荡器只能播放一次音符



当我成功地使用Web音频振荡器创建音调(带有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))

简单地说 - API以这种方式设计,并针对这种使用进行了优化。除了每注意创建新的振荡器外,别无选择。

使用振荡器池并用增益节点打开/关节注释。像模拟合成器一样,振荡器一直在池中运行。

虽然它可以创建一个振荡器池,但Web音频API已被如此优化,以至于不值得这样做。我以前认为振荡器池是个好主意,但事实并非如此。每当您需要新的音符时,创建一个新的振荡器非常简单 - 比维护游泳池要简单得多,并且对这种持续的创建/垃圾收集过程所造成的性能没有重大打击。

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

将频率更改为0怎么样?它似乎在此DataFlow Web Audio API沙箱中工作。(startstop使用Disconnect/reconnect模式。)

最新更新