MidiSynth

Play music in Elixir.

Trying it out

First, clone the project:

git clone https://github.com/fhunleth/midi_synth.git

Next, install FluidSynth and a SoundFont file that supports General MIDI instruments. I recommend starting with FluidR3_GM.sf2 which has a complete set of instruments and is Creative Commons-licensed.

On Linux:

sudo apt install libfluidsynth-dev fluid-soundfont-gm
# The SoundFont file will be in /usr/share/sounds/sf2/FluidR3_GM.sf2. MidiSynth
# will find it.

On OSX:

brew install fluidsynth

# Install FluidR3_GM.sf2 to the priv directory in midi_synth. (I'd like to
# improve this, but this will work for trying midi_synth out)
cd midi_synth
mkdir priv
cd priv
curl -LO https://github.com/fhunleth/midi_synth/releases/download/v0.1.0/FluidR3_GM.sf2

Next, build the project the normal Elixir way:

cd midi_synth
mix deps.get
mix test

FYI: Copying the soundfont file to priv or using Debian's install location isn't the only option. You can also specify its path in your config.exs (see config/config.exs in this project) or let midi_synth guess its location.

Try it out using IEx

Start IEx by running iex -S mix from a shell prompt.

Now try playing a note. Notes are numbered sequentially. Middle C is note 60. Here's how to play middle C for 100 ms.

iex> MidiSynth.play(60, 100)

You can play the same note with a different velocity. The velocities range from 1 to 127. Here's how to play middle C for 100 ms with velocity mezzo-forte: 80.

iex> MidiSynth.play(60, 100, 80)

If you don't like the piano, try switching the instrument to something else. For example, trumpets (General MIDI instrument 57) are nice:

iex> MidiSynth.change_program(57)
iex> MidiSynth.play(60, 500)

The real value of this library is the port process that interfaces with the FluidSynth library. The Elixir code barely scratches the surface of what's possible. If you're comfortable with raw MIDI commands, try this out:

iex> MidiSynth.midi(<<0x90, 60, 127>>)
iex> MidiSynth.midi(<<0x80, 60, 127>>)

License

The Elixir and C code is covered by the Apache 2 License.