Javascript 无法在“AudioNode”上执行“connect”`

Javascript 无法在“AudioNode”上执行“connect”`,javascript,tone.js,Javascript,Tone.js,我在HTML文件的头中有这个脚本。除了行delay.connect(Tone.context.destination)之外,它工作正常中途,理论上通过延迟启动其中一个来增加DuoSynth中声音的分层 当它没有被注释掉时,我在控制台中得到这个错误:uncaughttypeerror:未能在“AudioNode”上执行“connect”:没有找到与提供的签名匹配的函数。 我做错了什么 <script> function makeSynth() { let env

我在HTML文件的头中有这个脚本。除了行
delay.connect(Tone.context.destination)之外,它工作正常中途,理论上通过延迟启动其中一个来增加DuoSynth中声音的分层

当它没有被注释掉时,我在控制台中得到这个错误:
uncaughttypeerror:未能在“AudioNode”上执行“connect”:没有找到与提供的签名匹配的函数。

我做错了什么

<script>
      function makeSynth() {
      let envelope = {
          attack: 0.1,
          release: 4,
          releaseCurve: 'exponential'
      };
      let filterEnvelope = {
          baseFrequency: 440,
          octaves: 3,
          attack: 0,
          decay: 0,
          release: 1000
      };

      return new Tone.DuoSynth({
          harmonicity: .5, 
          detune : 5000,
          volume: -20,
          voice0: {
              oscillator: { type: 'triangle' },
              envelope,
              filterEnvelope
          },
          voice1: {
              oscillator: { type: 'sine' },
              envelope,
              filterEnvelope
          },
          vibratoRate: 0.5,
          vibratoAmount: 0.1 // THIS IS GOOD TO MANIPULATE
      });
  }

      let leftSynth = makeSynth();
      let rightSynth = makeSynth();
      let leftPanner = new Tone.Panner(-0.5).toMaster();
      let rightPanner = new Tone.Panner(0.5).toMaster();
      let echo = new Tone.FeedbackDelay('16n', 0.2);
      let delay = Tone.context.createDelay(6.0); // Borrow the AudioContext from Tone.js
      let delayFade = Tone.context.createGain();

      delay.delayTime.value = 6.0;
      delayFade.gain.value = 0.75;

      leftSynth.connect(leftPanner);
      rightSynth.connect(rightPanner);
      leftPanner.connect(echo);
      rightPanner.connect(echo);



      // var c = canvas.getContext('2d');

      echo.toMaster();
      echo.connect(delay);
      delay.connect(Tone.context.destination);
      delay.connect(delayFade);
      delayFade.connect(delay);

      new Tone.Loop(time => {
      leftSynth.triggerAttackRelease('C6', '1:2', time);

      leftSynth.setNote('G5', '+0:2');
      leftSynth.setNote('C4', '+0:4');

      leftSynth.triggerAttackRelease('G5', '0:2', '+6:0');

      leftSynth.triggerAttackRelease('E4', '0:2', '+11:2');

      leftSynth.triggerAttackRelease('E5', '2:0', '+19:0');
      leftSynth.setNote('G5', '+19:1:2');
      leftSynth.setNote('A5', '+19:3:0');
      leftSynth.setNote('G5', '+19:4:2');
  }, '34m').start();

  new Tone.Loop(time => {



      // Trigger D4 after 5 measures and hold for 1 full measure + two 1/4 notes
      rightSynth.triggerAttackRelease('G6', '1:2', '+5:0');
      // Switch to E4 after one more measure
      rightSynth.setNote('B6', '+6:0');

      // Trigger B3 after 11 measures + two 1/4 notes + two 1/16 notes. Hold for one measure
      rightSynth.triggerAttackRelease('D4', '1m', '+11:2:2');
      // Switch to G3 after a 1/2 note more
      rightSynth.setNote('G3', '+12:0:2');

      // Trigger G4 after 23 measures + two 1/4 notes. Hold for a half note.
      rightSynth.triggerAttackRelease('G4', '0:2', '+23:2');
  }, '37m').start();
</script>

函数makeSynth(){
让信封={
攻击:0.1,
发布日期:4,
释放曲线:“指数”
};
让过滤器显影={
基频:440,
八度音阶:3,
攻击:0,
衰减:0,
发行:1000
};
返回新音调。DuoSynth({
和谐度:.5,
失谐:5000,
卷:-20,
语音0:{
振荡器:{type:'triangle'},
信封,
过滤显影
},
声音1:{
振荡器:{type:'sine'},
信封,
过滤显影
},
振动频率:0.5,
可控安装:0.1//这很好操作
});
}
设leftSynth=makeSynth();
设rightsynh=makeSynth();
让leftPanner=new Tone.Panner(-0.5).toMaster();
设rightPanner=newtone.Panner(0.5.toMaster();
let echo=新音调。反馈延迟('16n',0.2);
let delay=Tone.context.createDelay(6.0);//借用Tone.js中的AudioContext
让delayFade=Tone.context.createGain();
delay.delayTime.value=6.0;
delayFade.gain.value=0.75;
leftSynth.connect(leftPanner);
rightSynth.connect(rightPanner);
leftPanner.connect(echo);
右窗格。连接(回声);
//var c=canvas.getContext('2d');
echo.toMaster();
连接(延迟);
延迟连接(音调、上下文、目的地);
延迟连接(延迟衰减);
delayFade.connect(延迟);
新音调循环(时间=>{
leftSynth.TriggeratackRelease('C6','1:2',时间);
leftSynth.setNote('G5','+0:2');
leftSynth.setNote('C4','+0:4');
leftSynth.TriggeratackRelease('G5','0:2','+6:0');
leftSynth.triggeratackrelease('E4','0:2','+11:2');
leftSynth.TriggeratackRelease('E5','2:0','+19:0');
leftSynth.setNote('G5','+19:1:2');
leftSynth.setNote('A5','+19:3:0');
leftSynth.setNote('G5','+19:4:2');
},34m')。开始();
新音调循环(时间=>{
//5次测量后触发D4,并保持1次完整测量+两次1/4音符
rightSynth.TriggeratackRelease('G6','1:2','+5:0');
//再测量一次后切换到E4
rightSynth.setNote('B6','+6:0');
//11次测量+两个1/4音符+两个1/16音符后触发B3。保持一次测量
rightSynth.TriggeratackRelease('D4','1m','+11:2:2');
//在1/2音符后切换到G3
rightSynth.setNote('G3','+12:0:2');
//在23次测量+两个1/4音符后触发G4。保持半音符。
rightSynth.TriggeratackRelease('G4','0:2','+23:2');
}.start();