【问题标题】:Web Audio start and stop oscillator then start it again网络音频启动和停止振荡器,然后再次启动它
【发布时间】:2013-03-07 00:40:30
【问题描述】:

我正在尝试启动和停止声音。那行得通。但我无法再次启动声音。

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

这就是我所拥有的一切:

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

再次调用 noteOn 没有任何作用。为什么?超出了我的范围。

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

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

【问题讨论】:

  • 如何将它与增益节点连接,并在您想要暂停振荡器时将增益设置为 0?

标签: javascript audio web-audio-api


【解决方案1】:

实际上,是的,您必须创建一个新的振荡器节点。 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);

【讨论】:

  • 而且,为了证明这一点,这里的断开模式适用于仅使用一个振荡器并断开/重新连接。 codepen.io/Theodeus/pen/bwoKn
  • 就在我以为我知道自己在做什么的时候。补充一点,noteOn() 和 noteOff() 已被弃用,取而代之的是 start() 和 stop()
  • Taoist 的原始代码将使振荡器保持一段时间(并运行!),但是一旦您创建了另一个振荡器(下一次调用 oscOn()),对前一个振荡器的引用被释放,它会被垃圾回收。
  • 请记住,断开/重新连接有一个主要缺陷 - 当您重新连接时,您将处于振荡的随机阶段;你不是从前沿过零开始的。
  • 嘎。抱歉,当您按 Enter 时,一直忘记 cmets 自动添加。你真的应该创建新的振荡器;它们没那么贵。
【解决方案2】:

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

我在这里写的:

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

编辑

当我只是想了解 Web Audio API 的工作原理时,此响应是旧的。您不需要使用断开连接。

【讨论】:

  • 这比破坏振荡器更有意义!
  • 我在 2 年前写的。您无需断开它们即可启动和停止。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-12
  • 2019-01-18
  • 1970-01-01
相关资源
最近更新 更多