【问题标题】:Convert midi to mp3 in node在节点中将midi转换为mp3
【发布时间】:2019-01-31 16:49:27
【问题描述】:

所以我在使用scribbletune的节点中开发了一个应用程序

要创建一个 MIDI 文件:

const clip = scribble.clip({
  notes: cMajor,
  pattern: 'xxxxxxx'
});

scribble.midi(clip, 'c-major.mid');

我希望能够在浏览器中播放此文件。 据我所知,无法使用音频标签在浏览器中播放 MIDI:

<audio controls>
  <source src="horse.ogg" type="audio/ogg">
</audio>

所以我想我应该首先将 midi 文件转换为 mp3 文件。我一直在网上搜索可以做到这一点但没有找到任何东西的节点包。

这听起来应该是可能的。

关于如何在节点中实现这一点的任何提示?

【问题讨论】:

    标签: node.js


    【解决方案1】:

    如果您只想在浏览器中播放生成的 MIDI 并首先将文件转换为 ogg 并使用音频标签播放它不是必需的,MidiConvertTone.js(如Scribbletune docs 中简要说明)可以完成这项工作。

    我整理了一个例子:

    const http = require("http");
    
    const MidiConvert = require("midiconvert"); // npm install midiconvert
    const scribble = require("scribbletune"); // npm install scribbletune
    
    const createMidiForToneJs = (notes, pattern) => {
      let clip = scribble.clip({
        notes,
        pattern
      });
    
      let midiData;
    
      // The callback is called synchronously (https://github.com/scribbletune/scribbletune/blob/ebda52d7a2835f28b3ddab15488c22bc1d425e7b/src/midi.js#L37)
      scribble.midi(
        clip,
        null, // setting filename to null will cause this method to return bytes (via the callback)
        (err, bytes) => {
          // err is always null
          midiData = bytes;
        }
      );
    
      return MidiConvert.parse(midiData);
    };
    
    const server = http.createServer((req, res) => {
      // Don't mind the naivety of the following URL router
      switch (req.url.toLowerCase()) {
        case "/":
          res.end(indexHTMLContents);
          break;
        case "/midi.json":
          res.statusCode = 200;
          res.setHeader("Content-Type", "application/json");
          const jsonString = JSON.stringify(createMidiForToneJs("CM", "xxxxxxx"));
          res.end(jsonString);
          break;
        default:
          res.statusCode = 404;
          res.end();
      }
    });
    
    server.listen(3000); // Open http://localhost:3000 in browser
    
    // -- The HTML and Javascript for the "/" route. Obviously, don't do this in production!
    
    const jsToBeExecutedInBrowser = () => {
      document.querySelector("button").addEventListener(
        "click",
        async () => {
          Tone.Transport.clear();
          Tone.Transport.stop();
    
          const synth = new Tone.Synth().toMaster();
    
          const response = await fetch("/midi.json");
          const midiJson = await response.json();
    
          const midi = MidiConvert.fromJSON(midiJson);
    
          Tone.Transport.bpm.value = midi.bpm;
          Tone.Transport.timeSignature = midi.timeSignature;
    
          midi.tracks.forEach(track => {
            new Tone.Part((time, event) => {
              synth.triggerAttackRelease(
                event.name,
                event.duration,
                time,
                event.velocity
              );
            }, track.notes).start(midi.startTime);
          });
    
          Tone.Transport.start();
        },
        false
      );
    };
    
    const indexHTMLContents = `<!DOCTYPE html>
    <html lang="en">
      <head>
        <meta charset="utf-8">
        <title>Midi Player</title>
      </head>
      <body>
      <button>Play!</button>
      <script src="https://unpkg.com/tone"></script>
      <script src="https://unpkg.com/midiconvert"></script>
      <script>
      (${jsToBeExecutedInBrowser.toString()})();
      </script>
      </body>
    </html>`;
    

    【讨论】:

    • 虽然这是解决他们特定问题的好方法......未来的人们会来到这里寻找 midi 到 mp3 节点的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多