实际上,是的,您必须创建一个新的振荡器节点。API 的设计和优化可以与该模式一起使用。
Taoist 代码中的断开模式基本上是一种创建新振荡器的复杂方式(每次运行 oscOn 时都会这样做)。它永远不会在断开连接的旧振荡器上显式调用 noteOff,因此它可能仍在后台运行(不确定网络音频如何处理此问题),尽管由于它与音频链断开连接而听不见。因此,它可能会在后台堆叠正在运行并耗尽 CPU 的振荡器。
这是相同的代码,尽管正确使用了 noteOff()。http://codepen.io/Theodeus/pen/afgqk
这是相同的代码,虽然使用增益节点来控制振荡器,因此始终只使用相同的振荡器(尽管不建议这样做,最好为每个音符创建一个新的振荡器,我认为)http://codepen .io/Theodeus/pen/aKFje
编辑 2015 年 4 月
由于代码示例似乎在网络空间中丢失,这是我写的关于振荡器的教程,其中包含显示振荡器的一次性性质的代码示例。它与上面引用的代码并不完全相同,但它显示了相同的概念。http://codepen.io/Theodeus/blog/web-audio-synth-part-1-generating-sound - 它的要点是:
//This won't work. Can't call play twice.
var context = new AudioContext(),
oscillator = context.createOscillator();
oscillator.connect(context.destination);
oscillator.start(context.currentTime);
oscillator.stop(context.currentTime + 0.5);
oscillator.start(context.currentTime + 1);
oscillator.stop(context.currentTime + 1.5);
//this will work!
var context = new AudioContext(),
oscillator;
function playOscillator(startTime, endTime) {
oscillator = context.createOscillator();
oscillator.connect(context.destination);
oscillator.start(startTime);
oscillator.stop(endTime);
}
playOscillator(context.currentTime, context.currentTime + 0.5);
playOscillator(context.currentTime + 1, context.currentTime + 1.5);