Sound Byte Libs 1ee2ca6
C++ firmware library for audio applications on 32-bit ARM Cortex-M processors
Loading...
Searching...
No Matches
Sound Byte Libs Roadmap

‍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