Audio Claudio v0.1.0
Audio Claudio v0.1.0 — the monophonic piano transcriber MVP.
Audiō Claudiō, "I hear, by means of Claude." A real-time monophonic piano transcriber in C# / .NET 10 (LTS): audio comes in from a microphone or a WAV file, note events come out, and the transcription is emitted as MIDI + MusicXML with synthesized playback. Public domain (UNLICENSE).
Built in open, spec-driven collaboration with Claude Code across all 13 build-spec steps (0–12). Hexagonal ports & adapters, with a domain that is provably clock-free, integer-sample-timed, and deterministic — the microphone is just one more adapter, added last, over a pipeline that was already proven correct against files.
The headline — the closed-loop trial balance
The repo contains both halves of the round trip (a transcriber and a synthesizer), so the synthesizer is the test oracle — no hand-labelled ground truth is ever needed:
generate a random constrained score → synthesize it → transcribe it back → demand the score returns, within tolerance.
transcribe ∘ synthesize ≈ id, stated honestly:
- Note count, pitch, and onset recovered exactly across MIDI 33–96 (checked every push + a 1,000-case nightly).
- Duration additionally exact across MIDI 33–71 — the corpus is capped to physically-audible durations, because a real piano's high notes decay before a long note ends (asking for a sustain the audio lacks would test the SoundFont, not the transcriber).
- A rare (~0.4%) YIN octave-error / missed-onset residual, tracked by the nightly and documented — not a false 100% claim.
311 tests green (unit + property + closed loop) on a fresh CI clone.
Honest scope
Monophonic; declared (not estimated) tempo; single staff. See README.md for the full claim and limitations and DECISIONS.md for the design log. Open human follow-up: the manual MuseScore-load check (R11.2). Phase-2 (polyphony via a neural model behind the same ITranscriber port, tempo estimation, pYIN pitch-hardening, treble/bass split) is out of MVP scope.
Includes the MusicXML barline-duration fix: a note cut at a barline (or an odd rest gap) whose length isn't a single standard note value is now spelled as tied standard values / consecutive rests, rather than crashing the writer — surfaced by the first live listen run.
🤖 Built in collaboration with Claude Code.