Added
-
Mixer. A Mixer tab beside the Inspector: one strip per audio track
with a fader (console taper, unity at ¾ throw, double-click for 0 dB, or
type a level), pan, mute, solo and a meter, plus a master fader with a
live LUFS readout. Levels are saved astracks[].gain/tracks[].panand
master.gaininproject.json, written only when they differ from 0. -
Clip gain (
props.gain, dB): a trim before volume, so volume
keyframes and fades keep working on top of it. -
Channels (
props.channelMode): stereo, mono (L+R folded to one
channel), left, right or swap, per clip. -
Normalize. In the inspector, pick a target (−14 LUFS streaming, −16
LUFS podcast, −23 LUFS broadcast, −1 dBFS peak) and Apply: the selected
clips are measured (ITU-R BS.1770 integrated loudness with EBU R128
gating, or sample peak) and their clip gain set to hit it. Linked stems
are measured together and share one gain. -
MCP:
fablecut_normalize_audiodoes the same from an agent (needs ffmpeg),
with the same measurement as the editor.fablecut_patch_projectgains a
setTrackop for track faders / pan and amasterfield on
setProject; the compact project view shows aMIX:line when any
level is off 0. -
Audio effects. Effect chains on audio clips (Inspector → Audio effects),
tracks and the master (Mixer → FX): EQ (3-band), high-pass, low-pass,
compressor, limiter (brickwall, 5 ms lookahead), noise gate, delay, reverb,
distortion and stereo width. Reorder, bypass or tweak each effect; preview
and export run the same chain. Saved asfxon clips,tracks[].fxand
master.fx. -
Audio presets. Voice: Clean voice, Podcast, Radio, Deep voice (EQ-based),
Telephone. Music: Cinematic, Wide, Muffled. A preset writes ordinary effects
into the chain, so it can be adjusted afterwards. -
MCP:
fablecut_patch_projectgainssetFx(a chain or a preset on a clip
and its linked stems, a track or the master; validated). The compact view
lists chains. The MCPB bundle manifest now lists every tool
(fablecut_encode_profileswas missing). -
Volume line. Audio clips draw their volume as a line: drag it to change
the level (with keyframes, the two around the pointer move together),
Ctrl/Cmd-click to add a keyframe, drag a point to move it, Alt-click or
double-click to remove one. Edits apply to linked stems too. -
Fade grips and fade curves. Drag the grip in a clip's top corner to fade
in or out. Audio fades take acurve: constant power, constant gain or
exponential (inspector → Transition), drawn as the real curve on the clip.
Fades without acurvesound exactly as before. -
Crossfade (Shift+D, or the clip menu). Crossfades the audio cut next to
the selection, or the one at the playhead: the overlap is borrowed from
spare media on both sides of the cut, so nothing downstream moves; linked
picture dissolves in. Overlapping audio that is crossfaded no longer shows
the overlap warning. -
Auto-duck. In the inspector (or the clip menu): the selected music dips
by the chosen amount wherever the dialogue tracks have sound, ramping down
just before and back up after, with short pauses bridged. Written as a new
duckkeyframe channel (dB) on top of volume, so the music's own levels are
never touched and a re-run replaces the old dips. MCP:
fablecut_auto_duck, same detection as the editor. -
Agents can export.
fablecut_exportrenders the timeline to a file in
exports/with the editor's own Fast export and returns its path. An open
editor tab takes the job, or the server starts a headless Chrome / Edge
(FABLECUT_CHROMEto choose) and closes it afterwards. Range, encoding
profile, waiting, status and cancel are options. REST:
POST /api/export/requestandGET /api/export/job. -
MCP:
fablecut_patch_projectruns the editor's own timeline edits —
split,rippleDelete,closeGap,lift,extract,insert,
overwrite,rippleTrim,roll,slip,slideandcrossfade— with the
same linked-stem sync, track targeting and locks as the keyboard shortcuts.
setProjecttakesinPoint/outPoint, and the compact view shows them. -
Pitch shift effect (±12 semitones, speed unchanged). The Deep voice
preset now lowers the pitch (−4 semitones) instead of only EQ-ing the tone. -
Effect automation. Any effect parameter (except reverb decay) can follow
keyframes: a ◆ beside each slider sets or removes a key at the playhead, and
the slider then edits the key under the playhead. Clip, track, bus and master
effects; preview and export follow the same curve. Saved askeyson the
effect. MCP: thesetFxKeyspatch op, orkeysinside asetFxchain. -
Submix buses. + Bus in the Mixer adds a bus with its own effects,
fader, pan, mute and meter; the menu under a track's name routes it into a
bus instead of the master. Saved asbusesandtracks[].out. MCP:setBus,
removeBus,setTrack {out}, andsetFx/setFxKeyson a bus. -
Noise reduction. The inspector's Noise control (Light / Medium /
Strong / Off) measures the file's noise floor and renders a cleaned copy with
ffmpeg's FFT denoiser; the clip's audio stems switch to it, and Off switches
back. MCP:fablecut_denoise; REST:POST /api/denoise. Needs ffmpeg.
Changed
- The editor's split, ripple, insert, trim and crossfade code moved into
edit-ops.js, which the editor and the MCP server both load. - The master loudness readout is measured on the finished mix, after master
effects and the master fader. - Preview and export now mix audio through the same graph: each clip feeds
its track, each track the master. Before, the export mix sent every clip
straight to the output, so anything set on a track or the master could not
reach the exported file.
Fixed
- Titles draw in their own fonts again. Every title style (Anton, Playfair
Display, Bebas Neue, Caveat, …) was falling back to the system sans-serif:- The 20 fonts in
library/fontswere the wrong slice of each Google font
(Cyrillic, Vietnamese, …) with no A–Z in them. They are now the Latin
files, and the variable ones (Caveat, DM Sans, Inter, Montserrat, Oswald,
Playfair Display, Roboto, Rubik, Teko) keep their whole weight range, so
weight100–900 draws real weights instead of a faked bold. - Fonts that aren't in the library (Cinzel for the Luxury style, or any
Google Font typed by name) never loaded: the check meant to skip fonts
already present passed for every name. They load now, and Load says
so when Google Fonts has no family by that name. - A data directory seeded before this release (the Claude Code plugin keeps
one) gets the new font files on the next start; a file you changed or
added yourself is never overwritten.
- The 20 fonts in
- Exports wait for every title font, including a
font-cuttitle's whole
set, before the first frame, so an opening frame can't come out in the
fallback face. - The font list no longer shows a library font twice after a quick run of
project reloads.