代码之家  ›  专栏  ›  技术社区  ›  Hoff

从base64编码的MIDI进行MIDI转换

  •  2
  • Hoff  · 技术社区  · 7 年前

    有没有可能使用 MidiConvert 使用base64编码的MIDI数据?

    我的数据如下:

    data:audio/midi;base64,TVRoZAAAAAYAAQAOAeBNVHJrAAAALwD/Awl...
    

    我想在浏览器中执行此操作。

    1 回复  |  直到 7 年前
        1
  •  2
  •   cody    7 年前

    我可以让它使用以下方法,将base64编码的数据转换为 Blob 这样就可以用 FileReader ,使其能够与 MidiConvert.parse 以下内容:

    ( live example )

    dataURItoBlob = dataURI => {
      const byteString = atob(dataURI.split(',')[1]);
      const mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0];
    
      let ab = new ArrayBuffer(byteString.length);
      let ia = new Uint8Array(ab);
      for (let i = 0; i < byteString.length; i++) {
        ia[i] = byteString.charCodeAt(i);
      }
    
      return new Blob([ab], {type: mimeString});
    };
    
    parseMidiFromDataURI = dataURI => {
      const reader = new FileReader();
      reader.onload = e => {
        const partsData = MidiConvert.parse(e.target.result);
        console.log(JSON.stringify(partsData, undefined, 2));
      };
      reader.readAsArrayBuffer(dataURItoBlob(dataURI));
    };
    
    parseMidiFromDataURI("data:audio/midi;base64,TVRoZAAAAAYAAAABAeBNVHJrAAAA5wD/WAQEAhgIAP9RAwehIADAAADAAGWQXH8AwABlgFx/AMAAZZBZfwDAAGWAWX8AwABlkFZ/AMAAZYBWfwDAAGWQQ38AkEF/AJBCfwCQQH8AkD9/AMlPAJlPfwDAAACQU38AwABlgEN/AMAAZYBCfwDAAGWAP38AwABlgFN/AMAAZZBDfwDJTwCZT38AwAAAkFB/AMAAZYBBfwDAAGWJT38AwABliQB/AMAAZcAAZYBAfwDAAGWAUH8AwABlkE1/AMAAZYBDfwDAAGXAAGWATX8AwABlwABlwABlwABlwABlkDh/AP8vAA==");
    

    输出:

    {
      "header": {
        "PPQ": 480,
        "timeSignature": [
          4,
          4
        ],
        "bpm": 120,
        "name": ""
      },
      "startTime": 0.10520833333333333,
      "duration": 2.8406249999999984,
      ...
    
    推荐文章