Stage 2 of #337. The lanes of stage 1 played, but nobody could make
one. Now a track folds out a lane for volume and one for pan, and
points are set, dragged and eased right on the timeline.
- A lane is a row of its own, as high as a track, below its track.
The view functions stay row based, so zoom, fit, item drags and
the composition (which shares them) are unchanged.
- itemAt and itemsWithin take a map of track id to row.
- A triangle in the track head folds the lanes out. The head menu
shows or hides each lane. A lane with points is open by itself.
- Which lanes are open belongs to the view of the tab and is saved
with it. It is not part of the song and makes no undo step.
- A click sets a point on the grid, Alt or Shift on the exact tick.
Press and drag sets one and drags it in a single undo step.
- A dragged point stops at its neighbour. Two points on one tick
make a jump. Double click or Delete removes a point.
- The value shows next to a dragged point and as a tooltip.
- Right click on a point opens "Ease to next point" with the same
choice as animation keys, curve assets included.
- The lane head shows the value at the playhead. Its menu clears
or hides the lane.
- While a lane rules a value, the fader shows it in the lane colour
and cannot be dragged (decision 4). A hint says why.
- Geometry in laneView.ts, edit rules in laneEdit.ts, the easing
menu in easingMenu.ts. New test hooks automationAt,
automationHeadAt and automation under __gm.song.
Open: the Volume (dB) field of a track in the inspector can still be
changed while a lane rules it. It has no effect while playing.
Tests:
- song-lanes.test.ts (12, new) and song-edit adapted: 27/27.
Editor tests of song and composition 62/62.
- 9 counter checks, all compile, all red.
- e2e 65 on melektaus-atx: ALL PASSED, 66 checks. 65g2 is new with
6 checks. It goes red when a set point is not taken on release.
- Gate on melektaus-atx: CHECK EXIT 0, 329 files, 5065 tests.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>