如何解析上传文件的MIDI内容?

时间:2019-06-05 14:57:49

标签: angular web-midi

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

0 个答案:

没有答案