August 11, 2026

making the firmware, the web app and the manual agree

By Geoffrey Broomfield · 2 min read

Three versions of this instrument exist: the firmware on the Teensy, the web application that controls it, and the interface preview that runs in a browser. They’re meant to be the same instrument. They’d stopped being one.

Here’s what I changed:

  • Controls, value formats and layouts unified across all three, and page indices synchronised so page four means the same thing everywhere
  • Macro mapping re-architected with per-target fallback validation, so a macro pointing at something that isn’t there fails visibly instead of silently
  • The effects section split into six discrete items, each with its own wet/dry mix, instead of one effect type with a shared control
  • A conflict on pin 13, where the SPI clock and the status LED were fighting over the same pin

I gave values a single format too. Frequencies as Hz or kHz. Times in milliseconds. LFO rate in Hz. MIDI variables as plain 0–127. A macro now reads Macro 1: Flt Cut (1.50 kHz) instead of a bare number, which tells you what it does without having to remember.

The part worth keeping

Drift between three implementations isn’t a bug you fix once — it’s a habit. So there’s a consistency checker now: thirteen automated tests that compare the firmware, the application and the interface against each other and fail when they disagree.

Three descriptions of one thing will drift apart. A checker is cheaper than proofreading, because proofreading happens once and this runs every time, including the times I can’t be bothered.

More on the project page.