IterativeMixingSampler
The version that doesn't come out grainy
- model
- SAMPLER
This is the node the pack was rewritten around, and the one you should actually use. The earlier Iterative Mixing KSampler nodes had a fatal flaw: they called ComfyUI's internal sample() to denoise, and the output came out grainy for reasons even the author didn't fully understand. After comfyanonymous himself suggested it, ttulttul rebuilt the technique as a proper SamplerCustom-compatible sampler, and the graininess mostly went away. If you want to try iterative mixing in 2026, this is the on-ramp.
What it does
The idea is unchanged from the DemoFusion paper: as the sampler denoises, it keeps mixing in a declining fraction of a progressively noised copy of your latent, so the higher-resolution output stays structurally faithful to the source instead of sprouting extra limbs. What changed is the plumbing - this node outputs a SAMPLER object that you feed into a stock SamplerCustom node alongside a SIGMAS provider (the pack's own IterativeMixingScheduler, or a core scheduler).
One critical rule, straight from the README, all-caps worthy:
Do not enable add_noise on the SamplerCustom node. The iterative mixing sampler injects its own noise; letting SamplerCustom add more "will generate garbage." Turn it off and leave it off.
The inputs that matter
sampler- the pack's own sampler implementations:euler,euler_perlin,lcm,dpmpp_2m.euleris the sane default.euler_perlinis where the perlin knobs below come alive.alpha_1(default 2.4) - steepness of the blending curve. Lower = more noised-latent guidance early; higher = more freedom for the model. The README's sweet-spot advice for the technique is 0.1–5.0 territory.blending_schedule-cosine,logistic, orlinear. Try each; the author insists there's no best answer.blending_function-addition,slerp,norm_only. Slerp tends to be the winner in high-dimensional space.start_blending_at_pct/stop_blending_at_pct/clamp_blending_at_pct- where the curve begins, ends, and gets capped at 1.0. For a first run, leave all at their defaults (0 / 1 / 1).blend_min/blend_max- squeeze the curve's floor and ceiling.blend_maxbelow 1.0 guarantees some noised latent is always in the mix.perlin_mode/perlin_strength/perlin_scale- only meaningful witheuler_perlin. The README is refreshingly honest that it's "highly experimental and subject to change."perlin_scalenear 1.0 is near-pure noise; near 100 is huge blobs.rewind/rewind_min/rewind_max- very experimental. Withrewindon, the sampler finishes, renoises back torewind_min(default 50%) of steps, samples forward again, then rewinds half as far each cycle until it'd passrewind_max. It's a "second chance at detail" heuristic that can un-blur results.normalize_on_mean- deprecated, does nothing but log a warning. Ignore it.
Wiring it up
The minimal custom-sampling stack:
IterativeMixingScheduler(or Advanced) →SIGMASIterativeMixingSampler→SAMPLER- Both into a
SamplerCustom, withadd_noiseoff, along with your model, positive, negative and latent
Then expect to bolt a cleanup pass on the output - a plain KSampler at denoise 0.05–0.25. Even the clean sampler leaves residual noise; the model was never trained for this dance, and a light second pass is the standard fix.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/ttulttul/ComfyUI-Iterative-Mixer
# restart ComfyUI
Or ComfyUI Manager → "ComfyUI Iterative Mixing Nodes" (registered on the Comfy Registry). No model files. Dependencies are torch, numpy, matplotlib, Pillow, tqdm, scipy - the last two/three are what the plotting and perlin code leans on.
Where people get burned: forgetting add_noise is off (garbage output), and using VAEEncodeForInpaint (it erases the masked area, leaving nothing to blend). Everything else is just taste.
Inputs (17)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | — | |
| sampler | COMBO | euler | 4 options: euler, euler_perlin, lcm, dpmpp_2m |
| alpha_1 | FLOAT | 2.400.05–100 | — |
| blending_schedule | COMBO | cosine | 3 options: cosine, linear, logistic |
| blending_function | COMBO | addition | 3 options: addition, norm_only, slerp |
| normalize_on_mean | BOOLEAN | false | — |
| start_blending_at_pct | FLOAT | 0.00 | — |
| stop_blending_at_pct | FLOAT | 1.00 | — |
| clamp_blending_at_pct | FLOAT | 1.000–1 | — |
| blend_min | FLOAT | 0.00 | — |
| blend_max | FLOAT | 1.00 | — |
| perlin_mode | COMBO | masks | 3 options: masks, latents, matched_noise |
| perlin_strength | FLOAT | 0.750 | — |
| perlin_scale | FLOAT | 10.000.1–400 | — |
| rewind | BOOLEAN | false | — |
| rewind_min | FLOAT | 0.500–0.99 | — |
| rewind_max | FLOAT | 0.800.01–0.99 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| SAMPLER | SAMPLER | — |