Composes with #54 but does not require it — this is a prompt-construction UI over the existing text path (frontend/src/deck/DeckColumn.tsx:243-1020).
Problem
Generation input is a raw freeform textbox + a length picker + an engine select (DeckColumn.tsx:243, the engine Select at :1018). Powerful, but unplayable mid-set: writing prose under the lights is slow and the results swing wildly. The Magenta side solved the analogous problem with the 2D style pad — up to 8 weighted prompt targets blended by distance (ADR-0004, "style is a weighted prompt blend"). SA3's text prompt deserves the same treatment: a curated, composable vocabulary instead of a blank box.
Proposed approach
A sound-palette builder over the existing /api/generate path: curated chips grouped by axis (genre / era / instrument / texture / space-&-reverb / energy) that compose into a prompt, named user-savable presets (loaded like style presets, App.tsx), and a mood XY-pad (reuse frontend/src/ui/XYPad.tsx) that interpolates between two or more palette corners — the SA3 echo of the style pad. The composed prompt stays visible and editable (never a black box). Pure frontend: prompt assembly only, no model/runtime change.
Acceptance criteria
- A user builds a generation prompt from chips/axes and a mood pad without typing prose; the composed prompt is shown and remains hand-editable.
- Palettes save/load as named presets and persist.
- The XY mood pad blends between palette corners and the blend is reflected in the composed prompt.
- Reuses existing primitives (
XYPad, Select, Panel, the preset machinery); strings via i18n; house style; npx tsc -p tsconfig.app.json --noEmit clean.
Scope & non-goals
In scope: the prompt-construction UX (chips, presets, mood pad). Non-goals: changing the generation backend; weighting via true latent blends (this composes text, not embeddings — a deliberate simplification vs. ADR-0011's audio embeddings); negative-prompt chips (the guidance issue).
Composes with #54 but does not require it — this is a prompt-construction UI over the existing text path (
frontend/src/deck/DeckColumn.tsx:243-1020).Problem
Generation input is a raw freeform textbox + a length picker + an engine select (
DeckColumn.tsx:243, the engineSelectat:1018). Powerful, but unplayable mid-set: writing prose under the lights is slow and the results swing wildly. The Magenta side solved the analogous problem with the 2D style pad — up to 8 weighted prompt targets blended by distance (ADR-0004, "style is a weighted prompt blend"). SA3's text prompt deserves the same treatment: a curated, composable vocabulary instead of a blank box.Proposed approach
A sound-palette builder over the existing
/api/generatepath: curated chips grouped by axis (genre / era / instrument / texture / space-&-reverb / energy) that compose into a prompt, named user-savable presets (loaded like style presets,App.tsx), and a mood XY-pad (reusefrontend/src/ui/XYPad.tsx) that interpolates between two or more palette corners — the SA3 echo of the style pad. The composed prompt stays visible and editable (never a black box). Pure frontend: prompt assembly only, no model/runtime change.Acceptance criteria
XYPad,Select,Panel, the preset machinery); strings via i18n; house style;npx tsc -p tsconfig.app.json --noEmitclean.Scope & non-goals
In scope: the prompt-construction UX (chips, presets, mood pad). Non-goals: changing the generation backend; weighting via true latent blends (this composes text, not embeddings — a deliberate simplification vs. ADR-0011's audio embeddings); negative-prompt chips (the guidance issue).