首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更改Tone.Polysynth时出现的Tone.js问题

更改Tone.Polysynth时出现的Tone.js问题
EN

Stack Overflow用户
提问于 2021-03-12 04:48:44
回答 2查看 137关注 0票数 2

在Tone.js中,我创建了一个类,它创建了一个synth实例,其中在sequencer函数中调用.play(),从而播放声音。在下面的类中,当updateSynthType中的this.synth是单音Tone.Synth时,绝对没有问题,但是当它是Tone.Polysynth时,整个过程就会中断,并且在尝试调用updateSynthType时,我收到以下错误。

代码语言:javascript
复制
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类型?

下面是有问题的类:

代码语言:javascript
复制
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()
  }
}

感谢您的阅读。

EN

回答 2

Stack Overflow用户

发布于 2021-09-04 17:32:22

调用synth.releaseAll()而不是使用synth.dispose()

https://tonejs.github.io/docs/14.7.77/PolySynth#releaseAll说:

立即触发所有当前活动语音的释放部分。对于使synth静音很有用。

票数 0
EN

Stack Overflow用户

发布于 2022-02-08 15:32:50

我能够通过在处理之前清除上下文时间线来解决这个问题:

代码语言:javascript
复制
synth.context._timeouts.cancel(0);
synth.dispose();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66590335

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档