shawn adb35a730b feat: Add analog and ping_pong delay subtypes under FXType.DELAY
- Refactor _apply_delay into subtype dispatcher (digital/analog/ping_pong/tape)
- Add _apply_analog_delay: BBD-style with one-pole LPF on feedback path
  and subtle saturation (tanh) for warm, darker repeats. tone param
  controls feedback brightness (0.0=dark, 1.0=bright).
- Wire existing _apply_ping_pong_delay and _apply_tape_echo as subtypes
- All existing delay tests (TestDelay, TestPingPongDelay) pass unchanged
- Add TestAnalogDelay: output range, dry passthrough, feedback tail decay,
  tone spectral effect, state initialization, bypass
- Add TestDelaySubtypePingPong: output finite, dry path, state accumulation,
  ping alternation, zero mix passthrough, bypass

Unblocks child task t_14bae7ea (FXBlock subtype field + pipeline dispatch)
2026-06-13 00:41:22 -04:00

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-modeler needs 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:

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.

S
Description
RPi 4B guitar multi-FX pedal — NAM A2 amp modeling, IR cab sim, multi-FX chain, MIDI foot controller
Readme 9.3 MiB
Languages
Python 68.9%
JavaScript 9.3%
Shell 9.1%
HTML 5.7%
TypeScript 4.8%
Other 2.2%