File size: 8,964 Bytes
eb1a122
 
b8fa9bf
 
eb1a122
 
b8fa9bf
eb1a122
 
 
3e9170f
 
 
 
 
b8fa9bf
eb1a122
f08496f
 
 
3e9170f
f08496f
 
 
 
3e9170f
f08496f
3e9170f
 
f08496f
3e9170f
 
 
 
 
0b5f0f0
 
3e9170f
 
 
 
 
f08496f
e33cc90
 
 
 
 
 
 
 
 
 
 
 
 
 
eb1a122
 
 
 
e33cc90
 
0b5f0f0
 
e33cc90
eb1a122
 
 
 
 
 
 
 
 
 
 
b8fa9bf
 
 
 
 
eb1a122
 
 
 
 
 
 
 
 
0b5f0f0
 
 
 
 
eb1a122
 
b8fa9bf
 
 
 
 
 
 
 
 
 
 
f08496f
eb1a122
f08496f
eb1a122
 
 
e33cc90
3e9170f
eb1a122
 
b8fa9bf
 
3703c4e
 
 
 
 
3e9170f
 
3703c4e
 
 
 
 
0b5f0f0
 
 
 
 
 
 
 
 
 
 
 
 
 
8c10624
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7f1f066
 
 
 
 
 
 
 
 
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
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
# Custom UI replacement

Last updated: 2026-05-12

## What changed

The active interface is a custom browser UI served from `web/` by the FastAPI app in `app.py`. The old Gradio files live in `legacy/` and are no longer used by the active application.

## UX goals

1. Match the supplied minimal reference image as the default view: file identity, one purple extract action, large waveform, compact right controls, and sample cards.
2. Keep the first screen focused on extraction and audition, not pipeline/debug/editor internals.
3. Preserve advanced workstation features behind a single secondary `Review & edit` workbench.
4. Keep stage timing, logs, run history, and semantic supervision available without dominating the default layout.
5. Make `stem=all` and `online_preview` available as advanced presets instead of primary controls.
6. Keep the frontend deployable without a JavaScript build step until the interaction model stabilizes.


## Pass 6 visual simplification

The UI was first restyled to the supplied minimal reference direction:

- light native-feeling canvas instead of the previous dark dashboard;
- compact top bar with file selector/status and one primary purple `Extract Samples` action;
- large waveform-first workspace with colored lollipop onset markers;
- right-side control card for the primary extraction decisions;
- advanced DSP/model parameters moved into a collapsible panel;
- representative samples rendered as auditionable cards with waveform thumbnails;
- pipeline, run history, supervision, and raw tables kept available as collapsible utility panels.

## Pass 7 reference-alignment hardening

This pass closed the visual fidelity gaps from the previous approximation:

- removed the visible waveform header so the canvas is quiet like the reference image;
- replaced separate native stem/reconstruction audio controls with one minimal transport row: play button, time, progress line, and Source/Stem/Reproduced preview modes;
- renamed the right card to `Common controls` and limited it to stem, hit sensitivity, sample groups, plus fast-preview/best-quality presets;
- collapsed pipeline/history/supervision/tables into one `Review & edit` workbench below the sample cards;
- hid selected-hit/sample audio elements from the default layout while preserving click-to-audition behavior;
- tightened card spacing, border radii, font scale, waveform height, and sample-card proportions to better match the supplied image.

The UI is still not a pixel-for-pixel clone because it must remain functional across arbitrary audio files and preserve the project’s editing tools, but the default screen is now intentionally aligned with the reference composition.


## Pass 8 fixed workstation layout

This pass responds to the no-scroll workstation requirement and the missing-upload affordance:

- the document body is fixed to the viewport with `overflow: hidden`;
- the app uses a top bar, left sidebar, center workspace, right sidebar, and bottom dock;
- pipeline/history/selection tools moved into the left sidebar;
- extraction/export/advanced controls moved into the right sidebar;
- semantic review/edit tools and raw tables moved into the bottom bar;
- all long content now scrolls only inside its own panel;
- the upload affordance is now an explicit `Upload audio` button in the top bar;
- dropping a file anywhere on the app loads it and shows a full-screen drop overlay while dragging.

## UI structure

| Area | Purpose |
|---|---|
| Top bar | App identity, explicit upload button, selected-file metadata, backend status, and one primary purple `Extract Samples` action. |
| Left sidebar | Source/drop guidance, selected-hit/sample context, pipeline logs, and run history. |
| Center workspace | Quiet waveform canvas, Source/Stem/Reproduced transport row, and representative sample cards. |
| Right sidebar | Common controls, exports, and collapsed advanced parameters grouped by stem separation, hit detection, grouping, export, and cache. |
| Bottom dock | Review/edit semantic supervision tools and raw tables in expandable panels. |

