Skip to content

Stem curves play with real stems; transition editor details from DJ.Studio - #2

Merged
beneaze merged 3 commits into
mainfrom
stem-curves-and-transition-editor
Oct 17, 2026
Merged

beneaze merged 3 commits into
mainfrom
stem-curves-and-transition-editor

Conversation

@beneaze

@beneaze beneaze commented Oct 16, 2026

Copy link
Copy Markdown
Owner

Stem curves had no audible effect

When a stem separation from the library queue finished, the app reloaded the track's analysis, so the transition editor said the stems were there. But it kept the engine's cached copy of the track, which had been loaded without stems. Mix playback kept using that copy and only imitated the stem curves with volume and EQ.

  • TrackUpdated now drops the cached track, so the next load picks up the stems. It also redraws the open mix's timeline: a re-analysed grid moves beats and the tempo lane, which explains a flat 120 BPM lane seen after launch.
  • A stem file whose length doesn't fit the audio is now logged instead of dropped silently.
  • New engine test transition_stem_lanes_mute_each_stem_on_both_sides.

Before the fix, I checked the engine on a real imported mix (Selected Deep Summer Copy, transition 1). Flattening the stem curves changes the rendered output by about 0.25–0.30 RMS, so the engine itself was fine.

Transition editor details adopted from DJ.Studio

Sources: screenshots of DJ.Studio in use and its public help pages, as docs/clean-room.md allows. The toggle placement is already documented in docs/interop/djstudio.md §5.4. No new features; DJ.Studio's risers, loop effects, side-chain and per-column solo were left out.

  • Stem rows: the stem's colour fills the area under its gain curve. The waveform stays full size, grey over hatching where the stem is cut.
  • Stem toggles: they now sit outside the window, the outgoing track's at its end and the incoming track's at its start.
  • Equalizer category: holds Volume, Low, Mid and High; the separate Volume category is gone. Every column has a Manual entry, selected when a curve is hand-drawn; clicking it switches the timeline to drawing that curve. Outside the stems, the no-change mode is now called None.
  • Colours: column headers use the full stem or band colour, and the chosen mode is filled and outlined in it.
  • Lanes: the lane knobs show their value (dB / filter), and each track's unplayed audio (up to 16 s) is drawn faded beside its clip.
  • Auto-open: when the playhead enters a transition, by playing or seeking, that transition is selected and its settings open. This happens only on entering, and not while a mouse button is held.
  • Panel height: the Transition panel's minimum height goes from 130 to 230, so six entries and the no-stems warning fit.
  • Devctl: new tcat <category> command, used for the screenshots.

Testing

  • cargo clippy --workspace --all-targets -- -D warnings: clean
  • cargo test --workspace: passes
  • Checked in the running app with screenshots (devctl): stem rows, toggles, Equalizer columns, colours, and the auto-open on seeking into a transition (master volume at 0).

🤖 Generated with Claude Code

beneaze and others added 3 commits October 16, 2026 09:29
…tudio

Stem curves had no audible effect: when a library stem separation finished,
the app reloaded the track's analysis (so the editor showed stems) but kept
the engine's cached copy of the track, loaded without stems. Mix playback
kept using that copy and only imitated the curves with volume and EQ.
TrackUpdated now drops the cached track, and redraws the open mix's
timeline (a new grid moves its beats and tempo lane). A stem file whose
length doesn't fit the audio is logged instead of dropped silently. New
engine test: a transition lane mutes each stem on both sides.

Transition editor, from screenshots of DJ.Studio and its help pages
(docs/interop/djstudio.md §5.4):
- Stem rows: the stem's colour fills the area under its gain curve; the
  waveform stays full size, grey over hatching where the stem is cut.
- Stem on/off toggles sit outside the window, the outgoing track's at its
  end and the incoming track's at its start.
- Equalizer category holds Volume, Low, Mid and High; every column has a
  "Manual" entry (selected for hand-drawn curves, opens drawing) and
  "None" names the no-change mode outside the stems.
- Lane knobs show their value; each track's unplayed audio is drawn faded
  beside its clip.
- Column headers in full stem / band colours, the chosen mode filled and
  outlined in them.
- Entering a transition with the playhead selects it and opens its
  settings.

Devctl gains `tcat <category>` for screenshots of the editor.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…the app's look

Stem separation for mix playback covers only the parts stem automation plays
in (each stem transition's window and a track's own stem lanes, plus 3 s),
at the Fast quality: about 5 s per transition instead of ~2.5 min per track
at Best. They are separated automatically when a mix needs them, whatever
the background setting, kept in a partial stem file (<hash>.regions.stems.flac,
listing its chunks in CLUBCRAFT_CHUNKS) and replaced by complete stems at
the export quality before a render. The transition warning, "Stems missing"
and the imitation preview count those parts as stems.

- Savepoints: keep the mix under a name, go back or forward to any of them;
  none is deleted on the way, and an unsaved state is kept first. Stored in
  the library (mix_savepoints). Duplicate this mix in the Mixes menu.
- Opening another mix stops the preview of the previous one.
- Transport: the play button is centred; the groups never overlap and use
  compact labels when the window is narrow.
- Settings is a dialog in the app's look (panel, header, sidebar, segmented
  choices, checkboxes); Home's Go live / Open library no longer flicker on
  hover.
- Devctl: duplicate, savepoint, goto-savepoint; mix prefers an exact name.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@beneaze
beneaze merged commit 2632814 into main Oct 17, 2026
2 checks passed
@beneaze
beneaze deleted the stem-curves-and-transition-editor branch October 23, 2026 22:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant