7

当我使用网络音频振荡器(带有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))
4

3 回答 3

9

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

于 2012-10-29T10:28:30.023 回答
6

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

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

如果你仔细想想,这是一个非常干净的编程模型。无需维护对对象的引用,然后再重用它们。需要维护的状态较少。

于 2012-11-04T14:32:14.157 回答
5

将频率更改为0怎么样?它似乎在这个Dataflow + Web Audio API沙箱中工作。(startstop使用断开/重新连接模式。)

于 2013-01-29T14:44:15.747 回答