Cover image for Percussio

Percussio

2026

Rust
Audio
MIDI
Raspberry Pi
Android
API Integration
About the Project

Percussio is a timpani-first electronic percussion workstation I built for live performance, where one Rust core runs the real-time audio engine, MIDI and eDRUMin input, and an embedded web server, and one React app is the whole interface. The Pads screen is the performance surface: four drums — 32", 29", 26", and 23" — each with a ring of note pads for live pedal retuning, a dynamics fader that steps pp through ff, a sustained ROLL strip that crossfades on velocity, and a volume fader, with pad-preset banks I switch between mid-piece. A status bar keeps me honest about what matters on stage — active pads, polyphony, CPU, and trigger-to-audio latency (2.3 ms in the shot) — plus a master output meter. It plays from a tablet with no hardware at all, or from Alesis pads and an eDRUMin 12 module.

Perform mode gives me a touch keyboard per instrument with articulation modes — short hits and softer variants — and a searchable instrument list. The Library screen is the sample-authoring tool: I map a pack like BBC Symphony Orchestra Timpani onto pitched zones (D3–A3), assign samples to hit and roll targets per note, and it tracks articulations and sample counts so I can see what's covered. Input calibration is separate and explicit — I create physical pads, bind each zone to a MIDI device, channel, and note (the eDRUMin BLACK here), then strike the hardware to capture velocity, and wire control triggers on top.

The reason any of this is worth building is that concert timpani are expensive, heavy, and immovable, and the e-drum modules that could stand in for them don't do timpani properly — realistic sustained rolls and live pedal pitch changes mid-piece are exactly what generic sample players fake. So the audio engine is hand-written: a 192-voice pool with stealing, sample-accurate scheduling, and lock-free rings, where process() does no allocation, locking, or I/O — enforced in CI by an allocation guard wrapped around the audio callback. On Android it drops under cpal to talk AAudio directly for the low-latency path, and the macOS app doubles as an offline plugin-render host that instantiates AU/VST3 instruments, renders and analyzes them, and syncs the bundles to the Pi — which is how Spitfire timpani end up on a Raspberry Pi with no plugin host anywhere near the real-time path.

The stack is a 13-crate Rust workspace (cpal/JACK/oboe, axum, midir) with a React 19 + TypeScript + Vite front end and Tauri 2, plus a real Pi appliance build — a pi-gen image with a Chromium kiosk, PulseAudio/pipewire purged so the core owns ALSA, FIFO scheduling, isolated CPUs, and an SD-card flasher. It's about five weeks old and genuinely playable, with a flashed Pi image, a signed Android APK, and a macOS app shipped, and 218 Rust plus 359 frontend assertions in CI that need no audio hardware. It's still pre-field-validation: real-device latency and reconnect testing is outstanding, and the most recent commits are musical bug fixes — single-sample rolls collapsing to one hit, per-pad gain not carrying on triggers — the kind of thing you only find by actually playing it. Built Jun–Jul 2026.

Image Gallery

Percussio gallery image 1
Percussio gallery image 2
Percussio gallery image 3
Percussio gallery image 4