Воспроизведение аккордов в Midi.js с использованием разобранного файла midi для асинхронного воспроизведения
Я пытаюсь в основном воспроизводить пианино миди-файлы асинхронно (когда нажата клавиша, я хочу продвигаться по нотам миди-файла, в основном, чтобы проигрывать ноты за нотой.
Мне удалось воспроизвести миди-файл таким образом, но проанализированный миди-файл выбрасывает ноты (приглушенные), я не знаю, из-за ли это отсутствующего инструмента или из-за того, что он не способен анализировать аккорды. Вот парсер MIDI, который я использую.
var parser = new MidiParser();
const fileReader = new FileReader();
var counter = 0;
var midiFileInput = document.getElementById('midiFileInput');
var parsedMidi;
const onLoadFile = (loadEvent) => {};
const file = fileReader.result;
const onMidiFileChange = (inputEvent) => {
fileReader.readAsArrayBuffer(inputEvent.target.files[0]);
}
midiFileInput.addEventListener('change', onMidiFileChange);
window.onload = function () {
MIDI.loadPlugin({
soundfontUrl: "./soundfont/",
instrument: "acoustic_grand_piano",
onprogress: function(state, progress) {
console.log(state, progress);
}
});
};
fileReader.onload = function (file) {
var uint8Midi = new Uint8Array(file.target.result);
parsedMidi = parser.parseUint8(uint8Midi);
console.log(parsedMidi.note)
// Use parsed midi
document.addEventListener("keypress", function(event) {
if (event.keyCode != 1) {
MIDI.setVolume(0, 127);
console.log(parsedMidi[counter].note, counter);
counter = counter +1;
var velocity = 127; // how hard the note hits
MIDI.setVolume(0, 127);
MIDI.noteOn(parsedMidi[counter].channel, parsedMidi[counter].note, parsedMidi[counter].velocity, parsedMidi[counter].delay);
MIDI.noteOff(parsedMidi[counter].channel, parsedMidi[counter].note, parsedMidi[counter].velocity, parsedMidi[counter].delay + 0.75);
}
})
return parsedMidi
}