A composition could be placed and played, but not filled. Its tab
puts the picture at the playhead above a timeline of tracks, so a cut
or a cutscene is laid out by dragging assets onto tracks.
- The timeline takes the song tab's geometry with frames for ticks:
ruler in seconds, scrubbing, play and pause, + Track. Zoom and pan
glide through viewTween like the other tabs.
- A placeable asset dropped on a track becomes an item, 3 s long or
as long as its sprite's video. Dropped on an item it lands behind.
- Items move without overlapping. The right edge stops at the next
item. The left edge trims into a video and not before its start.
- An animation dropped on a track becomes a narrower clip bar above
the item it plays on. The asset panel now starts a drag for
animations too.
- The picture is a scene view over compositionHolder. A click picks
an item or its child, a drag moves the real object. It takes no
assets, since an object there would have no item.
- The hierarchy lists the items alive at the playhead. Reparenting is
off there, items stay at the top level.
- The inspector shows a TIMING block on an item (start, length,
offset for a video, Fit to media) and edits tracks and clips.
- Delete, the context menu and Remove item take item and object in
one undo step.
- fitMedia: an override that gives an item another video sets its
length in the same undo step, capped at the next item. Dragging an
edge or typing a length turns it off.
- A composition inside a composition is refused.
Tests:
- Unit composition-edit (new): 19 tests. Four counter-checks each
turned their test red. The "back to 3 s" test got a step in
between after one stayed green.
- e2e 69 (new): 11 checks, 9 own. The hierarchy check reads the rows
shown, after a counter-check on the model's rows stayed green.
- Gate on melektaus-atx: CHECK EXIT 0, 302 files, 4662 tests.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Patterns could only be heard one at a time, in their own tab or from
a behavior. A song lays patterns and sounds out on tracks along one
time axis and plays them through the scheduler of #332, the third
piece of the music tools of #330.
- New asset type song under the heading Songs, with four empty tracks,
120 BPM in 4/4 and a grid of a bar. Tempo, meter and grid are rows
in the inspector. Tracks, items and the loop are the asset's data,
held to their rules on load and in every command.
- A track has a name, volume, pan, mute and solo. Each is heard on a
bus of its own, so a change reaches what is sounding at once.
- A pattern item repeats its pattern for as long as it is, with a
transpose and another instrument if wanted. A sound item plays its
sound as a clip at its own speed, round and round, through a sound
FX if wanted. Both have a volume on top of their track's.
- Cut back at the left end or split, an item starts as far into what
it plays as the cut is: ticks into a pattern, seconds into a sound.
- The tab shows the heads with M, S, volume and pan, the ruler of the
Pattern tab and the items, a pattern with its notes, a sound with
its waveform, a missing asset red. Patterns and sounds are dragged
in from the Assets panel. Body, right and left end move, lengthen
and cut back, Alt leaves the grid. Ctrl+C/V/D/A, Ctrl+E splits
where playing starts, Delete, arrows. A double-click opens a
pattern item in its tab.
- What is picked is a new selection of its own, so the inspector
shows the item or the track, with a button to delete it.
- The scheduler plans clips beside notes. Where the playhead starts
or jumps back inside a clip, it is taken up that far into its
sound. A clip fades out at the end of its item or of the loop.
- The editor plays one piece at a time: a pattern started stops the
song and the other way round.
- The rules are pure functions in core/music/song, editor/song/
songView and songEdit.
Findings:
- The suites of 4ea752f and 2a3b90b were red at e2e 54: the Pattern
pushed Struct below the fold of the + menu. The module now scrolls
to it, as e2e 47 does for Vector art. It also left the menu open,
which made e2e 55 fail behind it.
- The Assets panel only dragged assets a scene can place. Patterns
and sounds are dragged now as well, and a scene says why it does
not take one instead of calling every asset a scene.
Tests:
- song.test.ts (new, 14) and song-edit.test.ts (new, 9): model,
round trip, sequence of patterns and clips, mute and solo, cuts,
clips on the scheduler, moving, sizing, trimming, splitting,
duplicating, hits, head parts. sound-library.test.ts +5: clip
offset, end fade, pitched clip, track bus, peaks.
- e2e 65 (new) on melektaus-atx: ALL PASSED, 18 checks. e2e 54 and
55 with the fix: ALL PASSED, 33 checks. e2e 4 with 30 asset
types: ALL PASSED, 62 checks.
- Gate on melektaus-atx: CHECK EXIT 0, 250 test files, 3884 tests.
- Counter-checks: no taking up of a clip, no pattern offset, no clip
end each fail 3, 1 and 1 tests.
- Probe on stein2: the tab with four tracks, before and while
playing, looked at in two screenshots.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The context menu entry is gone; dragging replaces it entirely. The drop
target is the view under the pointer, not the active tab, so the same
gesture works for scenes and for container templates.
While dragging, an outline shows the footprint the object will have plus
a crosshair on its origin, turning red when the drop would be refused.
Preview and command share one function (placementRejection), so the
outline cannot promise something the drop then rejects.
A left-press used to select the list row immediately. Since the container
tab follows the selection, it switched to the very container being dragged
and every drop would have nested it inside itself. The list now selects on
release without a drag: picking something up is not the same as choosing it.