Host renderer for the Cinderwave acid groovebox: bakes patterns to WAV through the same zero-dependency C++17 DSP core that runs on the RP2040 hardware.
Project description
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 && ctestit 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.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distributions
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file cinderwave-0.1.0.tar.gz.
File metadata
- Download URL: cinderwave-0.1.0.tar.gz
- Upload date:
- Size: 18.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
28b66fc98eae900861255d4a9f34421bbc56f48c831d2acf10128bd222d20849
|
|
| MD5 |
5bddbf61b34ec2a195cd18d8fef02d44
|
|
| BLAKE2b-256 |
e7f74d5e21fbd86cf5d0327d8a68e7b2ca1d3b228eb9b8d7e2c8dee89c1ba7ed
|
Provenance
The following attestation bundles were made for cinderwave-0.1.0.tar.gz:
Publisher:
pypi.yml on Makeph/cinderwave
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cinderwave-0.1.0.tar.gz -
Subject digest:
28b66fc98eae900861255d4a9f34421bbc56f48c831d2acf10128bd222d20849 - Sigstore transparency entry: 2226010007
- Sigstore integration time:
-
Permalink:
Makeph/cinderwave@f6b0e84d638b299c435aeb454b9bb514a3209413 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/Makeph
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi.yml@f6b0e84d638b299c435aeb454b9bb514a3209413 -
Trigger Event:
push
-
Statement type:
File details
Details for the file cinderwave-0.1.0-py3-none-win_amd64.whl.
File metadata
- Download URL: cinderwave-0.1.0-py3-none-win_amd64.whl
- Upload date:
- Size: 14.0 kB
- Tags: Python 3, Windows x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
40991fe6aabeabac4adbf0a0e38e31682c253efaf774286fadb5bc4047c0c58f
|
|
| MD5 |
2960f9d8e2ba55d5fb0049e50883be02
|
|
| BLAKE2b-256 |
120abb10e7e86babbbeeb759838fe067327711902925ea1fc6d74c5ee7155992
|
Provenance
The following attestation bundles were made for cinderwave-0.1.0-py3-none-win_amd64.whl:
Publisher:
pypi.yml on Makeph/cinderwave
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cinderwave-0.1.0-py3-none-win_amd64.whl -
Subject digest:
40991fe6aabeabac4adbf0a0e38e31682c253efaf774286fadb5bc4047c0c58f - Sigstore transparency entry: 2226010729
- Sigstore integration time:
-
Permalink:
Makeph/cinderwave@f6b0e84d638b299c435aeb454b9bb514a3209413 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/Makeph
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi.yml@f6b0e84d638b299c435aeb454b9bb514a3209413 -
Trigger Event:
push
-
Statement type:
File details
Details for the file cinderwave-0.1.0-py3-none-manylinux_2_28_x86_64.whl.
File metadata
- Download URL: cinderwave-0.1.0-py3-none-manylinux_2_28_x86_64.whl
- Upload date:
- Size: 12.2 kB
- Tags: Python 3, manylinux: glibc 2.28+ x86-64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5937cdd9a4c090c36193ed63bf216fadbd118389805040f35b773346c7736bdd
|
|
| MD5 |
e7e78ab895b85cb075d7b4731ddb0d83
|
|
| BLAKE2b-256 |
c5b749da93e853e809b24a93a0af8a608add3b61db05b3b964846ab1ec00f748
|
Provenance
The following attestation bundles were made for cinderwave-0.1.0-py3-none-manylinux_2_28_x86_64.whl:
Publisher:
pypi.yml on Makeph/cinderwave
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cinderwave-0.1.0-py3-none-manylinux_2_28_x86_64.whl -
Subject digest:
5937cdd9a4c090c36193ed63bf216fadbd118389805040f35b773346c7736bdd - Sigstore transparency entry: 2226145833
- Sigstore integration time:
-
Permalink:
Makeph/cinderwave@cf6f57ff2efbaa1e01699cd0b52e9053157bbbd9 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/Makeph
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi.yml@cf6f57ff2efbaa1e01699cd0b52e9053157bbbd9 -
Trigger Event:
push
-
Statement type:
File details
Details for the file cinderwave-0.1.0-py3-none-macosx_14_0_arm64.whl.
File metadata
- Download URL: cinderwave-0.1.0-py3-none-macosx_14_0_arm64.whl
- Upload date:
- Size: 9.5 kB
- Tags: Python 3, macOS 14.0+ ARM64
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
d266885a1525f9924763d70721b9c0636bbccf3455f32f84b9c84b0cb01b6c6c
|
|
| MD5 |
328bf227f613cd917d37eef4741c5e71
|
|
| BLAKE2b-256 |
1f39b1a8aaf2ce03883f24ed4c8dd08937ceb2b9f7ec5c5da87c51dab036f375
|
Provenance
The following attestation bundles were made for cinderwave-0.1.0-py3-none-macosx_14_0_arm64.whl:
Publisher:
pypi.yml on Makeph/cinderwave
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
cinderwave-0.1.0-py3-none-macosx_14_0_arm64.whl -
Subject digest:
d266885a1525f9924763d70721b9c0636bbccf3455f32f84b9c84b0cb01b6c6c - Sigstore transparency entry: 2226011175
- Sigstore integration time:
-
Permalink:
Makeph/cinderwave@f6b0e84d638b299c435aeb454b9bb514a3209413 -
Branch / Tag:
refs/tags/v0.1.0 - Owner: https://github.com/Makeph
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
pypi.yml@f6b0e84d638b299c435aeb454b9bb514a3209413 -
Trigger Event:
push
-
Statement type: