Last updated: 2025-12-17 (USB CDC complete, IRQ servicing planned)
Milestone Philosophy
Each milestone delivers a vertical slice - something you can actually use, not just a completed layer. Milestones are sequenced by dependencies: you can't stream audio without DMA, you can't do V/Oct without ADC.
Notation:
→ means "unlocks" or "enables"
- Items marked with platform tags like
[RP2350] are platform-specific work
M0: Foundation ✓
Theme: Prove the architecture works Done when: Hello-blinker runs on multiple platforms with validated contracts
| Deliverable | Status |
| GPIO driver with SFINAE validation | ✓ Complete |
| Timer driver with SFINAE validation | ✓ Complete |
| sloth hardware resolver | ✓ Complete |
| Hardware manifest system (MCU + Board) | ✓ Complete |
| RP2040, RP2350, STM32H750 support | ✓ Complete |
| Binary size tracking in CI | ✓ Complete |
Unlocks: M1 (we have a working HAL pattern to extend)
M1: Audio Pipeline
Theme: Make sound come out Done when: Hello-synth example plays a tone through I2S DAC
Accelerator (First!) ✓
| Deliverable | Status | Unlocks |
| UART driver (polling mode) | ✓ Complete | Debug logging everywhere |
| Debug logging integration | ✓ Complete | Printf over serial via sbl::log:: |
| UART interrupt mode | Not started | Non-blocking TX, better performance |
Why first? Debug output makes everything else faster to develop. Polling mode is done; interrupt mode is nice-to-have.
Critical Path
UART (debug) → DMA → I2S → Audio Codec Driver → Audio Output Component
| Deliverable | Status | Unlocks |
| DMA controller (circular buffer, half/full callbacks) | Not started | I2S, SPI, ADC streaming |
| I2S driver | Not started | Audio codec communication |
| Audio buffer infrastructure (aligned, double-buffered) | Not started | Real-time audio processing |
| WM8731/PCM3060 codec driver [sbl-hardware] | Not started | Daisy audio output |
| Audio Output component | Not started | M1 complete |
Supporting Work
| Deliverable | Status | Notes |
| PWM driver | Not started | Alternative audio out (no external DAC) |
| DAC driver (internal) | Not started | CV output, simple audio |
M2: Control Inputs
Theme: Respond to the outside world Done when: CV input controls oscillator pitch with V/Oct tracking
Critical Path
ADC → CV Input Component → V/Oct Calibration
| Deliverable | Status | Unlocks |
| ADC driver (polling mode) | ✓ Complete [STM32H7] | Pot reading, basic CV |
| ADC driver (DMA mode) | Not started | Multi-channel streaming |
| CV Input component (smoothing, scaling) | Not started | Modulation sources |
| Potentiometer component | Not started | User controls |
| V/Oct tracking | Not started | Pitch CV |
| V/Oct calibration (2-point, storage) | Not started | Accurate tuning |
Supporting Work
| Deliverable | Status | Notes |
| Button component (debounce, long press) | Not started | UI controls |
| Encoder component (quadrature, acceleration) | Not started | Menu navigation |
| Gate Input component (edge detection) | Not started | Triggers, gates |
| Tap Tempo | Not started | BPM from button taps |
M3: DSP Primitives
Theme: Build blocks for audio processing Done when: SVF filter with q31 fixed-point passes stability tests
Core Math
| Deliverable | Status | Notes |
| Fixed-point q15/q31 types | Not started | DSP foundation |
| Fast math (sin, cos, sqrt approximations) | Not started | LFOs, oscillators |
| LUT infrastructure | Not started | Generated constexpr tables |
| Pitch tables (V/Oct, MIDI→freq) | Not started | Oscillator tuning |
| Interpolation (linear, cubic, hermite) | Not started | Wavetables, delay lines |
Filters
| Deliverable | Status | Notes |
| SVF (State Variable Filter) | Planned | LP/HP/BP/Notch, the workhorse |
| One-pole (simple LP/HP) | Not started | Smoothing, DC blocking |
| Biquad | Not started | General-purpose IIR |
| DC Blocker | Not started | Remove DC offset |
Buffers
| Deliverable | Status | Notes |
| Delay Line (interpolated reads) | Not started | Effects foundation |
| Audio Buffer (DMA-friendly) | Not started | See M1 |
| Sample Buffer (with metadata) | Not started | Sampler support |
M4: Connectivity
Theme: Talk to the outside world Done when: MIDI note triggers envelope, clock syncs to external
MIDI
| Deliverable | Status | Unlocks |
| UART driver | ✓ Complete | Serial MIDI, debug |
| MIDI parser (running status, SysEx) | Not started | MIDI input |
| MIDI Input component | Not started | Note/CC handling |
| MIDI Output component | Not started | Sequencer output |
| MIDI Clock (send/receive) | Not started | Tempo sync |
Storage
| Deliverable | Status | Notes |
| SPI driver | Not started | SD cards, external DACs |
| microSD (SPI mode) | Not started | Sample storage, presets |
| Flash storage (internal) | Not started | Calibration, small presets |
| Preset storage system | Not started | Save/load structured data |
| Wear leveling | Not started | Flash longevity |
USB
| Deliverable | Status | Notes |
| USB CDC (virtual serial) | ✓ Complete [RP2350] | TinyUSB integration, hello-usb-cdc example |
| USB device stack | In progress | TinyUSB on RP2xxx, platform-dependent |
| IRQ-driven USB servicing | Not started | Auto tud_task() via timer IRQ, cross-platform |
| USB MIDI | Not started | Modern connectivity |
| USB Audio Class | Not started | Audio interface mode |
M5: Widgets
Theme: High-level building blocks Done when: Can build a complete voice (VCO→VCF→VCA→Env)
Sound Sources
| Deliverable | Status | Notes |
| Wavetable Oscillator | Not started | LUT-based, interpolated |
| Band-limited Oscillators | Not started | Anti-aliased saw/square/pulse |
| Noise Generator | Not started | White, pink, brown |
| FM Operator | Not started | 2-op, 4-op |
Modulation
| Deliverable | Status | Notes |
| ADSR Envelope | Not started | The classic |
| AD/AR Envelopes | Not started | Simpler variants |
| LFO | Not started | Multiple waveforms, sync |
| Slew Limiter | Not started | Portamento, lag |
Effects
| Deliverable | Status | Notes |
| Delay | Not started | Basic delay line |
| Chorus/Flanger | Not started | Modulated delay |
| Reverb (plate) | Not started | Classic algorithm |
| Distortion | Not started | Soft clip, waveshaping |
| Compressor/Limiter | Not started | Dynamics |
Utilities
| Deliverable | Status | Notes |
| VU/Peak/RMS Meters | Not started | Signal monitoring |
| Sample Rate Converter | Not started | Polyphase resampling |
| Pitch Detector | Not started | Tuner, pitch tracking |
M6: Production Ready
Theme: Polish for real-world use Done when: First Eurorack module ships
Eurorack Integration
| Deliverable | Status | Notes |
| Gate vs Trigger detection | Not started | Auto-detect input type |
| Normalled jack detection | Not started | Detect cable insertion |
| Clock div/mult | Not started | Integer and fractional |
| Reset/Run handling | Not started | Standard protocol |
Firmware Update System
| Deliverable | Status | Notes |
| A/B partitioning | Not started | Automatic rollback on boot failure |
| Boot config and slot management | Not started | BootConfig struct, slot swap |
| UART transport | Not started | Development/factory updates |
| MIDI SysEx transport | Not started | Eurorack standard (MI-compatible) |
| sbl-update host tool | Not started | Python CLI for updates |
| UF2-only mode [RP2xxx] | Not started | Simple modules, no A/B |
| Bootloader self-update | Not started | Dual-copy with atomic swap |
| Optional signature verification | Not started | Ed25519, opt-in |
See FDP-010 for detailed design.
System Robustness
| Deliverable | Status | Notes |
| Watchdog timer | Not started | Auto-recovery |
| Fault handlers | Not started | HardFault, graceful recovery |
| CPU load monitoring | Not started | Performance headroom |
| Factory reset | Not started | Button combo restore |
Multi-core [RP2350, STM32H7]
| Deliverable | Status | Notes |
| Core affinity | Not started | Pin tasks to cores |
| Inter-core communication | Not started | FIFO, shared memory |
| Audio/Control split | Not started | Audio on core 1, UI on core 0 |
Dependency Graph
M0: Foundation
↓
├── M1: Audio Pipeline ──→ M5: Widgets
│ ↓
│ M3: DSP Primitives
│
├── M2: Control Inputs ──→ M5: Widgets
│
└── M4: Connectivity
↓
M5: Widgets
↓
M6: Production Ready
Current Focus
Active work items (pulled from milestones above):
- [x] UART driver (polling) - accelerator complete
- [x] Debug logging - hello-uart example working
- [x] ADC driver (polling) - STM32H7 complete, hello-adc example working
- [x] USB CDC - hello-usb-cdc example working on RP2350
- [ ] IRQ-driven USB servicing - cross-platform auto tud_task()
- [ ] DMA controller - critical path for M1 audio
- [ ] I2S driver - depends on DMA, needed for audio codec
Recently Completed
- [x] USB CDC working (hello-usb-cdc on RP2350) - December 2025
- [x] USB CDC infrastructure (TinyUSB integration, RP2350) - December 2025
- [x] sbl CLI tool (project init, info commands) - December 2025
- [x] cecrops Phase 1 (SVD parsing, patches, code gen, 82 tests) - December 2025
- [x] ADC driver (polling mode, STM32H7) - December 2025
- [x] Module manifest support in sloth - December 2025
- [x] Daisy Pod module manifest - December 2025
- [x] UART driver (polling mode) - December 2025
- [x] Debug logging system (
sbl::log::) - December 2025
- [x] sloth schema-driven refactor (FDP-007) - December 2025
- [x] Pydantic models with schema validation (ADR-004) - December 2025
- [x] Timer SFINAE validation - December 2025
- [x] Binary size tracking CI - December 2025
- [x] STM32H750 bare-metal (Daisy Seed) - December 2025
- [x] Unified Hardware Manifest Schema - December 2025
- [x] sloth hardware resolver - December 2025
- [x] Include structure and namespace refactor - December 2025
- [x] Platform contract validation with SFINAE - August 2025
- [x] Dual-layer platform architecture (MCU + Board) - August 2025
Vision Notes
Part of our long term vision is to provide a library pair (core + dsp) that offers a really nice developer and board bring up experience. We want to support both off the shelf board manifests, which will hopefully be developed by the community over time and shared, plus custom manifests for RYO boards. The library aims to provide an enterprise quality API for building embedded audio applications on ARM Cortex-M based systems.
Design Principles
- Layer API should be composable - Wire up VCO → VCF → VCA chains easily
- Separate Core and DSP libs - Apps that don't need DSP don't get bloat
- Easy project integration - CMake import, maybe PlatformIO later
- Bare metal first - No vendor HAL dependencies, SVD-generated registers
- Every byte matters - We celebrate small binaries
Long-term Business Items
| Item | Status | Notes |
| Register MIDI Manufacturer ID | Future | Required for official SysEx messages; use educational range until then |