* fix(core): preview audio fades play as ramps on the audio clock, so cuts no longer click
data-fade-in / data-fade-out were folded into one volume per 50 ms sync tick and applied as
a step (el.volume, or gain.value in the Web Audio transport), so a 20 ms fade never played
and each clip started and stopped at near full level: a click at every cut. The export
applies the fades (ffmpeg afade) and does not click.
The transport now books each clip's fades on a gain of its own when it schedules the
clip, for both decoded buffers and captured media elements: a linear ramp from where the
clip starts sounding up to its fade-in, and down to silence at its end. The sync tick hands
the transport the level without the fade (onElementVolume's new fifth argument, sent only
where a fade applies), so a booked fade is not applied twice. The plain el.volume fallback
keeps its stepped fade.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix(core): one doc block on setElementVolume
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix(core): keep the comment share where it was
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* fix(core): booked fades hold through pre-roll, follow rate changes, skip unbounded ends
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
* chore: raise the producer unpacked budget to the measured size plus 1%
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>