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

aaa*_*dan 7 javascript webkit web-audio-api

当我使用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))
Run Code Online (Sandbox Code Playgroud)

Osk*_*son 9

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


fis*_*dev 6

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

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

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


for*_*sto 5

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