TypeScript icon, indicating that this package has built-in type declarations

    2.0.1 • Public • Published

    ♬ 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


    npm install midi-writer-js

    Getting Started

    var MidiWriter = require('midi-writer-js');
    // Start with a new track
    var track = new MidiWriter.Track();
    // Define an instrument (optional):
    track.addEvent(new MidiWriter.ProgramChangeEvent({instrument: 1}));
    // Add some notes:
    var note = new MidiWriter.NoteEvent({pitch: ['C4', 'D4', 'E4'], duration: '4'});
    // Generate a data URI
    var write = new MidiWriter.Writer(track);



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


    The NoteEvent supports these options:

    Name Type 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 How long to wait before sounding note (rest). Takes same values as duration.
    sequential boolean If true then array of pitches will be played sequentially as opposed to simulatanously. Default: false
    velocity number How loud the note should sound, values 1-100. Default: 50
    repeat number How many times this event should be repeated. Default: 1
    channel number MIDI channel to use. Default: 1
    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.


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

    var MidiWriter = require('midi-writer-js');
    var track = new MidiWriter.Track();
    		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};
    var write = new MidiWriter.Writer(track);

    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
    var voice = create_4_4_voice().addTickables(notes);
    var vexWriter = new MidiWriter.VexFlow();
    var track = vexWriter.trackFromVoice(voice);
    var writer = new MidiWriter.Writer([track]);


    npm i midi-writer-js

    DownloadsWeekly Downloads






    Unpacked Size

    295 kB

    Total Files


    Last publish


    • grimmdude