- --target flag in build.sh (sd|usb|nvme) - NVMe kernel driver enabled for --target nvme - EEPROM boot-order config in first-boot wizard - USB/NVMe flashing docs in build/README.md - Hardware compatibility + user manual docs from P7
22 KiB
User Manual — Raspberry Pi Real-Time Audio Mixer
Comprehensive guide to operating the RPi Audio Mixer — from hardware setup to live streaming.
Table of Contents
- Hardware Setup
- First Boot & Setup Wizard
- Web Control Surface
- Touchscreen UI
- MIDI Controller Operation
- Multi-Track Recording
- Backing Tracks
- Live Streaming
- Session Management
- OSC / DAW Integration
- Plugins & Effects
- Fader Automation & Scenes
1. Hardware Setup
Required Equipment
- Raspberry Pi 4 Model B (4GB+ RAM)
- USB audio interface (class-compliant UAC2)
- SD card (16GB+, Class A2 recommended) with mixer image flashed
- 5V/3A USB-C power supply
- Optional: HDMI touchscreen, USB MIDI controller, Ethernet cable, USB camera
Connections
┌──────────────────────┐
USB Audio ←──→ │ │
Interface │ Raspberry Pi 4B │──→ HDMI Touchscreen
│ │
MIDI Controller ──│ │──→ Ethernet (router)
│ │
USB Camera ───│ │
└──────────────────────┘
│
5V/3A Power
- Connect the USB audio interface to a USB 3.0 (blue) port — these have dedicated bandwidth and lower latency than USB 2.0 ports
- Connect MIDI controllers to any remaining USB port
- Connect the HDMI touchscreen (if using)
- Connect Ethernet for reliable networking (WiFi works but can cause audio dropouts)
- Insert the SD card and power on
USB Audio Interface Setup
The system auto-detects class-compliant USB audio interfaces. For interfaces with multiple modes (e.g., Behringer UMC1820), ensure the device is in the correct mode before powering on the Pi.
Verified interfaces: see docs/hardware-compatibility.md
2. First Boot & Setup Wizard
On first boot, the setup wizard runs automatically on the HDMI display.
Wizard Steps
- Welcome screen — language selection
- Audio interface detection — the wizard scans USB for audio devices and presents a list. Select your interface.
- WiFi configuration — scan for networks, enter password. Skip for Ethernet.
- Hostname — set a custom hostname (default:
pi-mixer) - API key — auto-generated and displayed. Write this down — you need it for web UI access. Can be changed later.
- JACK settings — buffer size and sample rate:
- Low latency (128 frames @ 48kHz, ~2.7ms) — for live monitoring
- Stable (256 frames @ 48kHz, ~5.3ms) — for plugin-heavy sessions
- Maximum stability (512 frames @ 48kHz, ~10.7ms) — for recording
- Reboot — system restarts into normal operation
Re-running the Wizard
sudo touch /force-firstboot && sudo reboot
3. Web Control Surface
Access the mixer from any device on the same network via the web UI.
Access
http://pi-mixer.local:8080
Or use the IP address:
# Find the Pi's IP
ssh pi@pi-mixer.local "ip addr show | grep 'inet '"
# Open http://<ip-address>:8080
Authentication
Enter the API key from the setup wizard. The key is also stored in:
grep API_KEY /etc/systemd/system/mixer-api.service
Mixer View
The main mixer screen shows:
┌─────────┬─────────┬─────────┬─────────┬─────────┐
│ CH 1 │ CH 2 │ CH 3 │ ... │ Master │
│ ┌─────┐ │ ┌─────┐ │ ┌─────┐ │ │ ┌─────┐ │
│ │█████│ │ │███░░│ │ │█░░░░│ │ │ │████░│ │
│ │█████│ │ │███░░│ │ │█░░░░│ │ │ │████░│ │
│ │█████│ │ │███░░│ │ │█░░░░│ │ │ │████░│ │
│ │█████│ │ │███░░│ │ │█░░░░│ │ │ │████░│ │
│ └─────┘ │ └─────┘ │ └─────┘ │ │ └─────┘ │
│ -3 dB │ 0 dB │ -∞ dB │ │ -6 dB │
│ [M][S] │ [M][S] │ [M][S] │ │ [M][D] │
└─────────┴─────────┴─────────┴─────────┴─────────┘
- Fader — drag up/down to adjust volume (-60 dB to +12 dB)
- M button — mute the channel (red when active)
- S button — solo the channel (yellow when active)
- Channel label — tap to open channel detail panel
Channel Detail Panel
Tap a channel label to open:
- 3-band EQ — Low (20-500 Hz), Mid (200-8000 Hz), High (2000-20000 Hz) with frequency, gain (±15 dB), and Q controls
- Compressor — threshold, ratio, attack, release, makeup gain
- Gate — threshold, range
- Gain — preamp gain (-20 to +60 dB)
- Pan — stereo position
- FX Sends — send level to Aux A and Aux B
- Phase invert — toggle
Master Section
- Master Volume — main output level
- Mute — silence all outputs
- Dim — reduce output by -20 dB (for talkback)
- Monitor Volume — control room monitor level
- Phones Volume — headphone output level
Navigation Tabs
- Mixer — channel strips and master
- Routing — JACK routing matrix (drag connections between ports)
- Plugins — plugin browser and chain editor
- Session — save/load sessions, setlists
- Record — multi-track recording controls
- Stream — live streaming controls
- Settings — API key, network, display, audio config
Keyboard Shortcuts (Web UI)
| Key | Action |
|---|---|
1-8 |
Select channel 1-8 |
↑/↓ |
Adjust fader ±1 dB |
Shift+↑/↓ |
Adjust fader ±0.1 dB |
M |
Toggle mute on selected channel |
S |
Toggle solo on selected channel |
Space |
Transport play/stop |
R |
Start/stop recording |
Esc |
Deselect channel |
4. Touchscreen UI
The Kivy-based touch UI runs directly on the HDMI display — no browser needed.
Screen Layout
The UI has four screens, cycled by swiping or pressing ESC:
- Mixer Surface — faders, meters, mute/solo for all 16 channels + master
- Routing Matrix — drag to connect JACK audio ports
- Plugin Chain — per-channel plugin slots with drag-and-drop
- Settings — brightness, display timeout, DPI override
Touch Gestures
| Gesture | Action |
|---|---|
| Swipe up/down on fader | Adjust volume |
| Tap fader cap | Select channel |
| Double-tap fader | Set to 0 dB (unity) |
| Swipe left/right | Navigate between screens |
| Long-press mute/solo | Latch mode (stays until pressed again) |
| Pinch (routing screen) | Zoom routing matrix |
Launch Options
# Local mixer
python3 main_touch.py
# Remote mixer
python3 main_touch.py --host 192.168.1.10 --api-key my-key
# Force DPI (for non-standard displays)
KIVY_DPI=220 python3 main_touch.py
Hardware Buttons (if available)
Some touchscreens include physical buttons that can be mapped:
# Example udev rule for Waveshare 5" buttons
# Maps KEY_UP/DOWN to channel select
5. MIDI Controller Operation
Connect any class-compliant USB MIDI controller to control mixer parameters.
Supported Controllers
The MIDI engine auto-detects controllers. Pre-configured mappings exist for:
- Behringer X-Touch — 8 motorized faders, transport, scribble strips
- Akai MIDImix — 8 faders, 24 knobs, 16 buttons
- Korg nanoKONTROL 2 — 8 faders, 8 knobs, transport
- Novation Launch Control XL — 8 faders, 24 knobs, 16 buttons
See docs/hardware-compatibility.md for the full list and custom mapping instructions.
MIDI Learn Mode
Map any MIDI controller to any mixer parameter without editing config files:
-
Enter learn mode:
curl -X POST http://pi-mixer.local:8080/midi/learn/start \ -H "X-API-Key: your-key"Or press the "Learn" button in the web UI or touch UI.
-
Click the parameter you want to map (e.g., Channel 3 Volume)
-
Move the physical control on your MIDI controller (fader, knob, or button)
-
The mapping is saved automatically. Exit learn mode:
curl -X POST http://pi-mixer.local:8080/midi/learn/stop \ -H "X-API-Key: your-key"
MIDI Clock Sync
The mixer can act as MIDI clock master or slave:
- Master mode: mixer transport controls tempo; connected devices sync to it
- Slave mode: mixer follows external MIDI clock from a drum machine or DAW
Configure via the web UI → Settings → MIDI or via API:
# Set as slave
curl -X PUT http://pi-mixer.local:8080/midi/clock/mode \
-H "X-API-Key: your-key" \
-H "Content-Type: application/json" \
-d '{"mode": "slave"}'
NRPN Support
High-resolution 14-bit NRPN messages are supported for parameters that benefit from fine control (filter frequency, Q, etc.). The MIDI engine auto-detects NRPN vs. CC messages from your controller.
6. Multi-Track Recording
Record up to 16 channels simultaneously to individual WAV files.
Recording Setup
-
Arm tracks — in the web UI, click the R (record arm) button on each channel you want to record. Armed channels show a red indicator.
-
Set recording directory: The default is
/data/recordings/session_NNN/. Change via:curl -X PUT http://pi-mixer.local:8080/recording/path \ -H "X-API-Key: your-key" \ -H "Content-Type: application/json" \ -d '{"path": "/data/recordings/live-set-2026"}' -
Configure recording format:
- Bit depth: 16-bit, 24-bit, or 32-bit float
- Sample rate: inherits from JACK (48 kHz default)
- Punch in/out: set in/out points for selective recording
Recording Controls
| Action | Web UI | API |
|---|---|---|
| Start recording | Press ⏺ Record | POST /transport/command {"command": "record"} |
| Stop recording | Press ⏹ Stop | POST /transport/command {"command": "stop"} |
| Punch in | Automatic at marker | POST /recording/punch/in {"channel": 3} |
| Punch out | Automatic at marker | POST /recording/punch/out {"channel": 3} |
| New take | Creates new take file | POST /recording/take/new |
Recording Tips
- Use a fast SD card — Class A2 minimum for 16-track recording. Class A1 works for 8 tracks or fewer.
- Monitor disk space with
df -h /data. The web UI shows a disk meter. - Punch in/out is seamless — no clicks or gaps at edit points.
- Auto-save backs up session state every 30 seconds during recording.
- Each recording session creates a timestamped directory:
/data/recordings/session_001/containingchannel_01.wavthroughchannel_16.wavplussession_metadata.json.
7. Backing Tracks
Play synchronized backing tracks alongside live inputs.
Setup
-
Upload tracks to
/data/backing/:scp my-backing.wav pi@pi-mixer.local:/data/backing/ -
Supported formats: WAV (16/24/32-bit), FLAC, MP3, AIFF, OGG
-
Create a playlist via the web UI → Backing Tracks → New Playlist, or:
curl -X POST http://pi-mixer.local:8080/backing/playlist \ -H "X-API-Key: your-key" \ -H "Content-Type: application/json" \ -d '{"name": "Set 1", "tracks": ["intro.wav", "song1.wav", "song2.flac"]}'
Playback Modes
- One-shot — play once and stop
- Loop — repeat indefinitely
- Segue — auto-advance to next track with configurable crossfade (0.5-10s)
- Playlist — sequential playback with optional transitions
Transport Controls
| Control | Description |
|---|---|
| Play | Start playback from current position |
| Stop | Stop and return to start |
| Pause | Pause at current position |
| Skip → | |
| Skip | ← |
| Loop | Toggle loop mode |
| Count-in | Play 1-2 bar count-in before playback |
Metronome / Click Track
The built-in metronome provides a click track routed to a dedicated output:
- Tempo: 20-300 BPM (tap tempo supported)
- Time signature: 1/4 through 13/8
- Sounds: click, beep, sidestick, custom samples
- Output routing: typically phones or a dedicated aux output
# Set tempo and enable click
curl -X PUT http://pi-mixer.local:8080/transport/tempo \
-H "X-API-Key: your-key" \
-H "Content-Type: application/json" \
-d '{"bpm": 128}'
curl -X POST http://pi-mixer.local:8080/transport/metronome/on \
-H "X-API-Key: your-key"
8. Live Streaming
Stream audio and video to YouTube, Twitch, Facebook Live, or any RTMP server.
Quick Start — Stream to YouTube
-
Get your stream key from YouTube Studio → Go Live → Stream Settings
-
Connect a USB camera (or use Raspberry Pi Camera Module)
-
Start streaming via the web UI → Stream, or:
curl -X POST http://pi-mixer.local:8080/stream/start \ -H "X-API-Key: your-key" \ -H "Content-Type: application/json" \ -d '{ "platform": "youtube", "stream_key": "your-youtube-stream-key", "video_source": "usb", "audio_source": "mixer_master", "bitrate_video": 4500, "bitrate_audio": 192 }'
Platform Presets
| Platform | Video Bitrate | Audio Bitrate | Resolution | Notes |
|---|---|---|---|---|
| YouTube | 4500-9000 Kbps | 192 Kbps | 1080p30/720p60 | H.264 recommended |
| Twitch | 4500-6000 Kbps | 160 Kbps | 1080p30/720p60 | Max 6000 Kbps |
| 4000 Kbps | 128 Kbps | 720p30 | Max 720p | |
| Custom RTMP | User-defined | User-defined | User-defined | Any RTMP server |
Scenes
Create named scenes with different camera angles and overlays:
# Save current camera/layout as scene
curl -X POST http://pi-mixer.local:8080/stream/scenes/wide-shot/save \
-H "X-API-Key: your-key"
# Switch scenes
curl -X POST http://pi-mixer.local:8080/stream/scenes/close-up/load \
-H "X-API-Key: your-key"
Streaming Tips
- Use Ethernet — WiFi can cause dropped frames. If using WiFi, reduce bitrate to 2500 Kbps.
- Monitor bitrate — the web UI shows a real-time bitrate meter. If it drops, reduce video bitrate.
- Dedicated audio bus — route the stream audio to a subgroup for independent level control vs. live PA.
- CPU headroom — 16 channels + streaming uses ~60% CPU on RPi 4. Reduce channel count or buffer size if you hit limits.
9. Session Management
Save and recall complete mixer states — all fader positions, EQ settings, plugin states, routing, and transport.
Save a Session
Via web UI → Session → Save, or:
curl -X POST http://pi-mixer.local:8080/sessions/save \
-H "X-API-Key: your-key" \
-H "Content-Type: application/json" \
-d '{"name": "Live at The Garage", "notes": "Soundcheck levels"}'
Load a Session
curl -X POST "http://pi-mixer.local:8080/sessions/Live%20at%20The%20Garage/load" \
-H "X-API-Key: your-key"
Setlists
Group sessions into setlists with configurable transitions:
-
Create a setlist:
curl -X POST http://pi-mixer.local:8080/setlists \ -H "X-API-Key: your-key" \ -H "Content-Type: application/json" \ -d '{ "name": "Summer Tour Set", "items": [ {"session": "Soundcheck", "transition": "cut"}, {"session": "Opener", "transition": "crossfade", "duration": 3.0}, {"session": "Main Set", "transition": "crossfade", "duration": 5.0}, {"session": "Encore", "transition": "wait"} ] }' -
Transition types:
- Cut — instant switch
- Crossfade — smooth transition over N seconds
- Wait — manual advance (press "Next")
Auto-Save
The mixer auto-saves state every 30 seconds (configurable) to
~/.config/rpi-mixer/sessions/_autosave_YYYY-MM-DD.json. The last 10
auto-saves are kept (older ones are rotated out).
Snapshots
Capture instantaneous snapshots without creating a full session:
# MIDI-mappable: assign a button to snapshot save/load
# Save snapshot 3 (0-127 snapshots available)
curl -X POST http://pi-mixer.local:8080/snapshots/3/save \
-H "X-API-Key: your-key"
# Load snapshot 3
curl -X POST http://pi-mixer.local:8080/snapshots/3/load \
-H "X-API-Key: your-key"
10. OSC / DAW Integration
The mixer exposes all parameters via Open Sound Control, enabling integration with DAWs (Ableton Live, Reaper, Bitwig, Ardour) and custom controllers.
OSC Server
- Address:
pi-mixer.local:9001(UDP) - Endpoint format:
/mixer/channel/<n>/<parameter> - Value range: 0.0 to 1.0 (normalized)
Common OSC Commands
/mixer/channel/1/volume 0.75 # Set channel 1 volume to 0 dB
/mixer/channel/1/mute 1 # Mute channel 1
/mixer/channel/1/pan -0.5 # Pan channel 1 left
/mixer/channel/1/eq_low_gain 0.5 # Boost channel 1 low EQ by 7.5 dB
/mixer/master/volume 0.8 # Set master volume
/mixer/transport/play 1 # Start transport
/mixer/transport/stop 1 # Stop transport
/mixer/transport/tempo 128.0 # Set tempo to 128 BPM
OSC Query
The server responds to OSC queries:
/mixer/channel/1/volume → returns current value
/mixer/channel/*/volume → returns all 16 channel volumes
Ableton Live Setup
- Add a new MIDI/OSC controller in Ableton preferences
- Configure output to
pi-mixer.local:9001(UDP) - Map Live's faders to
/mixer/channel/N/volume - Map Live's transport to
/mixer/transport/play,/mixer/transport/stop
11. Plugins & Effects
The mixer uses Carla as its plugin host, supporting LV2, VST2, and NAM (Neural Amp Modeler) formats.
Plugin Browser
Access via web UI → Plugins. Browse by category:
- Dynamics — compressors, gates, limiters, expanders
- EQ — parametric, graphic, shelving
- Reverb — plate, hall, room, spring
- Delay — digital, tape, ping-pong
- Modulation — chorus, flanger, phaser, tremolo
- Distortion — overdrive, fuzz, amp sims, NAM captures
- Utility — meters, analyzers, routing tools
Per-Channel Plugin Chain
Each channel supports up to 8 plugin slots in series:
Input → [Gate] → [EQ] → [Comp] → [Amp] → [FX Slot 1] → [FX Slot 2] → Fader → Output
Plugins can be reordered by dragging in the UI.
Aux Sends & Returns
Four aux buses (FX A through D) provide shared effects:
- Route a channel to an aux via its FX Send knob
- Insert effects on the aux return (e.g., reverb on Aux A, delay on Aux B)
- Blend the wet signal with the channel strip's dry signal
- Control the overall aux level via FX Return faders in the master section
NAM (Neural Amp Modeler)
Load guitar/bass amp captures for realistic amp simulation:
- Place
.namfiles in/data/presets/nam/ - Insert a NAM plugin on a channel
- Select the capture from the dropdown
- Adjust input gain and output level
# Scan for new NAM models
curl -X POST http://pi-mixer.local:8080/plugins/scan \
-H "X-API-Key: your-key"
12. Fader Automation & Scenes
Fader Automation
Record and playback fader movements:
- Arm automation for a channel (click A button)
- Press Play — fader movements are recorded
- Press Stop — automation lane is saved
- Playback — faders move automatically according to recorded automation
- Overwrite — re-record by arming again
Automation modes:
- Read — playback recorded automation (fader is read-only)
- Write — record new automation (overwrites existing)
- Touch — record only while touching the fader
- Latch — record from first touch until stop
Scenes
Scenes are snapshots of all fader positions that can be recalled instantly:
-
Save a scene:
curl -X POST http://pi-mixer.local:8080/scenes/Chorus/save \ -H "X-API-Key: your-key" -
Load a scene (instant recall):
curl -X POST http://pi-mixer.local:8080/scenes/Chorus/load \ -H "X-API-Key: your-key" -
Next/Previous scene (MIDI-mappable for footswitch control)
Modifier scenes only affect specific channels:
# Save a modifier scene that only changes channels 1-4
curl -X POST http://pi-mixer.local:8080/scenes/Vocals-Up/save \
-H "X-API-Key: your-key" \
-d '{"mode": "modifier", "channels": [1, 2, 3, 4]}'
Appendix: REST API Quick Reference
All endpoints require X-API-Key header.
| Method | Endpoint | Description |
|---|---|---|
| GET | /channels |
List all channel states |
| GET | /channels/{n} |
Get channel n state |
| PUT | /channels/{n}/parameter |
Set channel parameter |
| GET | /mixes |
Master bus + aux + subgroups |
| PUT | /mixes/parameter |
Set master parameter |
| GET | /transport |
Transport state |
| PUT | /transport/command |
Play/stop/record/loop |
| GET | /routing |
JACK routing matrix |
| GET | /plugins |
Plugin list |
| GET | /scenes |
Scene list |
| POST | /scenes/{name}/save |
Save current state as scene |
| POST | /scenes/{name}/load |
Load a scene |
| GET | /sessions |
Session list |
| POST | /sessions/{name}/save |
Save session |
| POST | /sessions/{name}/load |
Load session |
| POST | /setlists |
Create setlist |
| GET | /stream/status |
Streaming status |
| POST | /stream/start |
Start streaming |
| POST | /stream/stop |
Stop streaming |
| POST | /recording/start |
Start recording |
| POST | /recording/stop |
Stop recording |
| POST | /midi/learn/start |
Enter MIDI learn mode |
| POST | /midi/learn/stop |
Exit MIDI learn mode |
| GET | /stats |
Server statistics |
| GET | /ws |
WebSocket for real-time updates |