Skip to main content

Cinderwave

An open-hardware acid groovebox that fits on a $4 microcontroller.

Cinderwave is a monophonic synth voice and 16-step sequencer in the TB-303 idiom — band-limited oscillators, a resonant zero-delay-feedback filter, per-step accent and slide — running on a Raspberry Pi Pico (RP2040). The entire DSP core is platform-independent C++17 with no dynamic allocation, no exceptions, and no dependencies, so the exact same code that drives the hardware also renders a .wav on your desktop.

   ┌───────────┐   ┌──────────┐   ┌──────────────┐   ┌─────────┐
   │ 16-step   │──▶│ Oscillator│──▶│ SVF filter   │──▶│ VCA     │──▶ out
   │ sequencer │   │ saw/sqr/  │   │ (cutoff env  │   │ (amp    │
   │ note/gate/│   │ tri/sine  │   │  + resonance)│   │  env)   │
   │ accent/   │   │ PolyBLEP  │   └──────▲───────┘   └────▲────┘
   │ slide     │   └───────────┘   filter env          amp env
   └───────────┘

Why it's fun

  • Band-limited oscillators — PolyBLEP saw and square, so the high notes don't alias into mush on a cheap DAC.
  • Cytomic TPT state-variable filter — the good resonant filter, stable and self-oscillating across the whole cutoff range.
  • Real acid behavior — accent boosts amplitude and opens the filter; slide portamentos between steps without retriggering the envelope.
  • One codebase, two worlds — flash it to a Pico, or cmake && ctest it on your laptop and bake the demo pattern to audio.

Quick start (no hardware needed)

cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j
ctest --test-dir build --output-on-failure     # DSP unit tests
./build/cinderwave_render out.wav              # bake the demo acid line to WAV

cinderwave_render writes ~8 seconds of the built-in demo pattern (a driving 130 BPM bassline with accents and slides) to a 16-bit mono WAV.

Build the hardware

Full bill of materials, GPIO pin map, and two audio-output options (a budget PWM + RC filter, or a PCM5102A I2S DAC) live in hardware/BUILD.md.

Minimum viable Cinderwave:

Part Qty Notes
Raspberry Pi Pico (RP2040) 1 the whole synth
10 kΩ linear potentiometer 3 cutoff, resonance, tempo
Tactile button 1 play / stop
1.8 kΩ resistor + 10 nF cap 1 RC reconstruction filter (~16 kHz)
10 µF cap + 3.5 mm jack 1 DC-blocked line out

Flash the firmware

cd firmware/rp2040
export PICO_SDK_PATH=/path/to/pico-sdk
cmake -S . -B build -DCMAKE_BUILD_TYPE=Release
cmake --build build -j

Hold BOOTSEL while plugging in the Pico, then drop build/cinderwave_firmware.uf2 onto the RPI-RP2 drive. It boots straight into the demo pattern; the three pots take over cutoff, resonance, and tempo, and the button toggles playback.

Layout

include/cinderwave/   Public API — the frozen DSP contract (headers only)
src/                  DSP core: oscillator, envelope, filter, voice, sequencer, synth
host/                 Desktop WAV renderer (uses the identical core)
firmware/rp2040/      Pico SDK target: PWM audio + pot/button controls
tests/                Dependency-free unit tests (built and run in CI)
hardware/             Build guide, BOM, wiring, pin map

Continuous integration

Every push builds the core, runs the unit tests, renders the demo WAV, and cross-compiles the RP2040 .uf2 — both artifacts are uploaded from the run. See .github/workflows/ci.yml.

License

MIT — see LICENSE.

Metadata

Release files for cinderwave 0.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for cinderwave 0.1.0
File Size Uploaded
cinderwave-0.1.0.tar.gz 18.2 kB Details

Built distributions (wheels)

Table of built distributions (wheels) for cinderwave 0.1.0
File Interpreter ABI Platform
cinderwave-0.1.0-py3-none-win_amd64.whl Python 3 none Windows x86-64 Details
cinderwave-0.1.0-py3-none-manylinux_2_28_x86_64.whl Python 3 none Linux glibc 2.28+ x86-64 Details
cinderwave-0.1.0-py3-none-macosx_14_0_arm64.whl Python 3 none macOS 14.0+ ARM64 Details

Total release size: 54.0 kB

Release files / cinderwave-0.1.0.tar.gz

Download URL cinderwave-0.1.0.tar.gz
Size 18.2 kB
Tags Source
SHA-256 checksum
How to use checksums
28b66fc98eae900861255d4a9f34421bbc56f48c831d2acf10128bd222d20849
BLAKE2b-256 checksum
How to use checksums
e7f74d5e21fbd86cf5d0327d8a68e7b2ca1d3b228eb9b8d7e2c8dee89c1ba7ed
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 23, 2026.

Transparency log

Release files / cinderwave-0.1.0-py3-none-win_amd64.whl

Download URL cinderwave-0.1.0-py3-none-win_amd64.whl
Size 14.0 kB
Tags Python 3 Windows x86-64
SHA-256 checksum
How to use checksums
40991fe6aabeabac4adbf0a0e38e31682c253efaf774286fadb5bc4047c0c58f
BLAKE2b-256 checksum
How to use checksums
120abb10e7e86babbbeeb759838fe067327711902925ea1fc6d74c5ee7155992
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 23, 2026.

Transparency log

Release files / cinderwave-0.1.0-py3-none-manylinux_2_28_x86_64.whl

Download URL cinderwave-0.1.0-py3-none-manylinux_2_28_x86_64.whl
Size 12.2 kB
Tags Linux glibc 2.28+ x86-64 Python 3
SHA-256 checksum
How to use checksums
5937cdd9a4c090c36193ed63bf216fadbd118389805040f35b773346c7736bdd
BLAKE2b-256 checksum
How to use checksums
c5b749da93e853e809b24a93a0af8a608add3b61db05b3b964846ab1ec00f748
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 23, 2026.

Transparency log

Release files / cinderwave-0.1.0-py3-none-macosx_14_0_arm64.whl

Download URL cinderwave-0.1.0-py3-none-macosx_14_0_arm64.whl
Size 9.5 kB
Tags Python 3 macOS 14.0+ ARM64
SHA-256 checksum
How to use checksums
d266885a1525f9924763d70721b9c0636bbccf3455f32f84b9c84b0cb01b6c6c
BLAKE2b-256 checksum
How to use checksums
1f39b1a8aaf2ce03883f24ed4c8dd08937ceb2b9f7ec5c5da87c51dab036f375
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Jul 23, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

0.1.0 This release

4 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page