l00sed/termixer

A 2-deck mixer, sample pads, sequencer— all from any Unix terminal.

Rust

236

27 commits

updated Aug 14, 2026

See the code

README

termixer

A terminal-based DJ mixer for live performance with TidalCycles. Built in Rust with ratatui, it provides real-time EQ, filtering, crossfading, and sample pads for mixing audio from MPV and SuperCollider.

screenshot.gif

Features

Dual-deck mixerA-B channel faders, pan, 3-band EQ, LPF/HPF
Crossfadermix different decks, cue-in Deck C with unique output (headphone/booth)
Microphone inputselectable device, gain, and mute toggle
Sample pads4x4 grid with sequencer, save/load configs
Recordingcapture decks, master, mic, synth, or pads to MP3/WAV/FLAC/OGG
Synthsplay out a sample across the keys, or use the default sine synth
SuperCollider integrationcustom SynthDefs for processing SuperCollider output
Vim navigationhjkl throughout, multi-modal nav system

Prerequisites

Rustcargo package manager and Rust language compiler
Nerd Fontsrequired for icons (rewind, fast-forward, etc.)
MPVmedia playback with IPC socket support
FFmpegrecording encoder for MP3/WAV/FLAC/OGG
SuperCollider (optional)for TidalCycles integration

Installation

From crates.io

cargo install termixer

From GitHub release archive

This will take the latest release binary and install it to ~/.cargo/bin/termixer (same as cargo).

curl -sL https://raw.githubusercontent.com/l00sed/termixer/master/install.sh | bash

From source

git clone https://github.com/l00sed/termixer.git
cd termixer
cargo install --path .

Build

cargo build              # debug
cargo build --release    # optimized with LTO

Usage

# Auto-discover audio sources
cargo run

# Specify MPV sources explicitly
cargo run -- -s "Deck A" /tmp/mpv-a.sock -s "Deck B" /tmp/mpv-b.sock

# With music and samples directories
cargo run -- -m ~/Music -S ~/Samples

Starting MPV with IPC

mpv --input-ipc-server=/tmp/mpv-music.sock music.mp3

There's also an mpv wrapper script included that you can use to automatically enable the necessary flags just by setting the TM environment variable:

TM=1 mpv music.mp3

Termixer should automatically install this wrapper script to ~/.local/bin/mpv. When TM=1, it will add the socket and pcm flags. Without it, mpv runs normally.

To manage your own mpv config and disable automatic seeding of ~/.config/mpv/scripts/ and ~/.config/mpv/mpv.conf, use export TM_NO_CONFIG=1 in your shell profile.

Pads/Samples/Sequences

NOTE: Termixer uses the default SuperDirt samples installation directory by default. It's a great, free library to grab some starter samples.

macOS — ~/Library/Application Support/SuperCollider/downloaded-quarks/Dirt-Samples

Linux — ~/.local/share/SuperCollider/downloaded-quarks/Dirt-Samples

Pad and sequence configurations can be exported to .json files and imported later to restore all saved samples, pad settings, and sequences. The default save/load directory is ~/Documents.

  • Change the sample directory with termixer -S PATH.
  • Change the sequences/samples ("sessions") directory with termixer -L PATH.

CLI Options

FlagDescription
-s, --source NAME SOCKETAdd an audio source (MPV IPC socket)
-m, --music-dir PATHDirectory for audio file browser
-S, --samples-dir PATHDirectory for sample pad files
-L, --session-dir PATHDirectory for session save/load (default: ~/Documents)
-d, --discoverAuto-discover audio sources (default)
-h, --helpShow help

Keyboard Controls

KeyAction
Tab / h / lSwitch between panes (Deck A, DJ, Deck B, Master)
EnterEnter control select mode
EscGo back one level
?Toggle help overlay
qQuit

Controls

KeyAction
j / kNavigate controls up/down
h / lAdjust value / toggle EQ kill switch
J / KCoarse adjustment (0.2)
+ / -Fine adjustment (0.05)
m / sToggle mute / solo
cCenter pan or crossfader
0Reset control to default

