LuaMidi ♫ is the pure Lua library to reading and writing MIDI files, with friendly API. As it provides MIDI data's total abstraction, it doesn't require the user to concern about technical stuff, such as delta time and NoteOn/NoteOff signals. Its methods are intuitive and its objects' data are completely human-readable.
You can check the docs at the wiki.
Please, publish an issue, if you find any.
This library doesn't have any dependencies.
To install LuaMidi, use LuaRocks:
$ luarocks install luamidi
Initially, it must import the main module:
local LuaMidi = require ('LuaMidi')
Once it's been done, all classes are available.
Here is an example of how to write the C Major Scale:
local LuaMidi = require ('LuaMidi')
local Track = LuaMidi.Track
local NoteEvent = LuaMidi.NoteEvent
local Writer = LuaMidi.Writer
-- Creates Track instance
local track = Track.new()
-- Table with notes as strings (must specify octave)
local notes = {'C3', 'D3', 'E3', 'F3', 'G3', 'A3', 'B3', 'C4'}
-- Adds notes to Track
track:add_events(NoteEvent.new({pitch = notes, sequential = true}))
-- Creates Writer passing Track
local writer = Writer.new(track)
-- Writes MIDI file called "C Major Scale.mid"
writer:save_MIDI('C Major Scale')
Even though the above example creates a working MIDI file, it's encouragable to add some metadata to MIDI files. A more complete version of this code can be found here: examples/c_major_scale.lua
This short script works over the basics of LuaMidi. Initially, it creates a Track
object. Then, it creates an array(notes
) with the notes as strings. After that, it adds this array to a new NoteEvent
, also passing true
as sequential
field to indicate the notes won't be played at the same time. Once the track is ready, it creates a Writer
object passing the track as parameter. With all tracks' data, the Writer
can produce a working MIDI file.
You can check the complete documentation at the wiki.
Stairway to Heaven (intro)
local LuaMidi = require ('LuaMidi')
local Track = LuaMidi.Track
local NoteEvent = LuaMidi.NoteEvent
local Writer = LuaMidi.Writer
local track = Track.new("Intro")
track:set_copyright("(C) Led Zeppelin")
track:set_instrument_name("Acoustic Guitar")
local function note(pitch, duration)
return NoteEvent.new({pitch = pitch, duration = tostring(duration)})
end
local A3 = note('A3')
local C4 = note('C4')
local E4 = note('E4')
local A4 = note('A4')
local Ab3_B4 = note({'G#3', 'B4'})
local B4 = note('B4')
local G3_C5 = note({'G3', 'C5'})
local C5 = note('C5')
local Gb3_Gb4 = note({'F#3', 'F#4'})
local D4 = note('D4')
local Gb4 = note('F#4')
local F3_E4 = note({'F3', 'E4'})
local long_C4 = note('C4', 2)
local Am = {'A2', 'E3', 'A3', 'C4'}
local chord_GB = note({'B2', 'D3', 'G3', 'B3'})
local chord_Am = note(Am)
local long_chord_Am = note(Am, 1)
track:add_events({
A3, C4, E4, A4, Ab3_B4, E4, C4, B4,
G3_C5, E4, C4, C5, Gb3_Gb4, D4, A3,
Gb4, F3_E4, C4, A3, long_C4, E4, C4, A3,
chord_GB, chord_Am, long_chord_Am
})
local writer = Writer.new(track)
writer:save_MIDI('stairway_to_heaven', 'midi files')
The produced MIDI file can be downloaded here: stairway_to_heaven.mid
- Create an issue and describe your contribution
- Fork it (https://github.com/PedroAlvesV/LuaMidi/fork)
- Create a new branch for your contribution (
git checkout -b my-contribution
) - Commit your changes (
git commit -am 'New feature added'
) - Publish the branch (
git push origin my-contribution
) - Create a Pull Request
- Done ✅
- Lua library written by Pedro Alves
- Inspired by ♬ MidiWriterJS, by Garrett Grimm