Sprint Goal: Deliver an end‑to‑end MVP that converts uploaded audio to playable guitar tablature in the browser, with automated tests and a short eval script. Ready for dissertation demo & write‑up.
Day 1 (Wed 13 Aug): Discovery & Setup
- Read code, align API contract (
/upload-audio), verify deps, create.envfor client. - Define acceptance criteria per story, triage gaps (CREPE, Music21, VexFlow usage).
- ✅ Definition of Done (DoD) created for sprint.
Day 2 (Thu 14 Aug): Backend upload + pipeline
- Implement FastAPI
/upload-audioroute (save → preprocess → detect_pitch → map_notes_to_tab). - Add CORS, error handling, file size/type checks.
- Update
requirements.md(crepe, librosa, music21, numpy, soundfile, scipy). - ✅
tests/test_upload.pygreen on happy path (local WAV).
Day 3 (Fri 15 Aug): Pitch detection quality
- Implement
detect_pitch(CREPE) with confidence thresholding, return frame times. - Add unit test for pitch util (smoke + shape).
Day 4 (Mon 18 Aug): Note→Tab mapping
- Implement
map_notes_to_tab: standard tuning EADGBE, pick-lowsest‑fret heuristic, crude durations. - Add test for mapping on a short synthetic scale (E2…E4).
Day 5 (Tue 19 Aug): Frontend uploader
- Implement
TabUploader.jsx: file input, upload progress, status toasts. - Render tab with VexFlow
TabStavefromtab_detailed. - ✅ Manual E2E on local dev (WAV).
Day 6 (Wed 20 Aug): UX polish & errors
- Empty states, big files, timeouts, server-error rendering.
- .env (
VITE_API_URL) andREADMEquickstart.
Day 7 (Thu 21 Aug): Packaging & scripts
- Add
make dev&make testor npm/pip scripts. - Pre-commit hooks (Black/ruff/ESLint) optional.
Day 8 (Fri 22 Aug): Evaluation harness
- CLI: run pipeline on N files and dump CSV with timings + note counts (placeholder for F1 later).
- Prepare seed audio set (royalty-free).
Day 9 (Mon 25 Aug): Buffer & hardening
- Bugfixes, boundary cases (mono/stereo/44.1k mp3), memory.
- Log levels; return richer diagnostics.
Day 10 (Tue 26 Aug): Final QA + handover
- Verify rubric‑aligned artefact behaviour (demo flow).
- Freeze versions, tag release, produce “How to run” + “Known limitations”.
-
BE‑1 Upload endpoint — As a user I can POST an audio file and get JSON with
tab_detailedand a preview VexTab line.
Acceptance: HTTP 200, keys present; handles.wav/.mp3under 10MB; errors for bad mime. -
BE‑2 Pitch detection — Use CREPE with confidence threshold; return
time/frequency/confidence/notes.
Acceptance: Arrays equal length;notesnot empty on pitched audio; timings monotonic. -
BE‑3 Note→Tab mapping — Map note names to (string,fret) with EADGBE; include
durationandtimestamp; formatvextabtoken like"q 5/1".
Acceptance: For known notes E2/E4 mapping is valid; no fret > 20. -
FE‑1 Uploader UI — Drag‑drop or file input, progress 0–100, error states.
Acceptance: Uploads a demo WAV and shows status. -
FE‑2 Tab rendering — Render using VexFlow TabStave from
tab_detailed.
Acceptance: At least 1 measure drawn; no JS errors on empty/malformed notes. -
QA‑1 Smoke tests —
pytestpassing for upload and pitch utils.
Acceptance: CI/pass locally. -
EV‑1 Eval harness — Script to batch process audio and save CSV with runtime and counts.
Acceptance: Produces CSV with one row per input.
- CREPE performance/compatibility: If install issues, fall back to
librosa.pyinas contingency; cache wheel locally. - Polyphony accuracy: Keep scope to “single‑guitar dominant” sources; document limitation; expose threshold knob.
- VexTab vs VexFlow: We render via VexFlow TabNotes directly to avoid VexTab dependency.
- Large files: Enforce size limits (10–15MB), pre‑trim guidance.
- End‑to‑end demo works locally (Vite + Uvicorn).
pytestgreen for provided tests.- README quickstart works on a clean machine.
- Known‑issues section documents limitations and future work hooks.