From 9481130f13303957a3db18a3820e812400b76efb Mon Sep 17 00:00:00 2001 From: Shawn Date: Tue, 9 Jun 2026 00:31:53 -0400 Subject: [PATCH] test: Focusrite 2i2 test plan, mono + 4CM config files --- docs/test-plan-focusrite.md | 188 +++++++++++++++++++++++++++++++++ etc/config-focusrite-4cm.yaml | 37 +++++++ etc/config-focusrite-mono.yaml | 35 ++++++ 3 files changed, 260 insertions(+) create mode 100644 docs/test-plan-focusrite.md create mode 100644 etc/config-focusrite-4cm.yaml create mode 100644 etc/config-focusrite-mono.yaml diff --git a/docs/test-plan-focusrite.md b/docs/test-plan-focusrite.md new file mode 100644 index 0000000..5031fbc --- /dev/null +++ b/docs/test-plan-focusrite.md @@ -0,0 +1,188 @@ +# Pi Multi-FX Pedal — Focusrite 2i2 Test Plan + +> Prototype validation before ordering I2S HAT boards. Tests the complete software stack — DSP, 4CM routing, NAM, FX, Web UI — with hardware you already own. + +## Wiring + +### Mono Mode (Standard Pedal) + +``` +Guitar → Focusrite Input 1 (front) +Focusrite Output 1 (rear) → Amp or Audio Interface +``` + +### 4CM Mode (Four Cable Method) + +``` +Guitar → Focusrite Input 1 (front) ← ADC ch0 +Amp FX Send → Focusrite Input 2 (front) ← ADC ch1 + +Focusrite Output 1 (rear) → Amp Input ← DAC ch0 (Send / pre-amp) +Focusrite Output 2 (rear) → Amp FX Return ← DAC ch1 (Output / post-amp) +``` + +## Config + +Edit `~/.pedal/config.yaml` on the RPi. Two profiles: + +### `config-mono.yaml` — Standard pedal test + +```yaml +audio: + mode: mono + hat_type: focusrite + input_device: "hw:1,0" + output_device: "hw:1,0" + jack_enabled: true + auto_connect: true + profile: standard + +presets: + dir: "~/.pedal/presets" + install_factory: true +``` + +### `config-4cm.yaml` — 4CM stereo test + +```yaml +audio: + mode: stereo_4cm + hat_type: focusrite + input_device: "hw:1,0" + output_device: "hw:1,0" + jack_enabled: true + auto_connect: true + profile: standard + +presets: + dir: "~/.pedal/presets" + install_factory: true +``` + +## Test Sequence + +### Phase 1 — Mono Mode (Basic Signal Chain) + +| # | Step | Expected | Check | +|:-:|------|----------|-------| +| 1 | SSH into RPi: `ssh pi@pedal.local` | Connected | ✅ | +| 2 | Wire guitar → Focusrite Input 1, Output 1 → amp | Physical | ✅ | +| 3 | Start pedal: `python3 main.py --config ~/.pedal/config-mono.yaml` | Boots, JACK starts | ✅ | +| 4 | Play guitar | Sound through amp, clean bypass | ✅ | +| 5 | Open browser to `http://pedal.local:8080` | Web UI shows dashboard | ✅ | +| 6 | Click bypass toggle on web UI | Pedal mutes → unmutes | ✅ | +| 7 | Check preset name shows on dashboard | "Default" or first preset | ✅ | +| 8 | Press preset up/down on footswitch or web UI | Changes preset, different sound | ✅ | + +### Phase 2 — FX Block Tests (Mono) + +| # | Step | Expected | Check | +|:-:|------|----------|-------| +| 1 | From web UI, open a preset or start fresh | Chain visible on dashboard | ✅ | +| 2 | Toggle **Noise Gate** on/off | Noise floor drops when active | ✅ | +| 3 | Adjust compressor threshold | Compression amount changes | ✅ | +| 4 | Turn on **Overdrive**, adjust drive slider | Distortion increases | ✅ | +| 5 | Try **Distortion**, **Fuzz** | Different clipping textures | ✅ | +| 6 | Load a NAM .nam file via Models page → Upload | Model loads | ✅ | +| 7 | Enable NAM block | Amp-modeled sound from uploaded model | ✅ | +| 8 | Load an IR .wav file via IRs page → Upload | IR loads | ✅ | +| 9 | Enable IR block (after NAM in chain) | Cabinet sound | ✅ | +| 10 | Try **Delay**, adjust time + feedback | Echoes | ✅ | +| 11 | Try **Reverb**, adjust size + decay | Room sound | ✅ | +| 12 | Try **Chorus**, **Flanger**, **Phaser** | Modulation effects | ✅ | +| 13 | Try **Tremolo**, **Vibrato** | LFO-based FX | ✅ | +| 14 | Try **EQ** — boost/cut lows, mids, highs | Tone shaping | ✅ | +| 15 | Try **Octaver** — play on low E string | Sub-octave follows playing | ✅ | +| 16 | Try **Bitcrusher** — reduce bits | Lo-fi digital artifact | ✅ | +| 17 | Try **Ring Modulator** | Metallic bell-like tones | ✅ | +| 18 | Try **Ping-pong Delay** (stereo output) | Alternates left-right | ⚠️ Needs stereo monitoring | + +### Phase 3 — New FX (Full Palette) + +| # | Step | Expected | Check | +|:-:|------|----------|-------| +| 1 | **Auto-Wah** — play with pick attack | Filter sweeps with playing dynamics | ✅ | +| 2 | **Envelope Filter** | Similar to auto-wah, different curve | ✅ | +| 3 | **Expander** — set low threshold | Quiet parts get quieter | ✅ | +| 4 | **De-esser** — set freq to ~6kHz | Sibilance reduced | ✅ | +| 5 | **Transient Shaper** — boost attack | Picking attack pops more | ✅ | +| 6 | **Wavefolder** — increase fold | Harmonic saturation | ✅ | +| 7 | **Rectifier** — full wave | Octave-up fuzz | ✅ | +| 8 | **Parametric EQ** — boost 800Hz +3dB | Mid bump | ✅ | +| 9 | **High-Pass Filter** — sweep up | Low end cuts off | ✅ | +| 10 | **Low-Pass Filter** — sweep down | High end rolls off | ✅ | +| 11 | **Formant Filter** — cycle vowels | Vowel sounds (aaa-eee-iii-ooo-uuu) | ✅ | +| 12 | **Multi-tap Delay** — try triplet pattern | Rhythmic repeats | ✅ | +| 13 | **Reverse Delay** | Played-backward effect | ✅ | +| 14 | **Tape Echo** — increase wow | Wobbly vintage echo | ✅ | +| 15 | **Rotary Speaker** — slow/fast | Leslie cabinet swirl | ✅ | +| 16 | **Uni-Vibe** — adjust rate | Hendrix-style phaser | ✅ | +| 17 | **Auto-Pan** — stereo output | Moves left-right | ⚠️ Needs stereo | +| 18 | **Stereo Widener** | Bigger stereo image | ⚠️ Needs stereo | +| 19 | **Detune** — short delay time 0.5-3ms | Thickened, chorus-like | ✅ | +| 20 | **Whammy** — sweep pitch bend | Pitched expression | ✅ | +| 21 | **Early Reflections** | Small room ambience | ✅ | +| 22 | **Shimmer Reverb** — add shift | Ethereal, pitch-shifted reverb | ⚠️ BETA - watch for xruns | + +### Phase 4 — 4CM Mode + +| # | Step | Expected | Check | +|:-:|------|----------|-------| +| 1 | Wire per 4CM diagram above | | ✅ | +| 2 | Switch config to `config-4cm.yaml` | | ✅ | +| 3 | Start pedal: `python3 main.py --config ~/.pedal/config-4cm.yaml` | Boots with 2ch I/O | ✅ | +| 4 | Open web UI → Settings → toggle 4CM ON | Routing badge shows "4CM" | ✅ | +| 5 | Verify: guitar input goes through pre blocks only | Pre effects (gate/comp/drive/NAM/IR) through Send | ✅ | +| 6 | Verify: return input goes through post blocks only | Post effects (mod/delay/verb) through Output | ✅ | +| 7 | Adjust breakpoint slider | Moves which blocks are pre vs post | ✅ | +| 8 | Disable 4CM → back to mono | Full chain, no split | ✅ | +| 9 | Save preset with 4CM routing | Reload — routing preserved | ✅ | + +### Phase 5 — Presets & State + +| # | Step | Expected | Check | +|:-:|------|----------|-------| +| 1 | Create new preset via web UI | Saved | ✅ | +| 2 | Name it, set FX chain, save | Round-trips | ✅ | +| 3 | Load preset — verify all params restored | | ✅ | +| 4 | Delete preset | Removed from list | ✅ | +| 5 | Save a preset in 4CM mode | routing_mode saved | ✅ | +| 6 | Restart pedal — last preset restores | State persistence | ✅ | + +### Phase 6 — MIDI (optional, needs MIDI controller) + +| # | Step | Expected | Check | +|:-:|------|----------|-------| +| 1 | Connect MIDI controller via USB | MIDI LED on controller? | ✅ | +| 2 | Send Program Change 0-3 | Switches presets | ✅ | +| 3 | Assign expression pedal (CC 11) → volume | Volume follows pedal | ✅ | +| 4 | MIDI Learn: CC → parameter | Parameter controllable via MIDI | ✅ | + +### Phase 7 — Performance / Stability + +| # | Step | Expected | Check | +|:-:|------|----------|-------| +| 1 | Play for 30 min straight | No xruns, no crackle | ✅ | +| 2 | Switch presets rapidly 20x | No crash | ✅ | +| 3 | Toggle bypass rapidly 20x | No crash | ✅ | +| 4 | Load heavy preset (NAM + IR + delay + reverb + chorus) | CPU stable, <80% load | ✅ | +| 5 | Check CPU: `top` or `htop` | < 70% on RPi 4B | ✅ | +| 6 | Check JACK xruns: `cat /proc/asound/card0/pcm0p/sub0/status \| grep xruns` | 0 xruns | ✅ | +| 7 | Cycle power — pedal boots to last state | | ✅ | + +## Known Limitations (BETA FX) + +These effects were tagged as CPU-heavy — test on your rig and report xruns: + +| Effect | Risk | Mitigation | +|--------|:----:|------------| +| **Shimmer Reverb** | High — pitch shift + re-verb loop | Increase JACK period to 256 frames | +| **Pitch Shifter** | Medium — overlap-add granular | Keep shift < 3 semitones | +| **Looper** | Medium — large buffer (~6MB) | Not yet implemented — stub only | + +## Reporting Issues + +If an effect doesn't sound right or causes xruns: +1. Note which effect + parameter settings +2. Check `/var/log/pedal.log` for errors +3. Run `hermes kanban --board pi-multifx-pedal create "Fix: [effect name] — [issue]"` and I'll handle it \ No newline at end of file diff --git a/etc/config-focusrite-4cm.yaml b/etc/config-focusrite-4cm.yaml new file mode 100644 index 0000000..3666b74 --- /dev/null +++ b/etc/config-focusrite-4cm.yaml @@ -0,0 +1,37 @@ +# Pi Multi-FX Pedal — Focusrite 4CM Test Config +# 4-Cable Method stereo mode: 2 in, 2 out +# Guitar → Input 1, Amp Send → Input 2 +# Output 1 → Amp Input (Send), Output 2 → Amp Return (Output) +audio: + mode: stereo_4cm + hat_type: focusrite + input_device: "hw:1,0" + output_device: "hw:1,0" + jack_enabled: true + auto_connect: true + profile: standard + +midi: + uart_port: "/dev/ttyAMA0" + usb: true + +footswitch: + layout: + - {gpio_pin: 17, action_default: preset_up, action_long_press: tap_tempo} + - {gpio_pin: 27, action_default: preset_down, action_long_press: tuner} + - {gpio_pin: 22, action_default: bypass, action_long_press: snapshot_save} + - {gpio_pin: 23, action_default: bank_up, action_long_press: bank_down} + +leds: + driver: mock + num_leds: 4 + pin: "D18" + brightness: 0.5 + +display: + i2c_bus: 1 + i2c_addr: 0x3C + +presets: + dir: "~/.pedal/presets" + install_factory: true \ No newline at end of file diff --git a/etc/config-focusrite-mono.yaml b/etc/config-focusrite-mono.yaml new file mode 100644 index 0000000..41a0ec1 --- /dev/null +++ b/etc/config-focusrite-mono.yaml @@ -0,0 +1,35 @@ +# Pi Multi-FX Pedal — Focusrite Mono Test Config +# Standard pedal mode: 1 in, 1 out +audio: + mode: mono + hat_type: focusrite + input_device: "hw:1,0" + output_device: "hw:1,0" + jack_enabled: true + auto_connect: true + profile: standard + +midi: + uart_port: "/dev/ttyAMA0" + usb: true + +footswitch: + layout: + - {gpio_pin: 17, action_default: preset_up, action_long_press: tap_tempo} + - {gpio_pin: 27, action_default: preset_down, action_long_press: tuner} + - {gpio_pin: 22, action_default: bypass, action_long_press: snapshot_save} + - {gpio_pin: 23, action_default: bank_up, action_long_press: bank_down} + +leds: + driver: mock + num_leds: 4 + pin: "D18" + brightness: 0.5 + +display: + i2c_bus: 1 + i2c_addr: 0x3C + +presets: + dir: "~/.pedal/presets" + install_factory: true \ No newline at end of file