C++ firmware for the Pi Pico Random Looping Sequencer Eurorack module. Host-agnostic engine + a macOS playground for development; a Pico-SDK host is planned (see "What's intentionally not here" below).
This is a rewrite of the MicroPython firmware that lives in the parent repo
under Software/. The MicroPython version is still the running firmware on
hardware today; this C++ tree is the path forward.
A native macOS playground that runs the same rls::SequencerEngine class that
will (later) be linked into a Pico-SDK firmware host. No hardware required.
Built mirroring the pattern documented in the vault note Quick Tips/Simulating module UI on macOS and the reference implementation in
DIYSynthMNL/vcdo-daisy. Differences from that reference:
- No PortAudio. The sequencer is logic-only; the note's adaptation table
says to replace audio with a
std::chronotick thread. That's whatClockThreadMaindoes — sleeps to the next half-period at the configured BPM and pulses the engine'sOnClockEdge. - 6×8 bitmap font in
FakeOled.h. vcdo-daisy didn't need text on its fake OLED (just a scope); a sequencer needs "STEP 05/16 BPM 60" so the font is inlined here.
One-time:
brew install glfw pkg-configThen:
cd Firmware
make # first run clones Dear ImGui v1.91.0 into ./imgui/
./playground
# or
make run| Window | Contents |
|---|---|
| Sequencer Controls | Transport, BPM, scale combo, starting note, octaves, probabilities, modes |
| Simulated OLED (128×64) | Header bar, status line, 16-step grid (two rows of 8 cells). Current step is filled; trigger-on cells are outlined; out-of-range cells are a single centre pixel. Status text below shows step / DAC / TRIG state |
| Key | Action |
|---|---|
S |
Toggle internal clock |
G |
Manual clock pulse (works whether internal clock is running or not) |
R |
Reset engine (clears CV/trig sequences to defaults, current step to 0) |
Esc / Q |
Quit |
All other params are driven via ImGui widgets in the Controls window.
| File | Purpose |
|---|---|
SequencerEngine.h/.cpp |
Host-agnostic engine. No <machine>, no GPIO, no pico/stdlib.h. Port of Software/main.py |
Scales.h |
C++ port of Software/lib/mcp4725_musical_scales.py — 46 scale intervals + BuildScale() helper |
FakeOled.h |
128×64 monochrome buffer with line/rect/text primitives. 6×8 inline bitmap font |
playground.cpp |
macOS host: GLFW + Dear ImGui window, clock thread, key handling, OLED render |
Makefile |
macOS-only build recipe (clones ImGui on first run) |
- Pico-SDK firmware host (
main.cpp). That's the next chunk of work. When written, it lives next to this code and links the sameSequencerEngine.{h,cpp}andScales.h. The engine API takes anow_msargument exactly so the same code runs under both hosts. - The hardware menu UX. The playground uses ImGui sliders directly to drive params — it's for engine development, not menu UX testing. The on-OLED menu remains the Pico host's responsibility.
macOS 25.3 (Darwin), Apple clang 17, glfw 3.4, Dear ImGui v1.91.0.