无法为 ToneJS 振荡器切换 start()/stop()
Can't toggle start()/stop() for ToneJS oscillators
我将一些 JS 与 ToneJS 库拼凑在一起来切换一些声音 on/off。
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()
函数将按预期启动和停止它。
但是,fmOsc2
和 fmOsc3
功能会在我切换开始时启动,但不会在我切换停止时终止。
作为参考,下面是 HTML 面的样子:<div class="trackPlay" id="play-stop-toggle" onclick="togglePlay()">PLAY</div>
如何让 fmOsc2
和 fmOsc3
函数与按钮状态切换?
音调 Transport 不应该以这种方式使用,无论是用于启动还是停止振荡器(当然,它可以 start/stop 振荡器,但我不认为它在做你想让它做什么):-)
如果您在要传递给 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] ...
我将一些 JS 与 ToneJS 库拼凑在一起来切换一些声音 on/off。
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()
函数将按预期启动和停止它。
但是,fmOsc2
和 fmOsc3
功能会在我切换开始时启动,但不会在我切换停止时终止。
作为参考,下面是 HTML 面的样子:<div class="trackPlay" id="play-stop-toggle" onclick="togglePlay()">PLAY</div>
如何让 fmOsc2
和 fmOsc3
函数与按钮状态切换?
音调 Transport 不应该以这种方式使用,无论是用于启动还是停止振荡器(当然,它可以 start/stop 振荡器,但我不认为它在做你想让它做什么):-)
如果您在要传递给 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] ...