在Tone.js中,我创建了一个类,它创建了一个synth实例,其中在sequencer函数中调用.play(),从而播放声音。在下面的类中,当updateSynthType中的this.synth是单音Tone.Synth时,绝对没有问题,但是当它是Tone.Polysynth时,整个过程就会中断,并且在尝试调用updateSynthType时,我收到以下错误。
Uncaught Error: Synth was already disposed
at ti (Tone.js:1)
at ra._scheduleEvent (Tone.js:21)
at Object.callback (Tone.js:21)
at Gi._timeoutLoop (Tone.js:21)
at Gi.emit (Tone.js:7)我不明白为什么在常规的Tone.Synth中从来不会发生这种情况,但是当我尝试更改Tone.PolySynth时,会出现一个错误。我正在尝试更新设置,以便在多重合成器的类型(例如Synth, AMSynth, MetalSyth等)之间进行更改。我如何才能阻止这个问题?为什么这个类只适用于普通的Tone.Synth?有没有更好的方法来更新这个类中的PolySynth类型?
下面是有问题的类:
class PolyInstrument {
constructor(){
this.synth = null
this.gain = new Tone.Gain()
this.gain.toDestination()
}
play(note = null, beat, time = null){
if (this.synth){
if (note === null){
time ? this.synth.triggerAttackRelease(beat, time) : this.synth.triggerAttackRelease(beat)
} else {
time ? this.synth.triggerAttackRelease(note, beat, time) : this.synth.triggerAttackRelease(note, beat)
}
} else {
alert('error: no synth')
}
}
get defaultSettings(){
return {
Synth: {
oscillator: {
type: 'triangle'
},
envelope: {
attack: 0.005,
decay: 0.1,
sustain: 0.3,
release: 1
}
},
AMSynth: {
harmonicity: 3 ,
detune: 0 ,
oscillator: {
type: 'sine'
},
envelope: {
attack: 0.01 ,
decay: 0.01 ,
sustain: 1 ,
release: 0.5
},
modulation: {
type: 'square'
},
modulationEnvelope: {
attack: 0.5 ,
decay: 0 ,
sustain: 1 ,
release: 0.5
}
}
}
}
updateSynthType(synthType){
if (this.synth){
this.synth.disconnect(this.gain)
this.synth.dispose()
}
let settings = this.defaultSettings[synthType] || {}
this.synth = new Tone.PolySynth(Tone[synthType], settings)
this.synth.connect(this.gain)
this.play()
}
}感谢您的阅读。
发布于 2021-09-04 17:32:22
调用synth.releaseAll()而不是使用synth.dispose()。
https://tonejs.github.io/docs/14.7.77/PolySynth#releaseAll说:
立即触发所有当前活动语音的释放部分。对于使synth静音很有用。
发布于 2022-02-08 15:32:50
我能够通过在处理之前清除上下文时间线来解决这个问题:
synth.context._timeouts.cancel(0);
synth.dispose();https://stackoverflow.com/questions/66590335
复制相似问题