Javascript Can';t切换ToneJS振荡器的start()/stop()
我用ToneJS库拼凑了一些JS来打开/关闭一些声音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") {
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] ...