Массивы / циклы с midi.js

Я собираюсь использовать функцию playsound в midi.js для зацикливания массива с выбранными аккордами, может быть, 4 diff. Но я не могу понять это. Я могу заставить его делать один массив, но не несколько, и он не зацикливается, а только воспроизводит количество времени, которое я установил (сейчас 8).

window.onload = function () {
MIDI.loadPlugin({
    soundfontUrl: "../MIDI.js/examples/soundfont/",
    instrument: "acoustic_grand_piano",
    onprogress: function(state, progress) {
        console.log(state, progress);
    },


    onsuccess: function () {
               for (var i = 0; i < 9; i++){

               playsound([37,59,61,71,80])}

}});

var delay =1;   
function playsound($chords)
{
        var velocity = 127;
        MIDI.setVolume(0, 127);
        MIDI.chordOn(0, $chords, velocity, delay);
        MIDI.chordOff(0, $chords, delay+1);
        delay += 1;

}

1 ответ

Ваш код должен работать, за исключением того, что для того, чтобы время работало предсказуемо, я обнаружил, что вам нужно немного подождать после вызова обратного вызова. Если вы звоните сразу после загрузки, ноты воспроизводятся нерегулярно и не по порядку.

Я рекомендую использовать такую ​​функцию, как playChords ниже и тестирование после загрузки, вызывая функцию нажатием кнопки. Например, эта функция воспроизводит три разных аккорда с интервалом в 1/2 секунды, всего 9 раз.

chords = [[37,59,61,71,80],[38,60,62,72,81],[39,61,63,73,82]];
function playChords() {
  for (var i = 0; i < 9; i++){
    playChord(i/2, chords[i%chords.length]);
  } 
}
function playChord(delay, chord) {
  MIDI.chordOn(0, chord, 127, delay);
  MIDI.chordOff(0, chord, delay+1);
}
Другие вопросы по тегам