Nodes/MediaForge/πŸ“ Compose Normalize
ComfyUI Node

πŸ“ Compose Normalize

Stop guessing loudness β€” hit -14 LUFS for YouTube before you upload

By leon80148Β·Created 4 months agoΒ·Updated 2 months agoΒ· 0
πŸ“ Compose Normalize
  • audio_ops
  • audio_ops
β—„target_i-16.0β–Ί
β—„target_tp-1.0β–Ί
β—„target_lra11.0β–Ί
β—„lineartrueβ–Ί

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 - default True, and keep it there. linear=True avoids dynamic-range compression; linear=False force-flattens to the target for strict compliance and sacrifices dynamics. Unless a platform rejects you, you want True.

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.

CategoryMediaForge/Compose

Inputs (5)

NameTypeDefaultDescription
target_iFLOAT-16.0-70–-5β€”
target_tpFLOAT-1.0-9–0β€”
target_lraFLOAT11.01–50β€”
linearBOOLEANtrueβ€”
audio_opsoptMF_COMPOSE_AUDIO_OPSβ€”

Outputs (1)

NameTypeDescription
audio_opsMF_COMPOSE_AUDIO_OPSβ€”