Project
Teensy Synth
The project is called the WhackFUCK 2000. It is an 8-voice, three-oscillator synthesizer on a Teensy 4.0. There were five assembly documents, a wire-by-wire lookup table, and thirteen automated tests before I soldered anything. Then I soldered it, because the KiCad file still does not parse and five tasks are queued behind that one error. A PCB would be tidier. A working instrument is a working instrument.
What it is
- 8-voice polyphonic, with 3 oscillators per voice, on a Teensy 4.0 (ARM Cortex-M7 at 600 MHz)
- 320×240 colour IPS display over SPI
- 16-bit / 44.1 kHz I2S stereo audio output
- 14 faceplate encoders plus a backplate master encoder, and 8 assignable performance macros
- Three MCP23017 I2C expanders, 48 GPIOs in total, handling 28 rotary phase signals and 14 push switches
- USB MIDI and DIN MIDI, with serial and MIDI sharing one cable
- Six selectable effects, each with its own wet/dry mix — delay, reverb, chorus, flanger, bitcrusher and granular — plus a 2-band parametric EQ
- Patches stored in internal flash, with a real-time PC command interface over USB serial for editing, backup and diagnostics
- A parametric OpenSCAD enclosure: a 15° tilted desktop case at 166 × 102.5 × 45.8 mm, printable on a 220 mm bed with M3 heat-set inserts
Two things worth looking at in the code
Encoder polling is decoupled from rendering. A 1 kHz IntervalTimer running at priority 255 services the I2C bus, so turning a knob never waits on the display. It also carries a lockout debouncer for noisy EC11 switches and momentum-based acceleration curves: slow turns fine-tune, fast spins sweep.
A consistency checker holds three codebases to one specification. The firmware, the desktop companion app and the web UI all expose the same parameters, values and page indices, and tools/validate_consistency.py runs 13 automated tests that fail when they disagree. Keeping a hobby project honest across three surfaces is the part I would point at.
Status and licence
Version 2.0 is the current release. Firmware development continues independently of the PCB work, which is parked while a KiCad file parse issue is resolved. The firmware, enclosure models and documentation are released under the MIT licence, so anyone can build one — the public documentation package includes a user manual and parameter reference, a solderless assembly guide with a full wire lookup table, a 3D printing and enclosure specification, and a PC command interface reference for building companion apps.