Latent Affine Simple
The version you'll actually remember the name of
- latent
- latent
- mask
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) orper_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.
Inputs (6)
| Name | Type | Default | Description |
|---|---|---|---|
| latent | LATENT | Input latent to apply Affine to. | |
| scale | FLOAT | 0.9600–2 | Multiplicative factor. <1 darkens; >1 brightens. |
| noise_pattern | COMBO | Pattern used to generate the mask. Auto-tuned for rough/noisy results. | |
| seed | INT | 00–2147483647 | Random seed for mask generation. |
| temporal_mode | COMBO | static | static: same mask for all frames; per_frame: re-generate per frame for lively/noisy motion. |
| frame_seed_stride | INT | 99731–100000 | Seed increment per frame when temporal_mode is per_frame. |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| latent | LATENT | — |
| mask | MASK | — |