Develop the full Daisy Pod spike so it can be flashed the moment the board arrives. Architecture: one shared engine, two front-ends. - pm-synth: make it `#![no_std]` (mirroring track-format), routing float math through `libm` so the SAME f32 code runs on the host and on the Daisy's Cortex-M7F (hardware FPU — no fixed-point port needed). Add `Player`, a self-running sequencer that owns the Synth + scheduled clicks and renders sample-by-sample, looping at the pattern boundary. Integer-only hot path (clicks pre-resolved to sample indices); exposes a `fired()` beat counter. Add SPIKE_PROGRAM/SPIKE_BARS as the shared source of truth. - synthrender: render the SAME Player to pm-daisy-preview.wav — the host-side "simulator". Bit-identical preview of the hardware output (before its codec); far more useful than chip emulation (Renode can't model the audio codec). - pm-daisy (new, workspace-excluded firmware): thin BSP binary for the Daisy Seed/Pod. embedded-alloc heap + board bring-up + SAI-DMA audio interrupt feeding Player::next_sample() into stereo frames, USER LED flashing per click. Audio loop follows the `daisy` crate's examples/audio.rs. Board revision (codec) is a Cargo feature; README documents matching it + both flash paths (probe-rs/RTT and USB DFU) + the QSPI-bootloader fallback. Verified without hardware: host build + preview render (48 kHz, onsets on the 8th-note grid at 124 BPM); firmware cross-compiles + links for thumbv7em-none- eabihf at ~87 KB (fits the 128 KB internal flash) across all three codec revisions; track-format conformance + `node tests/run.mjs` (47 pass) still green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
34 lines
1.7 KiB
TOML
34 lines
1.7 KiB
TOML
[package]
|
|
name = "pm-daisy"
|
|
version = "0.1.0"
|
|
edition = "2021"
|
|
description = "PM Daisy-Pod spike: plays the PolyMeter click engine (pm-synth Player) out the Daisy Pod's audio jack, flashing the Seed LED on each click. STM32H750 / Cortex-M7F. See docs/daisy-spike.md."
|
|
|
|
[dependencies]
|
|
cortex-m = "0.7"
|
|
cortex-m-rt = "0.7"
|
|
stm32h7xx-hal = { version = "0.16", features = ["stm32h750v", "rt", "revision_v"] }
|
|
# Daisy Seed board-support. The board REVISION is a feature (below) — it selects the right audio
|
|
# codec driver (AK4556 / WM8731 / PCM3060). Picking the wrong one = silence. See README.
|
|
daisy = { version = "0.10", default-features = false, features = ["defmt"] }
|
|
embedded-alloc = "0.6" # pm-synth's Player parses into Vec/String + allocates voices → needs a heap
|
|
defmt = "0.3"
|
|
defmt-rtt = "0.4" # logs over RTT, read by `probe-rs run` (a debug probe)
|
|
panic-probe = { version = "0.3", features = ["print-defmt"] }
|
|
pm-synth = { path = "../pm-synth" } # the click engine + the shared Player (host-verified)
|
|
track-format = { path = "../track-format" } # parse the program string into a Track
|
|
|
|
# ----- Board revision: pick ONE to match the Daisy Seed on your Pod (check the sticker / silkscreen).
|
|
# Default targets the Daisy Seed 1.1 (WM8731), the common recent revision. Override on the CLI, e.g.
|
|
# cargo build --release --no-default-features --features seed_1_2
|
|
[features]
|
|
default = ["seed_1_1"]
|
|
seed = ["daisy/seed"] # original Daisy Seed (AK4556 codec)
|
|
seed_1_1 = ["daisy/seed_1_1"] # Daisy Seed 1.1 (WM8731 codec)
|
|
seed_1_2 = ["daisy/seed_1_2"] # Daisy Seed 1.2 / Seed2 DFM (PCM3060 codec)
|
|
|
|
[profile.release]
|
|
opt-level = "s" # size — the STM32H750 has only 128 KB internal flash (see memory.x / README)
|
|
lto = true
|
|
codegen-units = 1
|
|
debug = 2
|