Appearance
Playback
Loom's CLI and Studio do not include a synthesizer. They send MIDI events to an output port, and another app turns those MIDI events into sound.
Playground is different: it uses a small GM-lite browser preview built on WebAudio samples. That preview is useful for quick browser feedback, but it is not a complete General MIDI sound source. Use MIDI playback or MIDI export when you need accurate playback through your own synth.
The recommended local setup is FluidSynth with a General MIDI SoundFont.
FluidSynth with Nix
If you already have a SoundFont installed, start FluidSynth like this:
bash
nix run nixpkgs#fluidsynth -- -a coreaudio -m coremidi ~/Library/Audio/Sounds/Banks/FluidR3_GM.sf2For debugging, add -v to print incoming MIDI events:
bash
nix run nixpkgs#fluidsynth -- -a coreaudio -m coremidi -v ~/Library/Audio/Sounds/Banks/FluidR3_GM.sf2nix run nixpkgs#fluidsynth already launches the fluidsynth binary. Do not repeat fluidsynth after --.
FluidSynth with Homebrew
Install FluidSynth:
bash
brew install fluid-synthThen start it with the same Core Audio and Core MIDI drivers:
bash
fluidsynth -a coreaudio -m coremidi ~/Library/Audio/Sounds/Banks/FluidR3_GM.sf2For debugging:
bash
fluidsynth -a coreaudio -m coremidi -v ~/Library/Audio/Sounds/Banks/FluidR3_GM.sf2Adjust the SoundFont path if your .sf2 file is somewhere else.
Play from Loom
In another terminal, list MIDI output ports:
bash
loom portsPick the FluidSynth port index, then play or live-code:
bash
loom play examples/starter/melody-simple.loom --port 0
loom live examples/starter/melody-simple.loom --port 0If the FluidSynth port is not listed, restart FluidSynth and run loom ports again.
MIDI Monitor
If sound does not play, use MIDI Monitor to check whether Loom is sending MIDI events. It is useful for verifying note, channel, control change, and program change messages before debugging the synth or audio output.