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):
| type | parameters (default) |
|---|---|
eq | lowFreq 120 Hz, lowGain 0 dB (low shelf) · midFreq 1000, midGain 0, midQ 1 (peak) · highFreq 8000, highGain 0 (high shelf); gains −18…+18 |
highpass / lowpass | freq (80 / 8000 Hz), q 0.71 |
compressor | threshold −20 dB, ratio 4, attack 10 ms, release 200 ms, knee 6 dB, makeup 0 dB |
limiter | ceiling −1 dB, release 80 ms - brickwall, 5 ms lookahead; nothing passes the ceiling |
gate | threshold −50 dB, range −40 dB (how far it closes), attack 2, hold 80, release 150 ms |
delay | time 0.3 s, feedback 0.35, mix 0.25 |
reverb | decay 2 s, predelay 20 ms, mix 0.25 |
distortion | drive 0.3, mix 1 |
widener | width 1.5 (0 = mono, 1 = as is, 2 = extra wide) |
pitch | semitones 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.
- Set a track fader / pan:
{op:"setTrack", id:"A2", set:{gain:-8, pan:0}}(nullor0resets). Master:{op:"setProject", set:{master:{gain:-1}}}. - Buses:
{op:"setBus", id:"B1", set:{name:"Dialogue", gain:-2, pan?, mute?}}creates or updates one; route a track in with{op:"setTrack", id:"A1", set:{out:"B1"}}(out:"master"ornullroutes it back);{op:"removeBus", id:"B1"}sends its tracks back to the master. In the Mixer: + Bus, the → menu under a track's name, double-click a bus name to rename it. - Noise reduction -
fablecut_denoise {clipIds, amount?:"light"|"medium"|"strong"|"off"}(default medium; the inspector's Noise control does the same). The file's noise floor is measured (its quietest 50 ms windows), then ffmpeg's FFT denoiser pulls everything near it down (10 / 18 / 30 dB) into a FLAC copy of the whole source file inmedia/, registered withderivedFrom(the original) anddenoise(the amount). The clip and its linked audio stems switch to that copy; the picture keeps its own file, so links,inpoints and timing stay as they were.offswitches back; a level already rendered is reused. Works on audio clips (a video's sound is on its linked stems). Needs ffmpeg. Use it before normalizing - the measured loudness changes. - Normalize -
fablecut_normalize_audio {clipIds, mode?:"lufs"|"peak", target?}measures each clip's source window after its channel routing (ITU-R BS.1770 integrated loudness with EBU R128 gating, or sample peak) and setsprops.gainto hit the target. Linked stems are measured together and share one gain; passing a video clip normalizes its stems. Targets: −14 LUFS streaming / social, −16 LUFS podcast / dialogue, −23 LUFS broadcast, ormode:"peak", target:-1. Locked clips are skipped unlessforce:true. The inspector's Normalize in the editor does the same measurement. - Fade curves - a
fadetransition on an audio clip may carrycurve:"power"(constant power - the crossfade default, no dip in the middle),"linear"(constant gain - for crossfading the same material, e.g. a split of one take) or"exp"(slow start, natural fade to silence). Nocurvekeeps the original eased shape. Only the volume follows the curve; picture fades are unchanged.{transitionOut:{type:"fade", duration:3, curve:"exp"}}. - Crossfades - overlap A and B on one track and give A
transitionOut:{type:"fade", duration:d, curve:"power"}and BtransitionInthe same, withd= the overlap. Shift+D in the editor does it for you: it borrows the overlap from spare media on both sides of the cut (half each, or more from the side that has it), so nothing after the cut moves; for a linked shot the stems crossfade and B's picture dissolves in. - Auto-duck -
fablecut_auto_duck {clipIds:[music…], under?:["A1"], amount?:-12, threshold?:-40, attack?:0.3, release?:0.6}finds where the voice tracks (default: every other audio track) are abovethresholddBFS - short gaps are bridged so the music doesn't pump between words - and writeskeyframes.duckon the music: ramp downattacks before speech, hold, back up overreleases. It replaces earlier ducking;amount:0clears it. Same as the inspector's Auto-duck section or the clip menu's Auto-duck under other tracks. - Silence -
fablecut_silence {clipIds, threshold?:-40, minSilence?:0.5, padding?:0.15, cut?, tracks?, force?}listens to the speech clips (a video brings its linked stems; each measured after its channel routing, gain and volume) and finds every stretch where none of them is abovethresholddBFS for at leastminSilenceseconds. It keepspaddingseconds of quiet after the phrase before and before the phrase after, so words aren't clipped; a clip's own start and end are cut to the first and last word. Cuts land on whole frames, and the gaps between clips are left alone. Withoutcutit only reports the spans (timeline seconds). Withcut:trueeach one is removed with anextracton the targeted tracks (trackspicks others), last first, in one revision: later material moves up, linked stems stay in step, and locked tracks and clips stay where they are - lock the music bed first if it should keep running under the tightened edit.force:truecuts through locked material too, so pass it only when the user asked. Only time that was actually heard is cut: a clip with no audio stream (or disabled) is left alone, and so is one with a speed ramp (keyframes.speed) - its sound doesn't sit on the timeline at one speed. A version of the project as it was is kept before the cut; if that fails the reply says so in a warning, and then there is no version to go back to. Raisethresholdtoward −30 in a noisy room; lowerminSilencefor a tighter, jump-cut feel. In the editor: the Inspector's Silence section on an audio or video clip (or right-click → Find silences) - Find marks the silences on the timeline as amber bands, Cut N extracts them (one undo step), Clear removes the marks. The marks drop when the timeline, a clip's file, speed or level, or the frame rate changes. - Beats -
fablecut_beats {clipId, markers?, snap?, retime?, every?, force?}listens to a music clip (an audio clip, or a video's sound) and finds its tempo (BPM), a steady beat grid - the tempo's period, phased and fitted to the hits, so it doesn't drift over a song - and the drop, all in timeline seconds through the clip's in point and speed. On its own it only reports. Then, in one revision:markers:trueputs a cyan marker on every beat (other markers stay, and a beat that already has one keeps it);snap:true(or{tracks, maxShift}) rolls each cut on the targeted video tracks to the nearest beat within half a beat - a roll, so nothing else moves and linked stems follow; a cut whose clips have no spare footage to reach the beat stays where it is, and the reply says how many;retime:{track?, every?, from?}lays a track's clips (default the lowest video track with clips) back to back on the beat,everybeats each (1, 2, 4, 8 or 16; default 2), from the first beat at or afterfrom(default the music's start), in their order - a clip whose footage runs out gets fewer beats, clips past the music keep their length, and one with less than a beat of footage refuses the whole re-cut. Locked clips are left alone by snap and refuse retime, unlessforce:true(only when the user asked). A version is kept before snap or retime; if saving it fails, the edit still goes ahead and the reply says so in a warning. A re-cut clip that gets shorter loses the keyframes past its new end, and its transitions are kept no longer than the clip, as with a trim. The music clip itself (and its linked stems) is never re-cut, even when it sits on the track being re-cut. Cuts land on whole frames. A clip with a speed ramp is refused: its music doesn't keep time on the timeline. In the editor: the Inspector's Beats section on an audio or video clip - Find beats shows the beat as ticks across the timeline and the BPM and drop below; then Mark, Snap cuts, and Re-cut a track every N beats (each one undo step). - In the editor, each audio clip shows its volume line (yellow; dashed = after ducking): drag it to change the level, Ctrl/Cmd-click to add a keyframe, drag a point to move it, Alt-click or double-click to remove one. The corner fade grips drag a constant-power fade in or out. Both edit linked stems together.
- Use gain for "this clip is too quiet / loud", volume keyframes for shaping, duck for dipping under dialogue, the track fader to balance whole lanes (dialogue against the music bed), and a bus when several lanes need the same processing or one fader.