我正在从浏览器加载一个文件,我可以看到它的内容以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
然后构造函数工作正常。