Give a song, a track or an item a sound FX of its own (#355)

A sound FX for one place in a song had to be a project asset, which
then stood in every picker. Now every pick of a sound FX in a song
can make one the song keeps for that place alone, on top of the
embedded assets of the first two parts.

- Create sound FX sits at the end of the Sound FX row of the song,
  a track and an item, and of the menu of a track's FX button. It
  makes "Sound FX 1", 2, … per song with the Input wired to the
  Output, picks it and opens it. That is one undo step.
- Embed a copy, while the place names a project FX, gives the place
  a copy under the same name.
- While the place names its own, the menu shows it with the mark and
  offers Edit sound FX and Make project asset.
- Picking anything else lets it go in the same undo step. For a
  track or an item `settleEmbedded` did that already. For the song's
  own row `AssetPropertyCommand` now settles the song after `fx`.
- The mark `•` moved to the core. `assetRefLabel` puts it in front of
  an embedded asset, so the inspector rows show it like the timeline.
- `FieldHandlers.moreChoices` lets a caller end a reference menu
  with entries of its own. `embeddedPatternName` is `embeddedName`
  with a base now.

Tests:
- Unit own-fx (new): 6 green, 6 counter-checks each red
- Unit embedded and 80 neighbouring files: 1434 green
- e2e 65 (melektaus-atx): ALL PASSED, 51 checks (2 new)
- Gate (melektaus-atx): CHECK EXIT 0, 270 files, 4178 tests

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
adminandClaude Opus 5.5 committed 2026-10-08 11:32:41 +02:00
1 parent 49669017b1
commit 668682c4ff
11 files changed
+339 -37

No files matched your search

+2 -2
View File
@@ -21,7 +21,7 @@ import {
assetTitle,
embeddedCopy,
embeddedIn,
embeddedPatternName,
embeddedName,
embeddedUsedBy,
instrumentNear,
isRowHiddenWhenEmbedded,
@@ -234,7 +234,7 @@ describe('a pattern made in a song (#355)', () => {
const make = (props: Record<string, string | number> = {}) => {
const made = new CreateAssetCommand(
'pattern',
embeddedPatternName(f.project, songId),
embeddedName(f.project, songId, 'Pattern'),
{ ...songClockProps(s.song().props), bars: 1, ...props },
songId,
);