Audio mix

How clips reach the speakers and the export: clip gain, channels, track faders, the master, and loudness normalize.

Every clip runs through the same chain in preview and export: source → channels (audioChannel / channelMode) → gain (dB) → clip fx → volume (keyframes, fades, duck) → pan → its A-track, then track fx → track fader → track pan → (submix bus fx → fader → pan) → master sum → master fx → master fader. A track has a fader (tracks[].gain, dB), a pan (tracks[].pan) and effects (tracks[].fx); the master has a fader (master.gain) and effects (master.fx). Submix buses (buses[], B1…B8) group tracks: a track with out:"B1" feeds that bus instead of the master, and the bus has its own effects, fader, pan and mute - e.g. every dialogue lane into one bus with one compressor and one fader. Audio on a video lane (a clip with volume > 0 on V1…) goes straight to the master. In the UI these are the strips in the Mixer tab beside the Inspector (its FX button edits that track's or the master's effects); mute / solo are the existing track switches (disabledTracks).

Effects (fx - an array processed in order; every parameter optional, out-of-range values are clamped; on:false bypasses one without losing its settings):

typeparameters (default)
eqlowFreq 120 Hz, lowGain 0 dB (low shelf) · midFreq 1000, midGain 0, midQ 1 (peak) · highFreq 8000, highGain 0 (high shelf); gains −18…+18
highpass / lowpassfreq (80 / 8000 Hz), q 0.71
compressorthreshold −20 dB, ratio 4, attack 10 ms, release 200 ms, knee 6 dB, makeup 0 dB
limiterceiling −1 dB, release 80 ms - brickwall, 5 ms lookahead; nothing passes the ceiling
gatethreshold −50 dB, range −40 dB (how far it closes), attack 2, hold 80, release 150 ms
delaytime 0.3 s, feedback 0.35, mix 0.25
reverbdecay 2 s, predelay 20 ms, mix 0.25
distortiondrive 0.3, mix 1
widenerwidth 1.5 (0 = mono, 1 = as is, 2 = extra wide)
pitchsemitones 0 (−12…+12; changes pitch, not speed - about 30 ms of delay), mix 1

Presets fill the chain with tweakable effects: Voice - clean-voice, podcast, radio, deep-voice (pitch down 4 semitones + a warmer EQ), telephone; Music - cinematic, wide, muffled (next room). Agents apply them (or any chain) with the patch op setFx: {op:"setFx", target:"clip", id:"c_vo", preset:"podcast"} · {op:"setFx", target:"track", id:"A3", fx:[{type:"eq", highGain:-3}]} · {op:"setFx", target:"master", fx:[{type:"limiter", ceiling:-1}], append:true} · {op:"setFx", target:"bus", id:"B1", preset:"podcast"} · fx:null clears. On a clip it applies to its linked stems too; chains are validated (unknown effect or preset → the whole patch is refused). The compact project view shows chains as fx:highpass·eq·… (lowpass~freq = automated).

Effect automation - any effect parameter except reverb decay can follow keyframes: keys on the effect, {param: [{t, v, ease?}]}. t is seconds from the clip's start for a clip's effects, and timeline seconds for a track's, a bus's or the master's; ease (linear · ease-in · ease-out · ease-in-out, default ease-in-out) shapes the segment arriving at that key, as with clip keyframes. While a parameter has keys they set it. Preview and export follow them the same way (export steps every 20 ms with a short glide). In the effects panel each parameter has a ◆: set or remove a key at the playhead; with keys, the slider edits the key under the playhead. Agents: {op:"setFxKeys", target:"bus", id:"B1", type:"lowpass", param:"freq", keys:[{t:0, v:18000}, {t:8, v:500, ease:"ease-in"}]} (index picks the effect when the type repeats; keys:null clears) - or write keys inside a setFx chain. Example - a filter sweep into the drop: a lowpass on the music clip keyed from 400 Hz up to 20000 Hz over the build.