Giter Club home page Giter Club logo

midiwriterjs's Introduction

♬ MidiWriterJS

npm version Build Status Try midi-writer-js on RunKit

MidiWriterJS is a JavaScript library providing an API for generating expressive multi-track MIDI files.

Note that the master branch is in active development so if you're looking for a tried and true stable version please use the latest release.

Source Documentation

Install

npm install midi-writer-js

Getting Started

import MidiWriter from 'midi-writer-js';

// Start with a new track
const track = new MidiWriter.Track();

// Define an instrument (optional):
track.addEvent(new MidiWriter.ProgramChangeEvent({instrument: 1}));

// Add some notes:
const note = new MidiWriter.NoteEvent({pitch: ['C4', 'D4', 'E4'], duration: '4'});
track.addEvent(note);

// Generate a data URI
const write = new MidiWriter.Writer(track);
console.log(write.dataUri());

Documentation

MidiWriter.Track()

  • addEvent({event}, mapFunction)
  • setTempo(tempo)
  • addText(text)
  • addCopyright(text)
  • addTrackName(text)
  • addInstrumentName(text)
  • addMarker(text)
  • addCuePoint(text)
  • addLyric(text)
  • setTimeSignature(numerator, denominator)

MidiWriter.NoteEvent({options})

The NoteEvent supports these options:

Name Type Default Description
pitch string or array Each pitch can be a string or valid MIDI note code. Format for string is C#4. Pro tip: You can use the output from tonal functions to build scales, chords, intervals, etc. in this parameter.
duration string or array How long the note should sound.
  • 1 : whole
  • 2 : half
  • d2 : dotted half
  • dd2 : double dotted half
  • 4 : quarter
  • 4t : quarter triplet
  • d4 : dotted quarter
  • dd4 : double dotted quarter
  • 8 : eighth
  • 8t : eighth triplet
  • d8 : dotted eighth
  • dd8 : double dotted eighth
  • 16 : sixteenth
  • 16t : sixteenth triplet
  • 32 : thirty-second
  • 64 : sixty-fourth
  • Tn : where n is an explicit number of ticks (T128 = 1 beat)
If an array of durations is passed then the sum of the durations will be used.
wait string or array 0 How long to wait before sounding note (rest). Takes same values as duration.
sequential boolean false If true then array of pitches will be played sequentially as opposed to simulatanously.
velocity number 50 How loud the note should sound, values 1-100.
repeat number 1 How many times this event should be repeated.
channel number 1 MIDI channel to use.
grace string or array Grace note to be applied to note event. Takes same value format as pitch
startTick number Specific tick where this event should be played. If this parameter is supplied then wait is disregarded if also supplied.

MidiWriter.Writer(tracks)

The Writer class provides a few ways to output the file:

  • buildFile() Uint8Array
  • base64() string
  • dataUri() string
  • stdout() file stream (cli)

Hot Cross Buns

Here's an example of how everyone's favorite song "Hot Cross Buns" could be written. Note use of the mapping function passed as the second argument of addEvent(). This can be used to apply specific properties to all events. With some street smarts you could also use it for programmatic crescendos and other property 'animation'.

import MidiWriter from 'midi-writer-js';

const track = new MidiWriter.Track();

track.addEvent([
		new MidiWriter.NoteEvent({pitch: ['E4','D4'], duration: '4'}),
		new MidiWriter.NoteEvent({pitch: ['C4'], duration: '2'}),
		new MidiWriter.NoteEvent({pitch: ['E4','D4'], duration: '4'}),
		new MidiWriter.NoteEvent({pitch: ['C4'], duration: '2'}),
		new MidiWriter.NoteEvent({pitch: ['C4', 'C4', 'C4', 'C4', 'D4', 'D4', 'D4', 'D4'], duration: '8'}),
		new MidiWriter.NoteEvent({pitch: ['E4','D4'], duration: '4'}),
		new MidiWriter.NoteEvent({pitch: ['C4'], duration: '2'})
	], function(event, index) {
    return {sequential: true};
  }
);

const write = new MidiWriter.Writer(track);
console.log(write.dataUri());

VexFlow Integration

MidiWriterJS can export MIDI from VexFlow voices, though this feature is still experimental. Current usage is to use MidiWriter.VexFlow.trackFromVoice(voice) to create a MidiWriterJS Track object:

// ...VexFlow code defining notes
const voice = create_4_4_voice().addTickables(notes);

const vexWriter = new MidiWriter.VexFlow();
const track = vexWriter.trackFromVoice(voice);
const writer = new MidiWriter.Writer([track]);
console.log(writer.dataUri());

Demos

midiwriterjs's People

Contributors

anthochamb avatar astitzer avatar benbelow avatar gciluffo avatar grimmdude avatar hexadecimal233 avatar jazz-soft avatar jduhls avatar kjin avatar klugjo avatar lplume avatar niieani avatar scraggo avatar undergroundlabs avatar zimatecholi avatar zxol avatar

Watchers

 avatar

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.