Source & Sample Pads

KeyAction
AOpen source picker for Deck A
BOpen source picker for Deck B
PToggle sample pads mode

Synth

For some great synth samples, I recommend downloading legowelt's sample packages.

KeyAction
q 2 w 3 e r 5 t 6 y 7 u i 9 o 0 p [ = ]Play the active C-to-G range
h / l or arrowsMove the waterfall cursor by semitone
H / L or Shift+arrowsMove the waterfall cursor by octave
EnterOpen waterfall controls/editor
j / kSelect a waterfall step
J / KMove down/up one waterfall measure
Enter / SpaceCycle cell through Off, Play, Hold
Shift+SpacePlace a Hold cell directly
cToggle SYNTH sample/config pane
Ctrl+vStart/end rectangular visual selection
c / xCopy/cut visual selection (bring up config when not on an active cell)
pPaste at the waterfall cursor
Ctrl+z / Shift+Ctrl+zUndo/redo waterfall edits

The SYNTH tab row creates up to eight simultaneous synth tracks. Each track has an independent waterfall length, mute state, BPM, sample, and sample configuration. The SYNTH control-row play/pause toggles every synth, while master play/pause pauses all decks, sequences, and synths and resumes only those that were active. Synth presets save every tab and restore the complete pane from one synth.json; legacy single-synth presets remain loadable.

Development

Check changes and run the test suite before opening a pull request:

cargo check
cargo test
cargo clippy -- -D warnings

Run Termixer with DEBUG=1 while developing behavior, state synchronization, or audio routing:

DEBUG=1 cargo run

Debug mode enables the in-app debug pane and preserves diagnostic logging that is otherwise redirected to prevent stderr from corrupting the TUI. Clippy is run with warnings treated as errors to keep new code lint-clean.

License

MIT

Contributors

sei-dwtompkins

27 commits

l00sed/termixer

A 2-deck mixer, sample pads, sequencer— all from any Unix terminal.

Rust

236

27 commits

updated Aug 14, 2026

See the code

README

termixer

A terminal-based DJ mixer for live performance with TidalCycles. Built in Rust with ratatui, it provides real-time EQ, filtering, crossfading, and sample pads for mixing audio from MPV and SuperCollider.

screenshot.gif

Features

Dual-deck mixerA-B channel faders, pan, 3-band EQ, LPF/HPF
Crossfadermix different decks, cue-in Deck C with unique output (headphone/booth)
Microphone inputselectable device, gain, and mute toggle
Sample pads4x4 grid with sequencer, save/load configs
Recordingcapture decks, master, mic, synth, or pads to MP3/WAV/FLAC/OGG
Synthsplay out a sample across the keys, or use the default sine synth
SuperCollider integrationcustom SynthDefs for processing SuperCollider output
Vim navigationhjkl throughout, multi-modal nav system

Prerequisites

Rustcargo package manager and Rust language compiler
Nerd Fontsrequired for icons (rewind, fast-forward, etc.)
MPVmedia playback with IPC socket support
FFmpegrecording encoder for MP3/WAV/FLAC/OGG
SuperCollider (optional)for TidalCycles integration

Installation

From crates.io

cargo install termixer

From GitHub release archive

This will take the latest release binary and install it to ~/.cargo/bin/termixer (same as cargo).

curl -sL https://raw.githubusercontent.com/l00sed/termixer/master/install.sh | bash

From source

git clone https://github.com/l00sed/termixer.git
cd termixer
cargo install --path .

Build

cargo build              # debug
cargo build --release    # optimized with LTO

Usage

# Auto-discover audio sources
cargo run

# Specify MPV sources explicitly
cargo run -- -s "Deck A" /tmp/mpv-a.sock -s "Deck B" /tmp/mpv-b.sock

# With music and samples directories
cargo run -- -m ~/Music -S ~/Samples

