Web Audio启动和停止振荡器然后再次启动它

bre*_*gag 8 javascript audio web-audio-api

我想开始并停止声音.这很有效.但是我无法重新开始播放声音.

我真的要再制作一个振荡器吗?这看起来非常不直观.肯定有更好的办法.

这就是我所有的工作:

oscillator1.noteOn(0);
oscillator1.noteOff(0);
Run Code Online (Sandbox Code Playgroud)

再次致电noteOn并没有做任何事情.为什么?超越我.

我也尝试设置音量,或者在Web Audio人的上下文中,"增益"等于零.但由于某种原因,增益为零会产生声音.什么样的增益值都不会发出任何声音?

男人,我简直不敢相信这是多么困难:/

Osk*_*son 7

实际上,是的,您必须创建一个新的振荡器节点.API经过精心设计和优化,可以使用该模式.

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

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

这是相同的代码,虽然使用增益节点进行调整以控制振荡器,因此一直只使用相同的振荡器(虽然不建议这样做,但我认为最好为每个音符创建一个新振荡器)http:// codepen .IO/Theodeus /笔/ 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);
Run Code Online (Sandbox Code Playgroud)

  • 请记住,断开/重新连接有一个主要缺陷 - 当您重新连接时,您将处于振荡的随机阶段;你不是从前沿过零开始。 (2认同)

Wil*_*iam 3

您必须使用 .disconnect() 方法(除非规范最近发生了变化)。

我在这里写了这个:

http://en.wikiaudio.org/Web_Audio_API:Toggle_oscillator_on_and_off

编辑

当我只是想了解 Web Audio API 的工作原理时,这个答案已经很旧了。您不需要使用断开连接。