## Frontend implementation

Files:

- `web/index.html`
- `web/styles.css`
- `web/app.js`

The frontend uses modern browser APIs directly:

- `fetch` for API calls.
- `FormData` for upload.
- `<audio>` for previews.
- `<canvas>` for waveform/onset visualization.
- CSS grid, responsive layout, custom properties, and backdrop filters for layout/polish.

No Gradio runtime, iframe, or generated UI framework is involved.

## Backend integration

The frontend creates a job with `POST /api/jobs`, then polls `GET /api/jobs/{id}` until completion. Completed jobs expose direct download URLs for:

- sample pack ZIP
- MIDI reconstruction
- source mix WAV
- target stem WAV
- non-target context bed WAV
- target reconstruction WAV
- full-context reproduced mix WAV
- individual sample WAVs

The run history panel calls `GET /api/jobs` and can reload any completed manifest still present under `.runs/`.

## Clustering UX

Two modes are exposed:

| Mode | UX intent |
|---|---|
| `batch_quality` | Slower, final-quality clustering using all-pairs similarity plus agglomerative clustering. |
| `online_preview` | Faster near-realtime-style clustering using prototype assignment. Best for quick iteration after bypassing Demucs. |

## Why SSE progress with polling fallback instead of websockets

The active UI uses Server-Sent Events through `GET /api/jobs/{job_id}/events` for stage/log updates, with the older polling loop retained as a fallback. WebSockets are unnecessary here because the pipeline is stage-oriented and the frontend does not need bidirectional streaming while extraction runs.

## Remaining UI improvements

- Add waveform zoom/pan while keeping the fixed workstation layout uncluttered.
- Add inline cluster merge/split/relabel workflows inside `Review & edit`.
- Add A/B comparison between parameter runs.
- Add downloadable timing report per job.
- Add filters/search to the run history browser.
- Convert the frontend to TypeScript when the UX stops moving quickly.

## Latest review UI additions

The current UI now includes:

- Hidden selected-hit and selected-sample audio elements for click-to-audition without visible player clutter.
- Clickable waveform onset markers that select and audition the nearest detected hit.
- A detected-hit review table backed by `review/hits/*.wav` artifacts.
- Audition buttons for representative sample rows.
- Server-sent-events job progress via `GET /api/jobs/{job_id}/events`, with polling fallback.

This still stops short of destructive editing. The next UI layer should store edits as manifest overlays, then call a re-export endpoint that reuses cached hit audio instead of rerunning Demucs/onset detection.


## Pass 9 reproduced audio and parameter hierarchy

This pass made the audio preview and control model more explicit:

- `reconstruction.wav` is now a full-context reproduced mix, not just the sample-triggered target layer.
- `target_reconstruction.wav` preserves the sample-only target reconstruction for focused inspection.
- `source.wav`, `stem.wav`, and `context_bed.wav` are exported as explicit layers.
- The transport has Source, Stem, and Reproduced preview buttons and switches to Reproduced after extraction.
- The right sidebar now separates Common controls from Advanced parameters.
- Advanced parameters are grouped by pipeline stage: stem separation, hit detection, grouping, export/cache.

See `docs/REPRODUCED_AUDIO_AND_PARAMETERS.md`.

## Pass 10 clean-default refinement

This pass responds to the UI being too cluttered after the workstation and reproduced-audio additions.

Changes:

- all non-essential side/bottom panels are collapsed by default;
- the bottom dock is compact until a review/table tool is opened;
- top-bar controls are shorter and visually lighter;
- common controls hide explanatory copy and show only the core knobs;
- pipeline logs, run history, exports, supervision, and raw tables remain present but opt-in;
- the no-scroll workstation constraint is preserved.

See `docs/CLEAN_DEFAULT_UI.md`.


## Immediate waveform and extraction progress update

The default workflow now starts with visible feedback: selecting or dropping a file causes the browser to decode the uploaded audio and render a peak-envelope waveform immediately. This happens before `/api/jobs` is called. The user can play the uploaded source through the transport while choosing common controls.

During extraction, the waveform is reused as the progress surface. The backend sends a real `progress` object through the normal job payload and SSE stream. The frontend clips an accent-colored copy of the waveform from the left to exactly that progress fraction and leaves the remaining waveform neutral. No estimated time progress is animated.

A compact `Start here` panel was added to the left sidebar to make the sequence obvious: Load audio → Set controls → Extract → Review/export.