Nodes/OmniNodes/Latent Channel Mixer 🎚️
ComfyUI Node

Latent Channel Mixer 🎚️

Knobs That Don't Map to RGB (And Why That's Fine)

By TensorVizionΒ·Created 3 months agoΒ·Updated about 8 hours agoΒ· 0
Latent Channel Mixer 🎚️
  • latent
  • latent
  • mix_info
β—„gains1.0,1.0,1.0,1.0β–Ί
β—„offsets0.0,0.0,0.0,0.0β–Ί
β—„channel_orderβ–Ί
β—„normalize_outputfalseβ–Ί

The name promises a channel mixer, and that's exactly what it is - just not the one you're used to. Image Channel Mixer slides RGB around; Latent Channel Mixer slides the latent channels, and those don't line up with red, green and blue at all. An SDXL latent has 4 channels, Flux has 16, and each one encodes some unknowable mixture of structure, color and content that the VAE decided to pack together. So this node is less "tint the image" and more "reach into the compressed representation and turn individual knobs to see what breaks." Which sounds like a toy, and mostly is - until you want to push a latent off its normal distribution on purpose.

How it works

You get three controls, all as text:

  • gains - a comma-separated multiplier per channel (1.0,1.0,1.0,1.0). 1.0 leaves a channel alone; 2.0 amplifies it; 0 kills it.
  • offsets - a comma-separated additive shift per channel (0.0,0.0,0.0,0.0).
  • channel_order - a reorder/swap pass. 1,0,2,3 swaps channels 0 and 1. Leave blank to skip.

The values are cycled to fit however many channels your latent actually has, so you can give it four numbers and it works on both SDXL's 4-channel and Flux's 16-channel latents. normalize_output rescales the result back into a sane range afterwards - the equivalent of turning the "looks washed out" switch on.

There's also a mix_info text output summarizing what you changed. It's easy to forget whether you left a channel at 3.5 gain; the summary saves you.

Inputs and outputs

  • latent - in.
  • gains, offsets, channel_order, normalize_output - the knobs above.
  • latent and mix_info - out. The latent goes to a KSampler (low denoise if you want to preserve most of the original), or straight to VAE Decode to see the raw effect.

What it's actually good for

Three honest uses:

  1. Diagnosis. Kill one channel at a time (set its gain to 0) and decode. If nothing changes, that channel is dead - a real finding, since a dead channel in a VAE is a recipe for smeared output.
  2. Finding the style knobs. Some latent channels correlate strongly with color or texture on certain VAEs. Bumping a single channel's gain can shift the whole image's palette in a way no prompt will. That's a discovery process, not a recipe - no channel map is published because it doesn't generalize.
  3. Deliberate corruption. Pushing a channel hard is how you get glitchy, off-distribution output on purpose.

What it is not: a reliable color-grading tool. If you want a specific tint, use a pixel-space node (the pack's Image Color Grade, or a 3D LUT) - reaching for latent channels to do deterministic color work is reaching for the wrong abstraction. This is exploration and debugging territory.

Install and troubleshooting

No dependencies beyond what ComfyUI ships:

cd ComfyUI/custom_nodes
git clone https://github.com/TensorVizion/OmniNodes

Restart, then find it under TensorVizion/Latent. ComfyUI Manager (search "OmniNodes") also works; confirm it registered via the [OmniNodes] βœ… Loaded log line.

  • Wrong number of values - it cycles, so it won't error, but 1,0 on a 4-channel latent silently leaves channels 2 and 3 untouched. Type the full set.
  • Output looks like static - gains too high, values blown out of range. Lower them or flip normalize_output.
  • Nothing changes - check channel_order isn't set to an identity swap, and remember some channels genuinely encode things the visual output barely shows.

Keep the strengths small and the expectations low, and you'll occasionally find a knob that does something remarkable. Just don't expect it to be RGB.

CategoryTensorVizion/Latent

Inputs (5)

NameTypeDefaultDescription
latentLATENTβ€”
gainsSTRING1.0,1.0,1.0,1.0β€”
offsetsSTRING0.0,0.0,0.0,0.0β€”
channel_orderSTRINGβ€”
normalize_outputBOOLEANfalseβ€”

Outputs (2)

NameTypeDescription
latentLATENTβ€”
mix_infoSTRINGβ€”