restore_state() loads the last state from disk but doesn't call activate() on the pipeline, so the NAM model was never loaded on boot and no audio passed through. Added select() call with the restored bank/program values so the pipeline loads the preset chain including the NAM model.
Pi Multi-FX Pedal 🎸
A real-time guitar multi-FX pedal running on Raspberry Pi 4B with 32 DSP effects, NAM A2 neural amp modeling, IR cab simulation, 4-Cable Method routing, and a web UI on pedal.local:8080.
Quick Install (Focusrite 2i2 Test)
Get the pedal running on a fresh RPi with a Focusrite 2i2 in under 10 minutes.
1. OS Setup
Start with Raspberry Pi OS Lite (64-bit) or DietPi.
Configure hostname, enable SSH, and connect to WiFi:
sudo hostnamectl set-hostname pedal
# Or on DietPi: use dietpi-config
2. System Packages
sudo apt update && sudo apt upgrade -y
sudo apt install -y \
git python3 python3-pip python3-venv python3-dev \
jackd2 libjack-jackd2-dev \
libsndfile1-dev \
cmake build-essential \
avahi-daemon # for pedal.local mDNS
3. Clone the Repo
git clone https://gitea.ourpad.casa/shawn/pi-multifx-pedal.git ~/projects/pi-multifx-pedal
cd ~/projects/pi-multifx-pedal
4. Python Environment
python3 -m venv .venv
source .venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
Note:
neural-amp-modelerneeds PyTorch. On RPi 4B aarch64:pip install torch --index-url https://download.pytorch.org/whl/nightly/cpu
5. Focusrite-Specific Config
Kill PulseAudio (it grabs USB audio):
pulseaudio --kill
Verify Focusrite is detected:
aplay -l
# Look for: card 1: USB Audio [Scarlett 2i2 USB], device 0
arecord -l
# Look for same
Copy the mono test config:
mkdir -p ~/.pedal
cp etc/config-focusrite-mono.yaml ~/.pedal/config.yaml
6. Run the Pedal
cd ~/projects/pi-multifx-pedal
source .venv/bin/activate
python3 main.py
7. Open the Web UI
From any device on the same network:
- Browser: http://pedal.local:8080
- Or use the IP: http://192.168.x.x:8080
WiFi Hotspot (No Network? No Problem)
If there's no WiFi network to join — stage, rehearsal space, park bench — the Pi can create its own:
# Run once to set up
sudo bash scripts/setup-wifi-ap.sh
# Or with custom SSID/password:
sudo bash scripts/setup-wifi-ap.sh --ssid "Pi-Pedal" --psk "yourpassword"
# Phone connects to "Pi-Pedal" → open http://pedal.local:8080
# To turn it off and go back to client mode:
sudo bash scripts/setup-wifi-ap.sh --disable
Pro tip: Add a USB WiFi dongle for dual-network — Pi creates hotspot on built-in WiFi, dongle handles internet access for git pulls and updates.
8. Wire It Up
Mono mode (standard pedal):
Guitar jack → Focusrite Input 1 (front)
Focusrite Output 1 (rear) → Amp
4CM mode (four cable method):
Guitar → Focusrite Input 1
Amp FX Send → Focusrite Input 2
Focusrite Output 1 → Amp Input (Send)
Focusrite Output 2 → Amp FX Return (Output)
Then switch config:
cp etc/config-focusrite-4cm.yaml ~/.pedal/config.yaml
Toggle 4CM on/off from the Settings page in the web UI.
Hardware
| Component | Spec |
|---|---|
| SBC | Raspberry Pi 4B (2GB+ RAM) |
| Audio I/O | I2S DAC + ADC (PCM1808 + PCM5102 custom HAT, or USB via Focusrite 2i2) |
| Footswitches | 3-6 momentary soft-touch (e.g. MXR-style) |
| LEDs | RGB WS2812B or APA102 per footswitch + status LEDs |
| Display | 128x64 OLED SSD1306 (I2C) or 5" DSI touch |
| MIDI | 5-pin DIN in/out via UART + optoisolator |
| Power | 5V/3A USB-C (with buck for 3.3V rail) |
| Enclosure | 1590BB or 3D-printed custom |
32 Effects
| Category | Effects |
|---|---|
| Dynamics | Noise Gate, Compressor, Expander, De-esser, Transient Shaper, Sidechain Compressor |
| Drive | Boost, Overdrive, Distortion, Fuzz, Bitcrusher, Wavefolder, Rectifier |
| Amp + Cab | NAM Amp Model (any .nam file), IR Cab Sim (any .wav) |
| Modulation | Chorus, Flanger, Phaser, Tremolo, Vibrato, Ring Mod, Auto-Wah, Envelope Filter, Rotary Speaker, Uni-Vibe, Auto-Pan, Stereo Widener |
| Time | Delay, Ping-pong Delay, Multi-tap Delay, Reverse Delay, Tape Echo, Reverb, Shimmer Reverb, Early Reflections, Looper |
| Pitch | Octaver, Detune, Harmonizer, Whammy, Pitch Shifter |
| Filter | EQ, Parametric EQ, High-Pass, Low-Pass, Band-Pass, Notch, Formant, Wah |
| Utility | Volume, Tuner |
Project Structure
├── src/
│ ├── dsp/ Audio processing pipeline
│ │ ├── pipeline.py FX chain orchestration (mono + 4CM split)
│ │ ├── ir_loader.py IR convolution engine
│ │ ├── nam_host.py NAM model loading & inference
│ ├── midi/ MIDI subsystem
│ │ ├── handler.py MIDI event parse & dispatch
│ ├── presets/ Preset system
│ │ ├── manager.py Save/load/bank/preset CRUD + 4CM routing
│ │ └── types.py Preset & chain data model + FXType enum
│ ├── ui/ Hardware UI layer
│ │ ├── footswitch.py Debounced GPIO input
│ │ ├── leds.py RGB LED controller
│ │ └── display.py OLED display manager
│ ├── web/ Web UI (FastAPI + WebSocket)
│ │ ├── server.py REST + WebSocket endpoints
│ │ ├── templates/ Jinja2 HTML pages
│ │ └── static/ CSS + JS
│ └── system/ System integration
│ ├── audio.py ALSA/JACK/I2S configuration
│ └── config.py YAML config loader
├── etc/ Config file templates
├── scripts/ Build & utility scripts
├── tests/ Tests
├── docs/ Documentation + test plans
└── hardware/ KiCad/PCB schematics
Development
# Tests
source .venv/bin/activate
python -m pytest tests/ -v
# All 574 tests should pass
Early development — initial scaffold.