Javascript Can';t切换ToneJS振荡器的start()/stop()

Javascript Can';t切换ToneJS振荡器的start()/stop(),javascript,tone.js,Javascript,Tone.js,我用ToneJS库拼凑了一些JS来打开/关闭一些声音 function togglePlay() { const status = Tone.Transport.state; // Is either 'started', 'stopped' or 'paused' const element = document.getElementById("play-stop-toggle"); if (status == "started") {

我用ToneJS库拼凑了一些JS来打开/关闭一些声音

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')
循环中
我有一个鼓拍,我现在已经注释掉了。当它在中被注释时,
togglePlay()
函数将按预期启动和停止它

但是,
fmOsc2
fmOsc3
功能将在切换开始时启动,但不会在切换停止时终止

作为参考,下面是HTML端的外观:
PLAY

如何使
fmOsc2
fmOsc3
功能与按钮状态切换?

该音调不是用来启动或停止振荡器的(当然,它可以启动/停止振荡器,但我不认为它在做您希望它做的事情):-)

如果在传递给
Tone.Loop
的函数中添加
console.log
,您将看到它被反复调用,即反复调用
fmOsc.start()
。(不过,在
循环中重复击鼓是有意义的)

调用
Tone.Transport.stop()
不会停止振荡器——它只会停止
循环
/Transport函数(即“计时”)。鼓的节拍使它变得明显——在用户界面中按
Stop
可以杀死鼓,但振荡器会继续振荡

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

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