Nodes/ComfyUI-FeiFei/FeiFei Harmonic Dynamic EQ
ComfyUI Node

FeiFei Harmonic Dynamic EQ

FeiFei Harmonic Dynamic EQ Is a Compressor for Your Latent

By aifeifei798·Created about a month ago·Updated 3 days ago· 3
FeiFei Harmonic Dynamic EQ
  • model
  • model
◄threshold_high24.0►
◄alpha_compress0.50►
◄threshold_low0.20►
◄beta_boost0.20►
◄enabledtrue►

What it is, and why you'd reach for it

You know the render. CFG crept to 9 on an SDXL or Illustrious checkpoint, adherence is finally where you wanted it, and the highlights are molten - blown whites, black shadows solid, skin like wax. Drop CFG to 5 and the burn goes away along with everything the prompt was doing.

FeiFei Harmonic Dynamic EQ is one answer to that trade. It's a MODEL patch node: wire it before the sampler and on every step it runs the CFG-combined denoised prediction through a soft compander curve - a mastering compressor with a latent instead of audio. Wildly out-of-proportion values get pulled back, quiet ones get lifted, the middle passes untouched.

It's the odd one out in its pack of prompt-LLM nodes, grain and framing helpers: the only one that touches the model, with no network, no key, nothing to download.

The mechanism: two knees on one curve

"Bit-exact pass-through in the healthy band" isn't marketing, it's the design. The node builds a reference level per sample from the median of per-block RMS, then decides what to touch relative to it.

Above that reference times threshold_high, a tanh soft knee pulls magnitudes down. Below the reference times threshold_low, another knee pushes them up - about 15% lift at the defaults, closer to 76% at beta_boost = 1. Everything between the knees gets a gain of exactly 1.0, so it passes with no drift, no colour shift, no noise. Gain is clamped to 0.1–2.0 and the output keeps your model's dtype.

It installs through set_model_sampler_cfg_function, replicating ComfyUI's default uncond + (cond - uncond) * cond_scale before shaping the result - which is why it covers SD 1.5, SDXL, Flux and the DiTs. The attention-output patch the author rejected only fires inside SD-style blocks, which Flux never routes through. Weights are never touched; the patch lives on the cloned ModelPatcher, so the original MODEL restores the model bit for bit. It also fails open: if the math throws you get plain CFG, not a dead render.

The inputs that matter

model in, model out, and four numbers where you actually work.

threshold_high (default 24, range 8–128) is the limiter knee, in multiples of that reference level. Turn it down first if a high-CFG render is burning; the author's own guidance is 8–16. alpha_compress (default 0.5) sets how hard it acts; at 0 the limiter is off, which is how you isolate the other knee.

Then the AGC pair: threshold_low (default 0.2) and beta_boost (default 0.2). Raise threshold_low to lift more of the dark range, beta_boost to lift it harder. Those two are for flat, murky renders. enabled is the master switch - off returns an untouched clone, so it doubles as a bypass without rewiring.

Install

ComfyUI Manager is the easy path: search ComfyUI-FeiFei, install, restart. By hand:

cd ComfyUI/custom_nodes
git clone https://github.com/aifeifei798/ComfyUI-FeiFei.git
# restart ComfyUI; the node appears as "FeiFei Harmonic Dynamic EQ" under the FeiFei category

The pack's requirements.txt pulls openai>=1.40 for its LLM nodes; this one doesn't use it. For the EQ alone you need no API endpoint and no weights.

Where it sits, and how to tell it did anything

After your checkpoint loader and LoRAs, before the KSampler. No companion nodes, no conditioning to match.

The honest problem: on a healthy render it does nothing by design, so "did it work?" is hard to answer by eye. Lock the seed, run once with enabled off and once on, compare at full size. No difference? Drop threshold_high toward 8 - 24 is a high multiplier, and the limiter only bites once outliers clear it.

One real trap. The CFG-function slot is a single slot, exactly like the built-in RescaleCFG. Chain two of these and the later one wins; chain one after a RescaleCFG and only the last is seen. Neither node warns you - the other just quietly stops existing.

What it won't fix

Burn on a distilled model is a different problem. Flux, Z-Image Turbo and Klein distilled run at CFG 1 because guidance is baked into the weights - no amplified outlier pass for the limiter to catch, so the oversaturation comes from the guidance and the fix is at the guidance/CFG value, not here. (Same reason negative prompts go inert at CFG 1.) On those models the low knee is the half you'll feel.

And if the image is merely flat or badly coloured, a gamma or sigmoid curve after the sampler is free and deterministic. This node is for problems happening inside the trajectory.

Troubleshooting

Not in the menu. Check the console after restart; a bad clone or an old ComfyUI complains there.

No visible change. In order: is the patched MODEL the one in the sampler (not the loader output you dragged straight across)? Is enabled checked? Is threshold_high still at 24? Is another CFG-function node downstream of it?

Crunchy, flattened detail. alpha_compress at 1 with a very low threshold_high is the strongest curve the node has, and it flattens a healthy image along with the burnt parts. Back both off toward the defaults.

Community chatter on this one is essentially nil - which is probably why you're here.

CategoryFeiFei

Inputs (6)

NameTypeDefaultDescription
modelMODEL—
threshold_highFLOAT24.08–128Limiter knee, in multiples of the robust reference level. Magnitudes above threshold_high * ref are smoothly pulled back; lower it (8-16) for stronger protection against high-CFG burn-out.
alpha_compressFLOAT0.500–1Down-compression depth of the high knee. 0 disables the limiter; 1 applies the strongest peak control.
threshold_lowFLOAT0.200–1Boost knee, in multiples of the reference level. Magnitudes below threshold_low * ref receive a gentle gain lift; raise it to lift more of the dark range.
beta_boostFLOAT0.200–1Up-expansion depth of the low knee. 0 disables the boost; 1 applies the strongest low-level lift for dark, flat renders.
enabledBOOLEANtrueMaster switch. When off, an untouched model clone is returned (equivalent to bypassing the node).

Outputs (1)

NameTypeDescription
modelMODEL—