Nodes/WAS Affine/Latent Affine Simple
ComfyUI Node

Latent Affine Simple

The version you'll actually remember the name of

By WASasquatch·Created about a year ago·Updated 5 months ago· 5
Latent Affine Simple
  • latent
  • latent
  • mask
scale0.960
noise_pattern
seed0
temporal_modestatic
frame_seed_stride9973

If you want to know what WAS Affine is about without building a mask-options stack, this is the node. Latent Affine Simple is the same latent-space nudge as its big sibling - z' = scale * z + bias applied where a procedural mask is bright - but it hides the machinery. Six inputs, no options dictionaries, no pattern menus with twenty choices. You drop it between two samplers or after a first pass, and the pack auto-tunes the rest.

Why this is the one to reach for

It's the pack's own gateway drug. The example workflows the author ships - the Wan 2.2 text-to-video workflow and the Krea fp8 720p-to-2k one - both lean on the Simple node, and the two showcase videos in the README (WAN Lightning, 720p→2k) are built around it. If you just want the "fix the burned contrast, keep the detail" effect that AFFINE promises on light-LoRA and speed-LoRA outputs, this is a two-minute setup: put it after your first sampling pass, or between passes on a two-stage workflow, and let the auto-tuned pattern do its thing.

The trade-off is control. You don't get to choose the mask texture or tune mask strength, threshold, or blur - the README describes the pattern as "auto-tuned for rough/noisy results." That's fine as a first impression. The moment you think "I want this only on high-frequency regions," you graduate to the full Latent Affine node and its options inputs.

Inputs and outputs

  • latent - your LATENT tensor.
  • scale - default 0.96. Below 1 darkens, above 1 brightens. The README's suggested subtle darkening range is 0.95–0.98.
  • noise_pattern - the auto-tuned mask pattern. Default is picked for you, but you can change it.
  • seed - reproducibility.
  • temporal_mode - static (default, one mask across frames) or per_frame (regenerate per frame for video, livelier but noisier).
  • frame_seed_stride - seed increment per frame when in per_frame mode. Default 9973, a prime - primes avoid frames lining up into repeating patterns.

Outputs: latent (continues to your next sampler or the VAE) and mask (preview it once to see what you're actually modulating).

Installing

It ships in WAS Affine by WASasquatch. Easiest: ComfyUI Manager → Install Custom Nodes → search "WAS Affine" → install → restart. Manual:

cd ComfyUI/custom_nodes
git clone https://github.com/WASasquatch/was_affine

Restart ComfyUI. ComfyUI 1.0.0+ required; dependencies are plain torch and numpy, no models to download.

Common issues

The usual failure is expecting a big visible change. This is a subtle-effect tool - if you set scale to 0.96 and see almost nothing, that's working as intended; the whole pitch is controlled, sparse adjustment that doesn't collapse the noise structure. Crank it too hard and you get the opposite problem: the latent wanders off into mushy or over-amplified territory. If you're running video and per_frame makes the motion look frantic, drop the effect strength rather than the frame stride. And remember some models - the README calls out Flux/Krea - respond inverted to scale direction, so when darkening does the opposite of what you expect, flip the sign.

Categorylatent/adjust

Inputs (6)

NameTypeDefaultDescription
latentLATENTInput latent to apply Affine to.
scaleFLOAT0.9600–2Multiplicative factor. <1 darkens; >1 brightens.
noise_patternCOMBOPattern used to generate the mask. Auto-tuned for rough/noisy results.
seedINT00–2147483647Random seed for mask generation.
temporal_modeCOMBOstaticstatic: same mask for all frames; per_frame: re-generate per frame for lively/noisy motion.
frame_seed_strideINT99731–100000Seed increment per frame when temporal_mode is per_frame.

Outputs (2)

NameTypeDescription
latentLATENT
maskMASK