lib | ||
test | ||
.formatter.exs | ||
.gitignore | ||
LICENSE | ||
mix.exs | ||
mix.lock | ||
README.md |
MIDIPlayer
A MIDI player for Elixir.
Prerequisites
Install FluidSynth to play MIDI commands:
On Linux:
sudo apt install libfluidsynth-dev
On OSX:
brew install fluidsynth
Clone this repo or put the Hex dependency in your mix.exs:
{:midi_player, "~> 0.2.0"}
Examples
MIDIPlayer takes "events" which for example represent to play a note for a time span. It then converts these events to MIDI commands and schedules them.
First, let's create some events. This plays a piano sound for the C note for 1 second:
iex> piano = MIDIPlayer.Event.note(0, 60, 0, 1000, 127)
We can change the instrument to a violin after one second like so:
iex> change = MIDIPlayer.Event.change_program(0, 1000, 41)
(Note that it could be simpler to use another MIDI channel for another instrument.)
Finally, play two notes on the violin at the same time:
iex> violin1 = MIDIPlayer.Event.note(0, 67, 1000, 3000, 127)
iex> violin2 = MIDIPlayer.Event.note(0, 64, 1000, 3000, 127)
Now we are ready to play these events. First start the player like so:
iex> {:ok, player} = MIDIPlayer.start_link()
Then load the events, and play them!
iex> MIDIPlayer.generate_schedule(player, [piano, change, violin1, violin2], 3000)
iex> MIDIPlayer.play(player)
Thanks
This project uses MIDISynth for generating MIDI commands and operating the FluidSynth synthesizer. It also uses Timex for timing related functionality. Inspiration from Beats.