Я загружаю файл из браузера и вижу, что его содержимое начинается с MThd
, за которым следует множество искаженных нечитаемых символов.
Теперь это файл MIDI .mid
, и яЯ хотел бы проанализировать его с библиотекой Tonejs / midi .
Таким образом, я закодировал следующий метод обслуживания:
import * as ToneMidi from '@tonejs/midi';
public parseRawMidi(rawMidiData: ArrayBuffer): Soundtrack {
const midi = new ToneMidi.Midi(rawMidiData);
}
Но он выдает мне ошибку: ypeError: _tonejs_midi__WEBPACK_IMPORTED_MODULE_2__.Midi is not a constructor
Я считаю, что это объясняется тем, что аргумент rawMidiData
не соответствует ожидаемому типу конструктора.
Действительно, файл Midi.d.ts
показывает:
constructor(midiArray?: (ArrayLike<number> | ArrayBuffer));
Вот мой загрузчик файлов:
public onUpload(fileList: FileList): void {
const file = fileList[0];
const fileReader: FileReader = new FileReader();
fileReader.onloadend = (event: Event) => {
this.rawMidi = fileReader.result as ArrayBuffer;
// var array = new Uint8Array(new ArrayBuffer(rawLength));
const soundtrack: Soundtrack = this.midiService.parseRawMidi(this.rawMidi);
};
fileReader.readAsText(file);
}
ОБНОВЛЕНИЕ: Небольшой эксперимент.Я добавил следующий исходный код:
const buffer = new ArrayBuffer(16);
console.log('Before the call to the constructor');
const midi = new ToneMidi.Midi(buffer);
console.log('and after');
Был отображен первый регистратор, но не второй, и появилась та же ошибка.
ОБНОВЛЕНИЕ: Я использовал неправильный считыватель readAsText
и при переключении на readAsArrayBuffer
, как в fileReader.readAsArrayBuffer(file);
, я мог получить буфер массива, переданный методу сервиса.Но у меня все еще остается та же проблема, связанная с нерешением вызова конструктора: Midi is not a constructor
ОБНОВЛЕНИЕ: После того, как проблема GitHub была решена, я мог бы обновить ее до @tonejs/midi@2.0.5
с помощью npm install @tonejs/midi
команда и конструктор тогда работали нормально.