A pattern for one song had to be made in the Assets panel first and
dragged in, and then stood in every picker of the project. Now a
right-click on an empty spot of a track makes one the song keeps to
itself, on top of the embedded assets of the first part.
- Create pattern lays an item from the grid line before the spot,
a bar long, and opens the pattern in its tab. Pattern, item and
name are one undo step. The name is "Pattern 1", 2, … per song.
- It plays the instrument of the track's pattern item that starts
last before the spot, else of the first one after it. An item's
own pick counts before its pattern's.
- An embedded pattern runs on the song's clock. It takes the tempo
and the meter of the song, and a change on the song moves it along
in the same undo step (`AssetPropertyCommand`).
- Its rows Tempo, Beats per bar, Beat and Bus are hidden, as the
song decides them. Length, grid, instrument and sound FX stay.
- A copy that comes to a song (Embed a copy, a paste from another
song) takes that song's clock. Made a project asset, it keeps the
values it had.
- `CreateAssetCommand` takes an owner. `embeddedCopy` takes the song
now, not its id.
- The cleanup of e2e 65 also takes what the song keeps.
Tests:
- Unit embedded: 18 green (5 new), 6 counter-checks each red
- Unit take, song, pattern and the asset commands: green
- e2e 65 (melektaus-atx): ALL PASSED, 49 checks (2 new)
- Gate (melektaus-atx): CHECK EXIT 0, 269 files, 4172 tests
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A take used to land in the Assets panel as "Song – Take N", next to
every other sound of the project. Now a song can keep a sound, a
pattern or a sound FX to itself: an ordinary asset whose new field
`owner` names the song. Everything that finds an asset by its id
finds it, so playing, the tabs and the game need no change. Only
the places that list assets leave it out.
- `core/music/embedded.ts` holds the rules: which types can be
embedded, `listedAssets`, the title "Song › Take 1", and the
rows an embedded sound hides (Loop, Bus).
- One user per embedded asset. `SetSongCommand` settles the song
after every edit: a place naming an asset an earlier place
claimed, or one of another song, gets a copy, and what nothing
names any more goes in the same undo step. The outcome is worked
out once, so a redo brings back the same copies.
- A split, Ctrl+D and a paste get that for free. The clipboard
keeps the embedded assets of the copied items, so a paste after a
delete brings the take back.
- Deleting a song deletes what it keeps. Duplicating it copies
that and points the copy at the copies. A duplicate of an
embedded asset is a project asset.
- The item menu has Open, Make project asset and Embed a copy.
- An embedded item carries a bullet in front of its name. The
first pick was a diamond, which the gate's font test refused:
the UI font has no glyph for it.
- A take is "Take 1", 2, … numbered per song. With the song gone
while it uploads, it becomes a project sound under a free name.
- Left out of: the Assets panel, every asset picker, the sound FX
menu of a track, the test sound of the Sound FX tab and the
naming of new assets. Delete on an embedded asset only says
where it lives. A ping lights up its song.
- Loading drops an `owner` whose song is gone, the asset stays as
a project asset. No migration: older projects have no owner.
Tests:
- Unit embedded (new): 13 green, 6 counter-checks each red
- Unit take, song, song-edit, asset-fx, asset-ref, serialize and
neighbours: 116 green
- e2e 65 (melektaus-atx): ALL PASSED, 47 checks (1 new)
- Counter-check e2e 65 (asset panel unfiltered): exactly that
check red
- Gate (melektaus-atx): CHECK EXIT 0, 269 files, 4167 tests
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>