Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/colxi/midi-parser-js
JSON Human readable MIDI sequences. Read from ArrayBuffers, Base64 encoded strings, or FileInput Element in Browsers.
https://github.com/colxi/midi-parser-js
javascript midi midi-javascript midi-js midi-parser midi-parser-js
Last synced: 13 days ago
JSON representation
JSON Human readable MIDI sequences. Read from ArrayBuffers, Base64 encoded strings, or FileInput Element in Browsers.
- Host: GitHub
- URL: https://github.com/colxi/midi-parser-js
- Owner: colxi
- License: gpl-3.0
- Created: 2016-09-21T18:46:43.000Z (about 8 years ago)
- Default Branch: master
- Last Pushed: 2023-08-12T11:28:44.000Z (about 1 year ago)
- Last Synced: 2024-10-02T13:17:57.862Z (about 1 month ago)
- Topics: javascript, midi, midi-javascript, midi-js, midi-parser, midi-parser-js
- Language: JavaScript
- Homepage:
- Size: 590 KB
- Stars: 224
- Watchers: 12
- Forks: 29
- Open Issues: 13
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
- awesome-javascript-audio - colxi/MidiParser - a binary MIDI file reader for browser/Node, converts a MIDI binary file to a JSON object (Libraries: Web MIDI API / Web MIDI API)
README
![logo](https://colxi.info/midi-parser-js/docs/logo.png)
# MidiParser.js
[![NoDependencies](https://img.shields.io/badge/dependencies-none-green.svg)](https://github.com/colxi/midi-parser-js)
[![Browser](https://img.shields.io/badge/browser-compatible-blue.svg)](https://github.com/colxi/midi-parser-js)
[![Node](https://img.shields.io/badge/node-compatible-brightgreen.svg)](https://www.npmjs.com/package/midi-parser-js)MidiParser is a Javascript **Binary MIDI file** reader for the browser and Node which converts a MIDI binary data structure to **a JSON object**, making it much easier to iterate over and interact with.
- Tiny and dependency free
- Browser & Node Compatible
- Supported data input :
- ```BASE64``` encoded Midi data
- ```UINT8``` arrayBuffer, obtained when reading or fetching a .mid binary.
- ```FileInput Element``` in the Browser
- Custom Midi Messages## Example
A simple example parsing a MIDI file in Node ...
```javascript
let midiParser = require('midi-parser-js');
let fs = require('fs')// read a .mid binary (as base64)
fs.readFile('./test.mid', 'base64', function (err,data) {
// Parse the obtainer base64 string ...
var midiArray = midiParser.parse(data);
// done!
console.log(midiArray);
});
```Example in Browser...
```htmlimport MidiParser from 'midi-parser-js'
// select the INPUT element that will handle
// the file selection.
let source = document.getElementById('filereader');
// provide the File source and a callback function
MidiParser.parse( source, function(obj){
console.log(obj);
});```
If you want to see it in action, you can test it [Here](https://colxi.info/midi-parser-js/test/test-es6-import.html)## Syntax:
```javascript
MidiParser.parse( input [, callback] );
```
**- input** : Accepts any of the supported Data Sources : `FileInputElement | uint8Array | base64String`**- callback** : Callback to be executed when data is parsed. Only required when input is a `FileInputElement`.
---
## Handle Custom messages ( sysEx, non-standard...)
By default, the library ignores the sysEx, and non-standard messages, simply converting their values to integers (when possible).
However you can provide a custom hook function to be executed when any non-standard message is found, and process it by your own, returning the resulting value.```javascript
MidiParser.customInterpreter = function( msgType, arrayBuffer, metaEventLength){ /* your code */ }
```**- msgType** : Hex value of the message type
**- arrayBuffer** : Dataview of the midi data. You have to extract your value/s from it, moving the pointer as needed.**- metaEventLength** : A length greater than 0 indicates a received message
> If you want the default action to be executed, return **false**
## Output JSON anatomy :
The returned JSON object contains all the attributes of the MIDI file (format type, time division, track count... ) as properties. The tracks and the MIDI events related to each track are container inside the `track` property.
![logo](https://colxi.info/midi-parser-js/docs/diagram.jpg)
The following JSON object represents a MIDI file with **3 tracks** and **4 events** in **Track 0**
```javascript
outputObject{
....formatType: 0|1|2, // Midi format type
....timeDivision: (int), // song tempo (bpm)
....tracks: (int), // total tracks count
....track: Array[
........[0]: Object{ // TRACK 1!
............event: Array[ // Midi events in track 1
................[0] : Object{ // EVENT 1
....................data: (string),
....................deltaTime: (int),
....................metaType: (int),
....................type: (int)
................},
................[1] : Object{...}, // EVENT 2
................[2] : Object{...}, // EVENT 3
................[3] : Object{...} // EVENT 4
............]
........},
........[1] : Object{...}, // TRACK 2
........[2] : Object{...} // TRACK 3
....]
}
```
If you want to read the data from **Event 2** of **Track 0** , you should use the following keypath :```javascript
outputObject.track[0].event[2].data;
```
---
## Distribution & Installation :The following distribution channels are available :
**- NPM** : Install using the following command :
```bash
$ npm install midi-parser-js -s
```**- GIT** : You can clone the repository :
```bash
$ git clone https://github.com/colxi/midi-parser-js.git
```**-ZIP** : Or download the package in a ZIP file from
> [GITHUB LATEST PACKAGE RELEASE PAGE](https://github.com/colxi/midi-parser-js/releases/latest)**-CDN** : Include the latest release of this library in your HTML head using the CDN :
> Warning : Not recommended for production enviroments!```html
```
## Importing
This package is shipped with support to Node CommonJS and ES6 Modules. Use the appropiate method accoordintg to your enviroment.```javascript
// ES6 Module Import :
import {MidiParser} from './midi-parser.js';// CommonJS Node Import :
let MidiParser = require('midi-parser-js');
```---
## Bonus : MIDI File Format Specifications :MIDI Binary Encoding Specifications in https://github.com/colxi/midi-parser-js/wiki/MIDI-File-Format-Specifications