我正在尝试启动和停止声音。那行得通。但是我无法重新开始播放声音。

我真的必须再次制造另一个振荡器吗?这似乎非常不直观。一定会有更好的办法。

这就是我拥有的全部作品:

oscillator1.noteOn(0);
oscillator1.noteOff(0);

再次调用noteOn不会执行任何操作。为什么?超越了我。

我还尝试将音量设置为零,或者在Web Audio人员的上下文中将“增益”设置为零。但是由于某种原因,零增益会发出声音。什么增益值不会发出声音?

伙计,我不敢相信这有多难:/

最佳答案

实际上,是的,您必须创建一个新的振荡器节点。对API进行了设计和优化,以使用该模式。

道教代码中的断开模式基本上是创建新振荡器的一种复杂方法(每次运行oscOn时都会这样做)。它永远不会在断开连接的旧振荡器上显式调用noteOff,因此它可能仍在后台运行(不确定网络音频的处理方式),尽管由于与音频链断开而无法听见。因此,它可能会在后台堆叠正在运行并消耗CPU的振荡器。

这是相同的代码,尽管正确使用了noteOff()。 http://codepen.io/Theodeus/pen/afgqk

这是相同的代码,尽管使用了增益节点来控制振荡器,因此始终始终使用同一振荡器(尽管不建议这样做,我认为最好为每个音符创建一个新的振荡器)。

编辑2015年4月
由于代码示例似乎在网络空间中丢失了,因此这是我在振荡器上编写的教程,其中包含的代码示例显示了振荡器的单发特性。它与上面引用的代码不完全相同,但是它显示了相同的概念。 http://codepen.io/Theodeus/pen/aKFje-要点是:

//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);

关于javascript - Web Audio启动和停止振荡器,然后重新启动,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15261030/

10-12 21:29