The firmware is now an actual metronome (not a static screen): - embedded-alloc heap → parses tracks with track-format on-device. - 4 built-in grooves; clock-driven from the Timer; audio clicks on the master lane's hits via the GP13 PWM (accent louder/longer), short edge-triggered pulses. - Controls: A = play/stop, B = grid/notation view; joystick (rotated 90° CCW) up/down = tempo +/-, left/right = prev/next groove. - Renders draw_metronome or draw_notation; a cheap draw_progress strip animates the bar position every frame (full redraw only on change → no flicker). - Robust: all input reads use unwrap_or (no panics in the loop) — addresses the self-test crash (likely an ADC unwrap on WouldBlock) and the continuous-buzzer. Compile + simulator verified (grid renders all 4 grooves incl. triplets/polymeter). NEEDS ON-DEVICE CHECK: audio timing, joystick directions, and that the crash is gone. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com> |
||
|---|---|---|
| .. | ||
| pm-kit | ||
| pm-ui | ||
| track-format | ||
| uisim | ||
| Containerfile | ||
| README.md | ||
| run.sh | ||
Rust port — track-format crate (Stage 1)
Pure parse/serialize codec for the track DSL, validated against the shared golden
vectors (tests/fixtures/track-format.json) — the third implementation alongside
engine.js and app.py. See docs/rust-port.md for the staged plan.
All tooling runs in a container (per the develop-in-container rule):
./rust/run.sh # cargo test — runs the conformance + idempotency suite
./rust/run.sh cargo build
./rust/run.sh bash # interactive shell in the crate