A drag with a clip picked could span a new clip in the strip or span
the picked one anew over the wave. Both happened by accident while
working on a clip. Now a drag only makes a new clip while none is
picked. With one picked it moves its edges or the whole of it.
- With no clip picked, a drag in the strip or over the wave (in the
Video tab the track) spans a new clip, as before.
- A click over the wave or in the track picks the clip at that point,
as a click on its band does. Beside the clips it picks the sound or
the video. The picked clip wins where clips lie over each other.
- With a clip picked, its handles move its edges as before. A drag on
its band in the strip moves the whole clip, its length kept and
inside the file. Any other drag does nothing.
- The rules live in waveView.ts (clipGrip, clipToPick, movedSpan) and
both tabs use them. The cursor shows grab over the picked band.
- The Video tab's track draws the clips not picked faint, as the wave
does, so a click there has something to aim at.
Tests:
- Unit wave-view.test.ts: 16 tests (4 new)
- Counter-check: a strip drag beside the picked clip spanning a new
one again fails the picked-clip rule test
- e2e 34 + 66 (atx): ALL PASSED, 162 checks, 1 new check in each
- Gate (atx): 295 files, 4527 tests
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Panning the Sound tab drew the whole wave anew on every move, one
filled rectangle per pixel column, and gave the ruler's labels new
texts whenever a tick left the area. At 2560 px across that took the
tab down to 16 fps.
- The wave is drawn half the area's width past either side of it. A
pan within that moves the drawing. Zoom, height, size or a pan
past the margin draw it anew.
- The bars of the wave share one fill instead of one fill each.
- A ruler label keeps the second it already shows. Before, a pan
shifted every label by one and each had to be rendered anew.
- A clip's name is given its style only when the style changes.
- The rule for what a drawing covers is pure in `waveView.ts`
(`shownSeconds`, `drawnSeconds`, `coversShown`).
Measured with a copy of the user's project, "Take 1" with 4 clips,
240 pan moves with the middle button, headless on stein2:
- 2560x1440: main thread 712 -> 373 ms/s, texts rendered 694 -> 65
- 1280x800: main thread 429 -> 225 ms/s
What is left in the profile is Pixi's render pass and the pointer
events, which hovering pays as well.
Tests:
- Unit wave-view: 12 green (1 new), counter-probe red
- e2e 34 (stein2, melektaus-atx was down): ALL PASSED, 92 checks
(1 new). Counter-probe with the labels given out by position: red,
7 labels set anew instead of 1.
- Gate (stein2): 272 files, 4210 tests green
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Zoomed out, the wave left room above and below it, but the bright file,
the picked clip and its handles still took the whole height. And a click
in the wave beside the picked clip kept it picked, so only the strip
could take it back to the sound.
- fileReach in waveView.ts is how far up and down the file reaches:
full scale and its inset, never past the area. At level 1 it is the
whole height, zoomed in too.
- The bright file, the shade outside the clip and the two handles are
drawn within that reach.
- A click over the wave beside the picked clip picks the sound. Inside
the clip or on a handle nothing changes, and a drag still spans the
clip anew.
Tests:
- Unit wave-view: 11 green (1 new), a counter-check red
- e2e 34 (melektaus-atx): ALL PASSED, 91 checks (1 new)
- Gate (melektaus-atx): CHECK EXIT 0, 271 files, 4195 tests
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The Sound tab always drew the wave at the full height of the tab. Quiet
stretches were hard to see, and there was no room above a loud wave.
- A level scale in dB stands left of the wave, a mark every 6 dB down
from 0, as long as a mark lies inside the area and at least 14 px
from the middle.
- The wheel over the scale zooms the height, from 0.25x to 16x. Over
the wave it zooms the time as before.
- What is louder than the area stops at its edge. The fade ramps grow
with the wave.
- Fit puts the height back to 1x. The tab keeps the height with its
view when another tab is shown.
- The rules live in waveView.ts (zoomLevel, levelMarks), the hooks
give the height, the scale and the top of a full-scale wave.
Tests:
- Unit wave-view: 10 green (2 new), 2 counter-checks each red
- e2e 34 (melektaus-atx): ALL PASSED, 87 checks (1 new)
- Gate (melektaus-atx): CHECK EXIT 0, 270 files, 4183 tests
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A sound asset now opens in a tab that shows its file as a waveform.
Two handles set where the sound starts and ends in the file, and that
stretch is the sample: Play sound, a song item and an instrument's
Sample all play it and nothing else. The file itself is never changed.
- The asset has three new rows: Start (s), End (s) and Edge fade (ms).
End 0 is the end of the file, the fade is 10 ms by default. Older
assets have no values and play the whole file as before.
- Every way of playing asks playedSoundOf() for a name instead of the
file: the file, or <file>#<start>~<end>~<fade> for a cut.
- SoundLibrary makes the cut from the decoded file the first time that
name plays and ramps each edge inside the file over the fade. Length
and peaks of a cut are read from the file without a copy.
- Cut buffers can be made again at any time, so the library lets the
oldest go past 64 Mi samples. A voice holds its buffers itself.
- The tab draws min/max per pixel from 256-sample block peaks, and the
samples as a line when zoomed in far. Wheel zooms, the middle button
pans, as in the music tabs. Wave, cut and ruler sit under a mask,
so a handle panned out of view does not draw over the panels beside.
- Dragging a handle moves that edge, dragging elsewhere spans a new
stretch. One drag is one undo step for both edges. Whole file puts
the handles back, Play or Space plays the stretch with a playhead.
- The inspector preview and the Sound FX preview play the cut too, and
the song lanes draw and repeat it.
Tests:
- Unit: sounds 20, wave-view 8 (new), sound-library 68, plus 258 in
the touched areas (instrument, song, pattern, inspector, tabs)
- e2e 34 on melektaus-atx: ALL PASSED, 57 checks (7 new)
- Gate on melektaus-atx: CHECK EXIT 0, 253 files, 3936 tests
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>