Воспроизведение двух нот в tone.js одним нажатием кнопки
Я занимаюсь разработкой веб-игры, в которой нажатие на одну кнопку должно сыграть две ноты подряд. Я могу сделать это, используя загруженные аудиофайлы и callback-файл audio.onended.
function playMusic(){
audio.src = music_array[music_counter++];
audio.play();
audio.onended = function(){
playMusic();
};
}
Я могу использовать вышеуказанный блок кода для воспроизведения всей песни. Однако, используя этот подход, мне нужно было бы заранее загрузить все аудио файлы в html, и я не думаю, что это хороший подход. Итак, я искал tone.js с той же целью, но я не могу играть ноты одну за другой. Я попытался использовать для цикла, как это:
music = ["C4;4n", "D4;4n", ...... , "G5;8n"];
for(var i=0; i<range; i++){
parts = music[music_counter++].split(';');
synth.triggerAttackRelease(parts[0], parts[1]);
}
а также
for(var i=0; i<range; i++){
playNote();
}
playNote(){
parts = music[music_counter++].split(';');
synth.triggerAttackRelease(parts[0], parts[1]);
}
без удачи Я также изучил их документацию и другие сообщения от stackru. Я не смог найти решение. У кого-нибудь есть идеи, как этого добиться?
1 ответ
Решение
Я наконец-то понял, как это сделать.
var synth = new Tone.Synth().toMaster();
var music = [{"time": 0, "note": "A4", "duration": "16n"},
......
{"time": 23.5, "note": "A4", "duration": "8n"},
{"time": 24, "note": "G4", "duration": "4n"}];
function playMusic(){
var part = new Tone.Part(function(time, note){
//the notes given as the second element in the array
//will be passed in as the second argument
console.log(note);
synth.triggerAttackRelease(note.note, note.duration, time);
}, music).start(0);
Tone.Transport.start();
}