███╗ ███╗██╗ ██╗ ███████╗██╗ ██╗
████╗ ████║██║ ██║ ██╔════╝██║ ██║
██╔████╔██║██║ ██║ ███████╗███████║
██║╚██╔╝██║██║ ██║ ╚════██║██╔══██║
██║ ╚═╝ ██║╚██████╔╝██╗███████║██║ ██║
╚═╝ ╚═╝ ╚═════╝ ╚═╝╚══════╝╚═╝ ╚═╝
mush is a terminal synthesizer, drum machine, looper, and MIDI playground for the command line.
It combines playable synth voices, a step sequencer, live effects, recording tools, and terminal visuals in a fast keyboard-driven interface.
git clone git@github.com:sedoy26/mush.git && cd mush && chmod +x mu.sh && ./mu.sh- primary support target: macOS terminal environments
- likely portable to Linux with working PortAudio and terminal support
- Windows support is unverified
- audio input selection is stored for future use, but live input is not yet processed by the synth engine
python3- a working terminal with
cursessupport - PortAudio-compatible audio output for
sounddevice ffmpegif you want to use camera visuals- optional MIDI dependencies handled by the bootstrap script
- dual-oscillator synth with waveform, level, octave, and detune control
- realtime audio output with delay, warmth, air, reverb, filter, and limiting
- 6-voice, 32-step drum sequencer with multiple drum sound banks
- audio looper with record, overdub, undo, play, and clear
- global stereo WAV recording
- oscilloscope and camera-based visual modes
- MIDI device input, note remapping, and learnable pad/knob bindings
- audio output selection and stored audio input preference for future use
- project save/load for synth, drum, UI, audio, and MIDI settings
mu.sh— launcher and embedded app source of truthwav/— saved mix recordings such asmush.wavprojects/— saved project files using the.mushextensionREADME.md— project overview and usage notes
Generated files in wav/ and projects/ are gitignored by default, except for wav/demo.wav and projects/demo.mush.
./mu.shOn first launch, the script creates:
$HOME/.mush-venvfor Python dependencies$HOME/.mush.pyfor the generated runtime script
The app expects a working terminal and an available audio output device. Camera mode also expects ffmpeg with camera capture support.
On a first run after cloning:
- start with
./mu.sh - press
Hto toggle the help overlay - press
TABto switch between synth and drum focus - press
Sto open settings - load
projects/demo.mushfrom thePROJECTsettings tab if you want a ready-made example
If you load the demo project on another machine, mush uses that machine's current default OS audio output by default.
TAB— switch between synth focus and drum focusS— open settingsH— show helpq— quit
a w s e d f t g y h u j k— play notesSPACE— release held note1/2— select oscillatorz/x— change selected oscillator waveform↑/↓— master volume←/→— root note[/]— attack{/}— releasem— gate/free modep— filter on/off-/=— cutoff_/+— resonancel— LFO waveo— LFO target,/.— LFO rate;/'— LFO depthD/F— driveJ/K— delay mixN/M— delay feedbackV/B— delay time
R— record loop (replace)T— overdub loopY— undo last overdub layerP— toggle loop playbackU— clear loopG— start/stop global WAV recording
TABinto drum focus first←/→/↑/↓— move sequencer cursorSPACE— toggle current stepr— start/stop sequencerc— clear current row with confirmationX— clear all rows with confirmation1/2— load built-in patterns,/./</>— BPM adjustments-/=— selected drum voice level
The settings UI currently includes:
MAIN— synth, visuals, drum bank, oscillator, and FX settingsCAM FX— camera visual style and reactivityPROJECT— save/load.mushproject filesSOUND DEVICE— audio output selection and stored input preferenceMIDI DEVICE— MIDI input selection and routingMIDI NOTE— note remappingMIDI MAP— learnable pad/knob bindings
Project files store the current working setup, including:
- synth parameters and oscillator settings
- drum pattern, BPM, bank, and per-voice levels
- UI visual settings
- selected audio input/output names or the portable OS-default audio tokens
- MIDI device settings, remaps, and bindings
They do not currently store recorded loop audio.
mu.shcontains the launcher and the embedded Python applicationwav/holds exported mix recordings; onlywav/demo.wavis trackedprojects/holds saved.mushprojects; onlyprojects/demo.mushis tracked- community and repository health files live in
.github/,CONTRIBUTING.md,SECURITY.md, andLICENSE
- the looper is intentionally simple and not tempo-quantized
- current playback is effectively one note lane with layered oscillators, not a full multitimbral performance engine
- audio device hot-swapping is basic and intended for local use rather than pro-audio routing edge cases
- camera mode depends on local
ffmpegsupport and device permissions - the app is still maintained as an embedded-Python single-file launcher for convenience
Contributions are welcome. Please read CONTRIBUTING.md before opening a pull request.
For security-sensitive issues, use SECURITY.md rather than filing a public issue.
This project is released under the MIT License. See LICENSE.
When editing mu.sh, useful checks are:
bash -n mu.sh
python3 - <<'PY'
from pathlib import Path
text = Path('mu.sh').read_text()
start = text.index("<< 'PYEOF'\n") + len("<< 'PYEOF'\n")
end = text.index("\nPYEOF", start)
compile(text[start:end], 'embedded_app.py', 'exec')
print('ok')
PY- audio input selection is saved for future expansion, but the current app does not process live input yet
- the looper is free-running and not tempo-quantized
- the whole app currently lives inside the
mu.shheredoc for convenience
