feat(engine,producer): apply VST chains in the offline audio mix - #2921
feat(engine,producer): apply VST chains in the offline audio mix#2921vanceingalls wants to merge 1 commit into
Conversation
A track carrying data-vst-chain is bounced through the VST host after it is trimmed and before volume automation is baked, so plugins see the dry signal and the envelope applies to their output. A VST failure is deliberately fatal for the whole mix rather than a per-track soft failure. Every other audio failure mode degrades gracefully (source missing, download failure, extract/prepare failure): the track drops, a failure is recorded, siblings continue. Silently substituting the untreated signal for a carved one would ship a render that sounds plausible and is wrong, which is worse than a loud failure, so VstChainProcessingError escapes the per-element catch and rejects the whole call. Because the per-element work races under Promise.all, that rejection does not wait for in-flight siblings. An internal AbortController (chained off the caller's signal) is threaded through extract, prepare and the bounce so a sibling's sidecar subprocess is aborted before workDir is removed from under it. Lambda has no plugin host, so `lambda render` and `lambda render-batch` both reject a composition with any VST chain up front, before the AWS-calling code path is reached.
|
Warning This pull request is not mergeable via GitHub because a downstack PR is open. Once all requirements are satisfied, merge this PR as a stack on Graphite.
This stack of pull requests is managed by Graphite. Learn more about stacking. |
|
Superseded by the Web Audio implementation. The sidecar approach is replaced by running Web Audio graphs on both ends: the studio previews in a live AudioContext, and the engine renders the same graphs in an OfflineAudioContext inside the headless browser it already drives. One implementation per effect, so preview matching render is a property of the architecture rather than a tolerance to police — which is what made the four effects that diverged under JUCE (compressor, limiter, chorus, phaser) stop being a problem. That also retires the reasons this was cancelled in the first place: no spawned sidecar process, no external GPL repo, no Measurements behind the decision: https://claude.ai/code/artifact/219fd332-0542-4bcf-a4b7-7b7202e63fde Branch left intact. |

Stack 3/5 — replaces #2602–#2605. Base: #2920.
A track carrying
data-vst-chainis bounced through the VST host after it is trimmed and before volume automation is baked, so plugins see the dry signal and the envelope applies to their output.A VST failure is deliberately fatal for the whole mix, not a per-track soft failure. Every other audio failure mode degrades gracefully (source missing, download failure, extract/prepare failure): the track drops, a failure is recorded, siblings continue. Silently substituting the untreated signal for a carved one ships a render that sounds plausible and is wrong — worse than a loud failure. So
VstChainProcessingErrorescapes the per-element catch and rejects the whole call.Because the per-element work races under
Promise.all, that rejection does not wait for in-flight siblings. An internalAbortController(chained off the caller's signal) is threaded through extract, prepare and the bounce so a sibling's sidecar subprocess is aborted beforeworkDiris removed from under it.Lambda has no plugin host, so
lambda renderandlambda render-batchreject a composition with any VST chain up front, before any AWS-calling code runs.Notes for review
audioMixer.ts/audioMixer.test.tsagainst currentmain, not stack-internal churn.maingrew a structuredAudioProcessingFailuretaxonomy after the original stack forked; the VST path was grafted onto that rather than onto the old string-error shape.render-batchwas not guarded in the original feat(vst): voiceover spectral-carve VST pipeline (V1) #2602 — onlyrenderwas. Same trust boundary, one line, so it is covered here.process.exitcontract, andmainhas since migrated the CLI to a throwingCliRuntimeError.🤖 Generated with Claude Code