Files
shawn e450189858
Lint & Validate / lint (push) Has been cancelled
Docs: Full USB/NVMe boot coverage across all documentation
- build-guide.md: Boot medium options table, USB/NVMe flash instructions,
  EEPROM boot order setup, first-boot wizard boot config step
- user-manual.md: Required hardware lists all 3 boot targets, EEPROM
  bootstrap instructions, NVMe HAT recommendation for live use
- hardware-compatibility.md: New storage/boot media section with NVMe
  HAT compatibility table (official, Pimoroni, Geekworm)
- Obsidian wiki: Build section with all 3 targets + EEPROM config
- developer-guide.md: Added (from task completion)
2026-05-19 22:58:49 -04:00

726 lines
23 KiB
Markdown

# 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
1. [Hardware Setup](#1-hardware-setup)
2. [First Boot & Setup Wizard](#2-first-boot--setup-wizard)
3. [Web Control Surface](#3-web-control-surface)
4. [Touchscreen UI](#4-touchscreen-ui)
5. [MIDI Controller Operation](#5-midi-controller-operation)
6. [Multi-Track Recording](#6-multi-track-recording)
7. [Backing Tracks](#7-backing-tracks)
8. [Live Streaming](#8-live-streaming)
9. [Session Management](#9-session-management)
10. [OSC / DAW Integration](#10-osc--daw-integration)
11. [Plugins & Effects](#11-plugins--effects)
12. [Fader Automation & Scenes](#12-fader-automation--scenes)
---
## 1. Hardware Setup
### Required Equipment
- Raspberry Pi 4 Model B (4GB+ RAM)
- USB audio interface (class-compliant UAC2)
- Boot media (choose one):
- **SD card** (16GB+, Class A2) — good for dev/testing
- **USB SSD** via USB 3.0 — more reliable, but shares USB bus with audio
- **NVMe SSD + HAT** (PCIe) — **recommended for live use** — no bus contention
- 5V/3A USB-C power supply
- **Optional:** HDMI touchscreen, USB MIDI controller, Ethernet cable, USB camera
> 💡 **Storage recommendation:** For live performances and recording, use an NVMe
> HAT (official RPi, Pimoroni, or Geekworm) with a 128GB+ NVMe SSD. It uses
> dedicated PCIe lanes and won't compete with your USB audio interface for bandwidth.
### Connections
```
┌──────────────────────┐
USB Audio ←──→ │ │
Interface │ Raspberry Pi 4B │──→ HDMI Touchscreen
│ │
MIDI Controller ──│ │──→ Ethernet (router)
│ │
USB Camera ───│ │
└──────────────────────┘
5V/3A Power
```
1. Connect the USB audio interface to a **USB 3.0 (blue) port** — these have
dedicated bandwidth and lower latency than USB 2.0 ports
2. Connect MIDI controllers to any remaining USB port
3. Connect the HDMI touchscreen (if using)
4. Connect Ethernet for reliable networking (WiFi works but can cause audio dropouts)
5. 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](hardware-compatibility.md)
---
## 2. First Boot & Setup Wizard
### Booting for the First Time
1. Insert your boot media (SD, USB SSD, or NVMe) into the Pi
2. Connect audio interface, MIDI controllers, and network
3. Power on
> ⚡ If booting from USB SSD or NVMe, the Pi's EEPROM must be configured to try
> your boot device first. The setup wizard includes an EEPROM configuration step,
> or you can configure it manually beforehand:
> ```bash
> sudo rpi-eeprom-config --edit
> # USB boot: BOOT_ORDER=0xf41
> # NVMe boot: BOOT_ORDER=0xf614
> ```
On first boot, the **setup wizard** runs automatically on the HDMI display (or
serial console). It walks through:
### Wizard Steps
1. **Welcome screen** — language selection
2. **Audio interface detection** — the wizard scans USB for audio devices and
presents a list. Select your interface.
3. **WiFi configuration** — scan for networks, enter password. Skip for Ethernet.
4. **Hostname** — set a custom hostname (default: `pi-mixer`)
5. **API key** — auto-generated and displayed. **Write this down** — you need it
for web UI access. Can be changed later.
6. **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
7. **Reboot** — system restarts into normal operation
### Re-running the Wizard
```bash
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:
```bash
# 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:
```bash
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:
1. **Mixer Surface** — faders, meters, mute/solo for all 16 channels + master
2. **Routing Matrix** — drag to connect JACK audio ports
3. **Plugin Chain** — per-channel plugin slots with drag-and-drop
4. **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
```bash
# 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:
```bash
# 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](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:
1. **Enter learn mode:**
```bash
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.
2. **Click the parameter** you want to map (e.g., Channel 3 Volume)
3. **Move the physical control** on your MIDI controller (fader, knob, or button)
4. The mapping is saved automatically. Exit learn mode:
```bash
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:
```bash
# 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
1. **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.
2. **Set recording directory:**
The default is `/data/recordings/session_NNN/`. Change via:
```bash
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"}'
```
3. **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/` containing `channel_01.wav` through
`channel_16.wav` plus `session_metadata.json`.
---
## 7. Backing Tracks
Play synchronized backing tracks alongside live inputs.
### Setup
1. **Upload tracks** to `/data/backing/`:
```bash
scp my-backing.wav pi@pi-mixer.local:/data/backing/
```
2. **Supported formats:** WAV (16/24/32-bit), FLAC, MP3, AIFF, OGG
3. **Create a playlist** via the web UI → Backing Tracks → New Playlist, or:
```bash
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 →| | Next track |
| Skip |← | Previous track |
| 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
```bash
# 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
1. **Get your stream key** from YouTube Studio → Go Live → Stream Settings
2. **Connect a USB camera** (or use Raspberry Pi Camera Module)
3. **Start streaming** via the web UI → Stream, or:
```bash
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 |
| Facebook | 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:
```bash
# 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:
```bash
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
```bash
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:
1. Create a setlist:
```bash
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"}
]
}'
```
2. 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:
```bash
# 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
1. Add a new MIDI/OSC controller in Ableton preferences
2. Configure output to `pi-mixer.local:9001` (UDP)
3. Map Live's faders to `/mixer/channel/N/volume`
4. 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:
1. Route a channel to an aux via its **FX Send** knob
2. Insert effects on the aux return (e.g., reverb on Aux A, delay on Aux B)
3. Blend the wet signal with the channel strip's dry signal
4. 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:
1. Place `.nam` files in `/data/presets/nam/`
2. Insert a NAM plugin on a channel
3. Select the capture from the dropdown
4. Adjust input gain and output level
```bash
# 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:
1. **Arm automation** for a channel (click **A** button)
2. **Press Play** — fader movements are recorded
3. **Press Stop** — automation lane is saved
4. **Playback** — faders move automatically according to recorded automation
5. **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:
1. **Save a scene:**
```bash
curl -X POST http://pi-mixer.local:8080/scenes/Chorus/save \
-H "X-API-Key: your-key"
```
2. **Load a scene** (instant recall):
```bash
curl -X POST http://pi-mixer.local:8080/scenes/Chorus/load \
-H "X-API-Key: your-key"
```
3. **Next/Previous scene** (MIDI-mappable for footswitch control)
Modifier scenes only affect specific channels:
```bash
# 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 |