我正在从浏览器加载文件,我可以看到它的内容以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 issue之后,我可以使用@tonejs/midi@2.0.5
命令升级到npm install @tonejs/midi
,然后构造函数就可以正常工作了。