MidiConvert из base64 в кодировке midi - PullRequest
0 голосов
/ 16 декабря 2018

Можно ли использовать превосходный MidiConvert с миди-данными, закодированными в base64?

Мои данные выглядят так:

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

Я хотел бы сделать этов браузере.

1 Ответ

0 голосов
/ 16 декабря 2018

Я смог заставить его работать со следующим подходом, преобразовав данные, закодированные в base64, в Blob так, чтобы их можно было прочитать с помощью FileReader, что позволило использовать их с MidiConvert.parse:

( живой пример )

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,
  ...
...