Spaces:
Sleeping
Sleeping
File size: 3,513 Bytes
eb1a122 b8fa9bf eb1a122 b8fa9bf eb1a122 b8fa9bf eb1a122 b8fa9bf eb1a122 b8fa9bf eb1a122 b8fa9bf eb1a122 b8fa9bf eb1a122 b8fa9bf eb1a122 b8fa9bf eb1a122 b8fa9bf | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | # Project review
Last updated: 2026-05-12
## Summary
The project has evolved from a Gradio-driven prototype into a usable FastAPI + custom frontend extraction workstation. The core DSP pipeline is still compact and script-oriented, but it now has a clearer boundary between API/UI orchestration (`app.py`), timed pipeline execution (`pipeline_runner.py`), and lower-level sample extraction (`sample_extractor.py`).
## What is strong
1. **Useful core pipeline**: stem extraction, onset detection, classification, clustering, selection, synthesis, MIDI rendering, and packaging are all present.
2. **Small deployable surface**: active runtime is FastAPI plus static files; no frontend build is required.
3. **Good local iteration path**: `stem=all` bypasses Demucs for fast tuning.
4. **Per-stage timing**: every job manifest records stage durations and details.
5. **Artifacts are explicit**: stem WAV, reconstruction WAV, MIDI, sample WAVs, ZIP, and manifest are written per run.
6. **Legacy preservation**: old Gradio apps remain available under `legacy/` without being active.
7. **New near-realtime path**: `online_preview` clustering gives a practical alternative to all-pairs batch clustering.
## Main risks
1. **Interactive editing is missing**: users can inspect outputs but cannot correct onsets or cluster decisions in the UI yet.
2. **Job state is process-local**: active jobs disappear from memory on restart; completed history is recovered from manifests only.
3. **Progress is stage-level**: Demucs and clustering do not expose fine-grained progress.
4. **Frontend is plain JavaScript**: good for speed, weaker for long-term maintainability than TypeScript modules/tests.
5. **Demucs cost remains dominant**: source separation is necessarily offline; disk cache mitigates repeated runs but not first-run latency.
6. **DSP code is dense**: `sample_extractor.py` is effective but would benefit from smaller modules and stronger tests.
## Development decisions made
| Decision | Rationale |
|---|---|
| Replace Gradio with FastAPI/static UI | More control over workflow, layout, artifacts, and progress display. |
| Keep no-build frontend for now | Fastest robust replacement; avoids adding Node/Vite just to ship the first custom UI. |
| Preserve Gradio in `legacy/` | Avoids data loss and gives reference behavior. |
| Add `pipeline_runner.py` | Keeps API orchestration separate from DSP primitives. |
| Add disk cache in pipeline layer | Avoids invasive Demucs changes and caches both full mix and stems. |
| Add `online_preview` rather than replacing batch clustering | Preserves final-quality path while adding a near-realtime option. |
## Current implementation quality
| Area | Rating | Notes |
|---|---:|---|
| Extraction functionality | Good | Core path works on synthetic tests. |
| UI/UX foundation | Good | Custom flow is much better than generic Gradio controls. |
| Realtime architecture | Partial | Online clustering exists; streaming onset/audio pipeline does not. |
| Documentation | Good | Feature/task/progress/API/timing docs are now embedded. |
| Test coverage | Basic | Smoke tests exist; no formal unit/browser tests yet. |
| Maintainability | Medium | Better boundaries now, but DSP module remains dense. |
## Recommendation
Next development should not add more global parameters. It should add an editing loop: audition detected hits, manually fix bad onsets, merge/split clusters, relabel samples, then repack from edited state without rerunning expensive stages.
|