1

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

4

0 回答 0