GithubHelp home page GithubHelp logo

patrickroberts / synth-js Goto Github PK

View Code? Open in Web Editor NEW
36.0 5.0 6.0 92 KB

JavaScript MIDI-to-WAV synthesizer

License: MIT License

JavaScript 100.00%
javascript midi-parser wav-files command-line-tool node-module

synth-js's Introduction

synth-js

Command-line utility and Node module for generating raw audio data from MIDI files.

Installation

Command-line utility:

$ npm link synth-js

Node module:

$ npm install --save synth-js

JavaScript:

<script src="synth.min.js"></script>

After including the file from dst/synth.min.js, the global variable synth will be initialized.

Usage

Command-line utility:

# assuming song.mid in cwd
$ synth -i song
# now song.wav contains raw audio data for song.mid

Node module:

const synth = require('synth-js');
const fs = require('fs');

let midBuffer = fs.readFileSync('song.mid');
// convert midi buffer to wav buffer
let wavBuffer = synth.midiToWav(midiBuffer).toBuffer();

fs.writeFileSync('song.wav', wavBuffer, {encoding: 'binary'});

JavaScript:

<style>
  #wav:after {
    content: " " attr(download);
  }

  #wav:not([href]) {
    display: none;
  }
</style>
<input type="file" id="midi" accept="audio/midi">
<a id="wav">Download</a>
<script>
  var audio;
  var input = document.getElementById('midi');
  var anchor = document.getElementById('wav');

  input.addEventListener('change', function change() {
    // clean up previous song, if any
    if (anchor.hasAttribute('href')) {
      URL.revokeObjectURL(anchor.href);
      anchor.removeAttribute('href');

      if (audio && !audio.paused) {
        audio.pause();
      }
    }

    // check if file exists
    if (input.files.length > 0) {
      var reader = new FileReader();
      var midName = input.files[0].name;
      // replace file extension with .wav
      var wavName = midName.replace(/\..+?$/, '.wav');

      // set callback for array buffer
      reader.addEventListener('load', function load(event) {
        // convert midi arraybuffer to wav blob
        var wav = synth.midiToWav(event.target.result).toBlob();
        // create a temporary URL to the wav file
        var src = URL.createObjectURL(wav);

        audio = new Audio(src);
        audio.play();

        anchor.setAttribute('href', src);
      });

      // read the file as an array buffer
      reader.readAsArrayBuffer(input.files[0]);

      // set the name of the wav file
      anchor.setAttribute('download', wavName);
    }
  });
</script>

See the demo here.

FAQ

Where can I find documentation?

Currently, documentation only exists for the command-line utility. To access it, use man:

$ man synth

For Node or JavaScript, refer to the src/ directory for accessible APIs:

  • synth.WAV()
  • synth.MIDIStream()
  • synth.midiToWav()

License

Available under the MIT License

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    ๐Ÿ–– Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. ๐Ÿ“Š๐Ÿ“ˆ๐ŸŽ‰

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google โค๏ธ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.