微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Tone.js 更改 Tone.Polysynth 的问题

如何解决Tone.js 更改 Tone.Polysynth 的问题

在 Tone.js 中,我创建了一个创建合成器实例的类,其中 .play() 在音序器函数中被调用,从而播放声音。在下面的课程中,当 this.synth 中的 updateSynthType 是单音 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 时会出现错误。我正在尝试更新设置以在 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,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,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()
  }
}

感谢阅读。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。