Depends on #54 (init-audio + inpaint-range).
Problem
There is a hard gap between SA3's two roles today: pads are ≤32 s small-DiT loops dropped into slots (M18, ADR-0012), and tracks are minutes-long medium-DiT compositions a deck plays back (M19, ADR-0013) — but you cannot promote one to the other. A loop that is working in the booth cannot become the next track; a captured freeze of a great moment cannot be extended into something you mix into. SA3 can bridge this: with --init-audio (trimmed/zero-padded to --seconds) plus --inpaint-range over the silent tail, the medium DiT can continue a seed clip into a full-length track.
Proposed approach
A "grow into a track" action on a loop slot / freeze / library sample: take its PCM (read_loop_slot / capture_sample, src-tauri/src/commands.rs:565,758), request a medium-DiT render seeded by it (init-audio padded to the target length, inpaint the region beyond the seed so the model composes a continuation that opens from the seed), and file the result into the songs/track flow (ADR-0013) so it loads on a playback deck with beatgrid + cues. A prompt steers where the continuation goes ("build this into a rolling techno track"). Whether this rides the /api/render Magenta-worker path or a track-kind /api/generate is settled in #54's render decision.
Acceptance criteria
- From a loop/freeze/sample, a user composes a full-length track whose opening audibly continues the seed (not an unrelated track), with a prompt steering the rest.
- The result enters the track/songs library (ADR-0013) and loads on a playback deck with the normal beatgrid/cue treatment.
- Length respects the medium-DiT ceiling (
TRACK_MAX_SECONDS, sa3.py:26); the long render is deadline-scaled (render_timeout_for) and degrades honestly on failure (ADR-0012/0013).
- Strings via i18n; house style;
npx tsc -p tsconfig.app.json --noEmit clean.
Scope & non-goals
In scope: seed-to-track continuation and filing into the track flow. Non-goals: the plumbing (#54); seamless infinite outpaint chaining (the autopilot issue); transitions between two decks (the transitions issue).
Depends on #54 (init-audio + inpaint-range).
Problem
There is a hard gap between SA3's two roles today: pads are ≤32 s small-DiT loops dropped into slots (M18, ADR-0012), and tracks are minutes-long medium-DiT compositions a deck plays back (M19, ADR-0013) — but you cannot promote one to the other. A loop that is working in the booth cannot become the next track; a captured freeze of a great moment cannot be extended into something you mix into. SA3 can bridge this: with
--init-audio(trimmed/zero-padded to--seconds) plus--inpaint-rangeover the silent tail, the medium DiT can continue a seed clip into a full-length track.Proposed approach
A "grow into a track" action on a loop slot / freeze / library sample: take its PCM (
read_loop_slot/capture_sample,src-tauri/src/commands.rs:565,758), request a medium-DiT render seeded by it (init-audio padded to the target length, inpaint the region beyond the seed so the model composes a continuation that opens from the seed), and file the result into the songs/track flow (ADR-0013) so it loads on a playback deck with beatgrid + cues. A prompt steers where the continuation goes ("build this into a rolling techno track"). Whether this rides the/api/renderMagenta-worker path or a track-kind/api/generateis settled in #54's render decision.Acceptance criteria
TRACK_MAX_SECONDS,sa3.py:26); the long render is deadline-scaled (render_timeout_for) and degrades honestly on failure (ADR-0012/0013).npx tsc -p tsconfig.app.json --noEmitclean.Scope & non-goals
In scope: seed-to-track continuation and filing into the track flow. Non-goals: the plumbing (#54); seamless infinite outpaint chaining (the autopilot issue); transitions between two decks (the transitions issue).