Как мне воспроизвести несколько нот одну за другой в Tone.js

#javascript #tone.js

#язык JavaScript #tone.js

Вопрос:

Я придумал это решение:

 for(var i=0; i lt; max; i  ){    var note=arrays[i].pitch;  var time=arrays[i].timing;   if(i===0){synth.triggerAttackRelease(note,time,0)}  if(i===1){synth.triggerAttackRelease(note,time,arrays[0].timing)}  if(i===2){synth.triggerAttackRelease(note,time,arrays[1].timing arrays[0].timing)}  if(i===3){synth.triggerAttackRelease(note,time,arrays[2].timing arrays[1].timing arrays[0].timing)}  if(i===4){synth.triggerAttackRelease(note,time,arrays[3].timing arrays[2].timing arrays[1].timing arrays[0].timing)}  if(i===5){synth.triggerAttackRelease(note,time,arrays[4].timing arrays[3].timing arrays[2].timing arrays[1].timing arrays[0].timing)}  if(i===6){synth.triggerAttackRelease(note,time,arrays[5].timing arrays[4].timing arrays[3].timing arrays[2].timing arrays[1].timing arrays[0].timing)}  if(i===7){synth.triggerAttackRelease(note,time,arrays[6].timing arrays[5].timing arrays[4].timing arrays[3].timing arrays[2].timing arrays[1].timing arrays[0].timing)} }  

Но это слишком большой код, и он может воспроизводить только 7 нот или около того;

Есть ли для этого простой ярлык всего в нескольких строках?

Ответ №1:

Если вы можете объявить заметки и их длины в массиве (похоже, вы это делаете). Затем вы можете просто перебирать ноты и воспроизводить их, накапливая временную задержку, чтобы рассчитать правильную задержку для каждой ноты с начальной точки.

напр.

 const synth = new Tone.Synth().toDestination();  const notes = [  { pitch: "C4", timing: 0 },  { pitch: "D4", timing: 1 },  { pitch: "E4", timing: 1 },  { pitch: "F4", timing: 1 },  { pitch: "G4", timing: 1 } ];  function play() {  let delay = Tone.now();  for(let i = 0; i lt; notes.length; i  ) {  delay  = notes[i].timing;  synth.triggerAttackRelease(notes[i].pitch, '8n', delay);   } }  play() // call this when someone interacts with your program.