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>
A song could only be filled with sounds that were made somewhere else.
Record plays the song from the cursor and takes the input meanwhile, so
a part played along lands on the bar it was played to.
- An audio worklet takes the input's samples on the clock the song
plays on. Each run carries the frame it was taken at, so the take is
cut where the song was heard to start. The output's and the input's
latency are taken off, as far as the browser reports them.
- The take goes up as mono 16-bit WAV. Sound, a new track "Recording"
under the track clicked last and the item at the cursor are one undo
step. The sound is named "Song – Take 1", 2, 3 and so on.
- While recording the take grows red with its waveform on its track,
and a meter beside the input dropdown shows the level. The lanes take
no edits then, only a middle-drag pans.
- The loop is not used while recording. The song plays once through
and on past its end until Stop, Play or Space keep the take. Esc
throws it away and nothing goes up.
- Echo cancelling, noise suppression and auto gain are off, nothing is
played back. The input picked is kept in localStorage.
- A take stops by itself at the size a sound may have. A failed upload
offers Retry, Download WAV and Discard.
- The API takes sounds up to 256 MB and bodies of the same size. nginx
and PHP were raised to match outside the repo (body 256m, upload and
post 256M, memory_limit 512M).
- The pure rules (cut, cap, WAV header, name, track) live in
core/music/take.ts. The scheduler tells where it started on the
audio clock.
- The e2e browser gets chromium's fake microphone and skips the
permission prompt. Each run leaves its take in the sound store.
Found on the way:
- The header was too full with the new widgets and cut the track and
item count on the right. Input dropdown and meter are narrower now.
Tests:
- Unit take.test.ts: 7 new, svg-icons adjusted to 8 toolbar icons
- e2e 65 (melektaus-atx): ALL PASSED – 31 checks (+4)
- Gate (melektaus-atx): CHECK EXIT 0, 252 files, 3923 tests
- Probe on stein2: a 3 s take of the test tone, peak 32767,
285100 bytes, waveform seen in the screenshot
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>