A game could start and stop a song, but not steer one while it plays.
The battle theme could not take over on the next bar, a song could not
jump to a marker, and a track could not fall away when the player
hides. This is stage 3 of 5 in #338.
- Quantize: now, next beat, next bar (the default) or next marker. The
spot is the next one as the song is heard, and the change is planned
on the audio clock to the sample, round the loop as the ruler counts.
- Set song track turns one track in dB on top of the song's level, over
a fade, on the bus input before its FX and sends.
- Switch song plays another song, or the same one from a marker, in
place of the playing one. It keeps the playback number, so Stop song,
Set song track and On beat go on reaching it.
- A playing now has a key for its buses apart from its public number.
During a switch the old and the new song each have buses of their own.
- Play song has a "live tracks" switch. With it off a baked song plays
its bake, and Set song track on it writes a line to the log.
- A Switch song to a marker plays the notes, as a bake only plays from
its start.
Found on the way:
- A cut on a bar line faded over seconds in Chrome. cancelAndHoldAtTime
holds nothing where nothing is planned later, so the ramp ran from the
bus's last change. The turn now sets its start value on the spot. It
had been measured at 0.52 of full level 0.2 s past the bar line.
Tests:
- Unit: 23 new cases in beats, song-play, sound-library and the node
catalog. Counter-checks: 17 bends, all compile, all red.
- e2e 65 (atx): ALL PASSED, 73 checks. 65k3 is new. The switch landed
three bars after the start under the same number, and the track cut
on the next bar line with nothing in between. With the old ramp 65k3
is red (0.53 and 0.51 between).
- Gate (atx): CHECK EXIT 0, 334 files, 5144 tests.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Stage 2 of #338. A game that syncs to its music has to know where the
music is heard. This stage reads that on the audio clock and hands it
to behaviors as events and as a position.
- New event nodes On beat (playback, bar, beat, late), On bar
(playback, bar, late) and On song marker (playback, marker, name,
late).
- New data node Song position with bar, beat, fraction, seconds and
playing.
- The nodes have the fields Song and Pattern. With neither picked,
every playback counts. A linked playback input picks that one.
Compositions do not count.
- The Marker field offers the markers of all songs as Song / Marker,
as a sound field offers its clips.
- Everything follows what is heard: the audio clock minus the output
latency. That holds for baked songs and for Play pattern too.
- Only the last beat since the frame before fires, and only when it is
at most half a beat late, 0.15 s at most. Bars and markers alike.
- A copied song gets markers with ids of its own, so a Marker field
never names two songs.
- The audio clock is only asked while something plays. Asked in every
frame, it made the AudioContext without a user gesture (#436).
Tests:
- beats 14 and music-events 6 new, 4 in song-play, 2 in song-markers,
2 catalog cases, the touched groups 756/756
- 16 counter-probes, all compile, all red
- e2e 65 on atx: ALL PASSED, 71 checks, 65k2 new: 11 beats 1.1 to 2.4
and 2.1 again, none missing or twice, across the pause too. late
0.015 to 0.027 s. Counter-probe without the last position: red
- gate on atx: CHECK EXIT 0, 334 files, 5121 tests
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>