javascript - 无法切换 ToneJS 振荡器的 start()/stop()

标签 javascript tone.js

我将一些 JS 与 ToneJS 库拼凑在一起,以打开/关闭一些声音。

function togglePlay() {
  const status = Tone.Transport.state; // Is either 'started', 'stopped' or 'paused'
  const element = document.getElementById("play-stop-toggle");
  if (status == "started") {
    element.innerText = "PLAY";
    Tone.Transport.stop()
  } else {
    element.innerText = "STOP";
    Tone.Transport.start()
  }

  document.querySelector('#status').textContent = status;
}


var filter = new Tone.Filter({
  type: 'lowpass',
  Q: 12
}).toMaster()



var fmOsc   = new Tone.AMOscillator("Ab3", "sine", "square").toMaster()
var fmOsc2  = new Tone.AMOscillator("Cb3", "sine", "square").toMaster()
var fmOsc3  = new Tone.AMOscillator("Eb3", "sine", "square").toMaster()

var synth   = new Tone.MembraneSynth().toMaster()

//create a loop
var loop = new Tone.Loop(function(time){
//    synth.triggerAttackRelease("A1", "8n", time)
//    fmOsc.start()
    fmOsc2.start()
    fmOsc3.start();
}, "4n")


//play the loop between 0-2m on the transport
loop.start(0)
// loop.start(0).stop('2m')

loop内我目前已经注释掉了一个鼓点。当它被评论时,togglePlay()函数将按预期启动和停止。

但是,fmOsc2fmOsc3当我切换开始时,函数将启动,但当我切换停止时,函数不会终止。

作为引用,HTML 端如下所示:<div class="trackPlay" id="play-stop-toggle" onclick="togglePlay()">PLAY</div>

如何获得 fmOsc2fmOsc3功能与按钮状态切换?

最佳答案

语气Transport并不意味着以这种方式使用,无论是用于启动或停止振荡器(当然,它可以启动/停止振荡器,但我不认为它正在做你想要它做的事情):-)

如果您在传递给 Tone.Loop 的函数中添加 console.log,您将看到它被重复调用,即,您一遍又一遍地调用fmOsc.start()。 (不过,在Loop中重复鼓点确实有意义)

调用Tone.Transport.stop()不会停止振荡器——它只会停止Loop/传输功能(即“计时”)。鼓声很明显 - 按 UI 中的 Stop 会终止鼓声,但振荡器会继续振荡。

停止振荡器的最简单/最直接(也是唯一?)的方法是调用它们的 .stop() :

  if (status == "started") {
    element.innerText = "PLAY";
    Tone.Transport.stop()
    fmOsc2.stop()
    fmOsc3.stop()
  } else {
    // ... [snip] ...

关于javascript - 无法切换 ToneJS 振荡器的 start()/stop(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63863012/

相关文章:

javascript - 停止显示内联文本

javascript - 使用 Javascript 进行用户 session 管理

javascript - 如何不指定可选参数?

javascript - Tone.PitchShift 和 Howler.js 问题

javascript - 听不到 Tone.js 音频过滤器的声音

three.js - 将 Tone.js 与 Three.js 一起使用 - 如何获得定位音频?

javascript - 按类查找元素

javascript - Tone.js 音调.BufferSource : buffer is either not set or not loaded

javascript - Tone.js 错误 : 'Start time must be strictly greater than previous start time'

javascript - JS Currying 一个静态函数