【问题标题】:Webaudio oscillator start() callback?Webaudio 振​​荡器 start() 回调?
【发布时间】:2018-12-19 22:30:02
【问题描述】:

我有一个合成器声音的振荡器,我在不同时间在音序器中启动它。下面的代码在我的声音开始之前运行(这段代码可以在时间是一个变量的情况下运行多次,在音频开始之前)。

osc.start(time);
osc.stop(time + 0.51);

假设这个振荡器在 0.0、2.0、3.0 等时间开始。当它以振荡器节点的 onended 回调结束时,我有一个回调。

但是我如何在它开始时获得回调?

【问题讨论】:

  • 一旦您停止振荡器,为了再次启动它,您需要重新创建振荡器并将其连接到目的地。只有这样你才能重新开始。也许您会使用 setInterval 执行此操作,但 控制它何时开始。因此,在启动振荡器后,您可以立即调用“回调”。

标签: javascript web-audio-api


【解决方案1】:

在浏览了一些文档之后,看起来您尝试做的事情对于 vanilla JS 来说并非易事。但是,我最近发现了一个名为 Tone.js 的 JS 库。使用他们的库,振荡器节点有一个“状态”属性,可以告诉您振荡器何时“启动”或“停止”。这可能对您有所帮助,因为它可能允许您编写一个在振荡器进入“启动”状态时触发的函数。以下是 Tone.js 的一些相关文档:https://tonejs.github.io/docs/r12/OscillatorNode#getstateattime

希望这会有所帮助。

【讨论】:

  • 谢谢我也在调查 Tone。我认为他们有专门用于启动和停止的事件,但需要进一步研究。
【解决方案2】:

我最近遇到了这个问题,我通过创建一个在启动的同时停止的静音振荡器来解决这个问题。这使您可以控制onended 回调的时间。

这样做的缺点是您必须将函数与要附加回调的振荡器分开提示。但是,它可以让您使用 vanilla JS 实现您想要的效果

cueFunction = (time, callbackFunction) => {
    audioContext = new window.AudioContext()

    const silentOscillator = audioContext.createOscillator();
    silentOscillator.connect(audioContext.destination);
    silentOscillator.onended = () => {
      callbackFunction();
    };
    silentOscillator.start(time);
    silentOscillator.stop(time);
  };

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-16
    • 1970-01-01
    • 2015-11-30
    相关资源
    最近更新 更多