A front-end for the full trumpet workflow — from live recording to segmented takes, pitch-accurate transcription, and printable music charts. Drop a file in, get a chart out.
01 — Ingest
The problem starts with the file.
A 45-minute live recording of practice or a gig. One track. Dozens of fragments worth keeping. The workflow has to start by making sense of what's already there.
Drop audio or video file — WAV, MP3, FLAC, MOV, MP4. Drag onto the browser window or click to browse. No upload limit in local mode; cloud mode streams chunked to the API.
↓
Silence segmentation — pYIN / librosa splits the recording at silence gaps below –42 dB for longer than 600ms. Results shown as a scrollable waveform with labeled regions. Accept, merge, or re-cut by clicking.
↓
Select the takes worth keeping — click to flag segments as keeper, maybe, or discard. Bulk-select all above a quality threshold.
Why silence segmentation first? Whack-a-mole transcription of a full 45-minute file is slow and noisy. Cutting at silence boundaries gives you discrete, manageable units — each one a clean target for pitch detection and transcription. The segmentation pass is the one that requires the most UX attention.
02 — Transcribe
Three modes. Match the input to the output.
Whisper for speech and lyrics. pYIN + librosa for pitch. LilyPond for notation. Each mode has a distinct output target and toolchain.
A
Speech / Lyrics
Whisper Transcription
For rehearsal notes, talking between pieces, stage patter, or lyrics. Output: timestamped SRT/VTT subtitle file + plain text. Runs locally via faster-whisper or streams to the OpenAI Whisper API.
faster-whisper — local, GPU-accelerated, CTranslate2Whisper API — cloud fallback, no setupSRT / VTT — subtitle export
B
Monophonic Pitch
pYIN Pitch Detection
For clean trumpet lines — one pitch at a time. pYIN outputs a frequency + confidence per frame at 256-sample hop. Threshold at 0.85 confidence; below that, mark as vibrato, breath, or silence. Output: MIDI note numbers with onset times → MIDI file or LilyPond input.
For charting the form — where are you in the piece, where are the downbeats, where does the bridge hit. librosa beat tracker is the active path; madmom DBN runs as a parallel option if you need it. Output: bar numbers, form labels, and a click-track-aligned MIDI grid.
librosa beat — onset + tempo estimationmadmom DBN — legacy beat trackerlibrosa beat — onset + tempo estimationbar grid + form labels
03 — Chart
From MIDI to a chart you can read.
MIDI notes without timing are just a piano roll. The chart is the artifact — something you can print, mark up, and read at the stand.
LilyPond → PDF
MIDI → LilyPond notation input. Output is a typeset PDF — clean, readable, archival quality. Treble clef, concert pitch, bar lines at detected downbeats. Best for clean single-melody takes.
Web Notation (VexFlow)
Render the chart in-browser using VexFlow. Interactive — hover a note to hear it, click to transpose, export to MusicXML. For quick reads without a PDF round-trip.
MuseScore Import
Export as MusicXML. Open directly in MuseScore for engraving, transposition, part extraction, and MIDI playback. The PDF is the front-end deliverable; MuseScore is the editorial layer.
Annotation Layer
After the chart is generated, annotate in-browser — mark fingering, breath marks, dynamics, and section labels directly on the notation. Annotations persist as a JSON overlay, separate from the score itself.
A single-page app. Three panels. Drag a file in, navigate the results. No server required for local mode — all the heavy lifting happens in Web Workers and the browser AudioContext.
1
Left Panel — File + Waveform
Drop zone → segmented waveform
Web Audio API decodes the file into an AudioBuffer. Wavesurfer.js renders the waveform. Click any region to play. Segments are colored by quality flag (keeper / maybe / discard). Export selected segments as individual WAV files.
2
Center Panel — Transcription Output
Live mode: runs in a Web Worker
Whisper runs via the transformers.js ONNX pipeline in a Web Worker — no round-trip to a server. pYIN runs in a SharedArrayBuffer-enabled worker. Progress bar shows per-segment status. Output scrolls as it arrives.
3
Right Panel — Chart Preview
VexFlow renders the notation live
As MIDI notes are detected, they stream into the VexFlow renderer. The chart updates incrementally — watch the notes appear on the staff as pYIN detects them. Final chart is exportable as SVG, PDF (via html2canvas + jsPDF), or MusicXML.