Starting MPV with IPC

mpv --input-ipc-server=/tmp/mpv-music.sock music.mp3

There's also an mpv wrapper script included that you can use to automatically enable the necessary flags just by setting the TM environment variable:

TM=1 mpv music.mp3

Termixer should automatically install this wrapper script to ~/.local/bin/mpv. When TM=1, it will add the socket and pcm flags. Without it, mpv runs normally.

To manage your own mpv config and disable automatic seeding of ~/.config/mpv/scripts/ and ~/.config/mpv/mpv.conf, use export TM_NO_CONFIG=1 in your shell profile.

Pads/Samples/Sequences

NOTE: Termixer uses the default SuperDirt samples installation directory by default. It's a great, free library to grab some starter samples.

macOS — ~/Library/Application Support/SuperCollider/downloaded-quarks/Dirt-Samples

Linux — ~/.local/share/SuperCollider/downloaded-quarks/Dirt-Samples

Pad and sequence configurations can be exported to .json files and imported later to restore all saved samples, pad settings, and sequences. The default save/load directory is ~/Documents.

  • Change the sample directory with termixer -S PATH.
  • Change the sequences/samples ("sessions") directory with termixer -L PATH.

CLI Options

FlagDescription
-s, --source NAME SOCKETAdd an audio source (MPV IPC socket)
-m, --music-dir PATHDirectory for audio file browser
-S, --samples-dir PATHDirectory for sample pad files
-L, --session-dir PATHDirectory for session save/load (default: ~/Documents)
-d, --discoverAuto-discover audio sources (default)
-h, --helpShow help

Keyboard Controls

KeyAction
Tab / h / lSwitch between panes (Deck A, DJ, Deck B, Master)
EnterEnter control select mode
EscGo back one level
?Toggle help overlay
qQuit

Controls

KeyAction
j / kNavigate controls up/down
h / lAdjust value / toggle EQ kill switch
J / KCoarse adjustment (0.2)
+ / -Fine adjustment (0.05)
m / sToggle mute / solo
cCenter pan or crossfader
0Reset control to default

Source & Sample Pads

KeyAction
AOpen source picker for Deck A
BOpen source picker for Deck B
PToggle sample pads mode

Synth

For some great synth samples, I recommend downloading legowelt's sample packages.

KeyAction
q 2 w 3 e r 5 t 6 y 7 u i 9 o 0 p [ = ]Play the active C-to-G range
h / l or arrowsMove the waterfall cursor by semitone
H / L or Shift+arrowsMove the waterfall cursor by octave
EnterOpen waterfall controls/editor
j / kSelect a waterfall step
J / KMove down/up one waterfall measure
Enter / SpaceCycle cell through Off, Play, Hold
Shift+SpacePlace a Hold cell directly
cToggle SYNTH sample/config pane
Ctrl+vStart/end rectangular visual selection
c / xCopy/cut visual selection (bring up config when not on an active cell)
pPaste at the waterfall cursor
Ctrl+z / Shift+Ctrl+zUndo/redo waterfall edits

The SYNTH tab row creates up to eight simultaneous synth tracks. Each track has an independent waterfall length, mute state, BPM, sample, and sample configuration. The SYNTH control-row play/pause toggles every synth, while master play/pause pauses all decks, sequences, and synths and resumes only those that were active. Synth presets save every tab and restore the complete pane from one synth.json; legacy single-synth presets remain loadable.

Development

Check changes and run the test suite before opening a pull request:

cargo check
cargo test
cargo clippy -- -D warnings

Run Termixer with DEBUG=1 while developing behavior, state synchronization, or audio routing:

DEBUG=1 cargo run

Debug mode enables the in-app debug pane and preserves diagnostic logging that is otherwise redirected to prevent stderr from corrupting the TUI. Clippy is run with warnings treated as errors to keep new code lint-clean.

License

MIT

Contributors

sei-dwtompkins

27 commits

Languages

Rust

99.2%