π Compose Normalize
Stop guessing loudness β hit -14 LUFS for YouTube before you upload
- audio_ops
- audio_ops
MF_ComposeNormalize is the audio-chain node that fixes a specific, very common disappointment: you mix a podcast, export it, upload it, and it's quiet compared to everything else on the platform. This node applies FFmpeg's loudnorm to your audio during the Compose encode, targeting a measured loudness level instead of a vague "turn it up."
It's the last link in MediaForge's audio chain, and it pairs naturally with MF_ComposeAudioMix and MF_ComposeAudioFade - normalize is typically the last op, applied after the mix is shaped. The readme's numbers are the part to internalize: -14 LUFS for YouTube / TikTok / Spotify music, -16 for Apple Podcasts / Spotify spoken-word (the default), -23 for strict EBU R128 broadcast.
How it works
It appends a single-pass loudnorm filter op to the MF_COMPOSE_AUDIO_OPS chain. loudnorm measures and applies gain in one pass, which is good enough for streaming. Strict EBU R128 broadcast certification technically wants two passes (measure, then re-apply) - MediaForge deliberately doesn't do that, and you don't need it for a YouTube upload.
The inputs that matter
target_i- target integrated loudness in LUFS (-70 to -5). The three defaults above cover 95% of cases.target_tp- true-peak ceiling in dBTP, default -1. That -1 is the part people skip and regret: it leaves headroom so downstream compression doesn't clip you.target_lra- loudness range in LU, default 11. Larger = more dynamic range preserved. If your dialogue has loud and quiet passages and you want them left alone, leave it high.linear- defaultTrue, and keep it there.linear=Trueavoids dynamic-range compression;linear=Falseforce-flattens to the target for strict compliance and sacrifices dynamics. Unless a platform rejects you, you wantTrue.
Optional audio_ops input = upstream chain; output audio_ops feeds the next audio node or MF_ComposeVideo.
Install
Part of the MediaForge pack - no separate install:
cd ComfyUI/custom_nodes
git clone https://github.com/leon80148/comfyui_MediaForge.git
# restart ComfyUI
Or via ComfyUI Manager ("MediaForge").
Common issues
Order in the chain matters - normalize after the mix, not before, or your loudness measurement includes gain staging you then undo. And because loudnorm is a single pass, a source that's extremely quiet will still get boosted correctly, but you might hear the noise floor rise with it; that's physics, not the node. If the result sounds squashed, you flipped linear=False - it's the checkbox labeled "forcefully flattens to target," and it does exactly that.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| target_i | FLOAT | -16.0-70β-5 | β |
| target_tp | FLOAT | -1.0-9β0 | β |
| target_lra | FLOAT | 11.01β50 | β |
| linear | BOOLEAN | true | β |
| audio_opsopt | MF_COMPOSE_AUDIO_OPS | β |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| audio_ops | MF_COMPOSE_AUDIO_OPS | β |