Nodes/Skoogeer-Noise/Forward Diffusion (Add Scheduled Noise)
ComfyUI Node

Forward Diffusion (Add Scheduled Noise)

Add the exact right amount of noise, sampler-style

By ttulttul·Created 9 months ago·Updated 3 months ago· 14
Forward Diffusion (Add Scheduled Noise)
  • model
  • latent
  • mask
  • LATENT
seed0
steps20
noise_strength0.80

Adding noise to a latent sounds trivial - just add random numbers, right? But the amount of noise matters enormously, and it has to be the amount your model's sampler expects at a given step. Forward Diffusion (Add Scheduled Noise) is the node that gets this right: instead of a blind strength slider, it reads the actual sigma schedule from your model and noises the latent to the exact point a KSampler would start from. It's "add noise" with the sampler's blessing.

That makes it the tool for the trickier half of img2img-style pipelines: you don't want to just smear the input latent and hope, you want to push it along the model's own forward-diffusion path so the denoiser recognizes it as a valid starting point. It also composes naturally with inpainting - noise a masked region to a specific schedule point while leaving the rest clean, then let the sampler reconstruct only that area.

How it works

The node builds a KSampler(model, steps=steps) and reads its sigmas - the same schedule your sampler will later denoise through. It maps noise_strength to a start step with start_step = steps - int(steps * noise_strength), grabs the sigma at that point, and computes:

noised = latent + gaussian_noise(seed) * sigma

That single multiply by the schedule's sigma is the whole difference between "correctly pre-noised" and "randomly noisy." If the ComfyUI sampler module isn't available, it falls back to a linear sigma ramp linspace(1, 0, steps), so it never hard-crashes - it just gets less precise.

The inputs that matter:

  • model - the diffusion model whose schedule you're borrowing. This is what makes the noise "scheduled."
  • latent - the clean latent to push forward.
  • seed - fixes the noise.
  • steps - must match the KSampler you'll run afterward (the tooltip is explicit: noise_strength must match the KSampler's effective start step).
  • noise_strength - how far along the schedule to go. 0 is a no-op; 0.8 means "noise to 80% through the schedule."

The optional mask limits the noising to masked areas - the classic inpaint setup.

Installing it

Part of the Skoogeer-Noise pack. ComfyUI Manager: search "Skoogeer-Noise", install, restart. Or:

cd ComfyUI/custom_nodes
git clone https://github.com/ttulttul/Skoogeer-Noise
# restart ComfyUI

Standard deps, no model downloads.

Gotchas

  • Match steps and noise_strength to your KSampler. If your sampler runs 30 steps at denoise 0.6, feed this node 30 steps and 0.6. Mismatches mean the noise lands at a different schedule point than the sampler expects, and you get a subtly off result that's hard to diagnose.
  • Noise adds, it doesn't blend. This node replaces the "clean" latent with a noised version. If you wanted to merge two latents with different noise levels, that's a different operation - this one is strictly forward diffusion.
  • The linear fallback is a hint something's off. If you see noise that doesn't match the sampler's curve, check that the ComfyUI sampler module is importable in your install (it should be in a standard install).
  • There's a mask - use it. Localized noising is the difference between "edit one region" and "re-roll the whole image."
CategoryLatent/Noise

Inputs (6)

NameTypeDefaultDescription
modelMODELDiffusion model that defines the forward noise schedule.
latentLATENTClean latent to push forward along the schedule.
seedINT00–18446744073709550000Seed for the forward diffusion noise.
stepsINT201–10000Number of steps in the sampler's schedule.
noise_strengthFLOAT0.800–1The point in the schedule to noise to. Must match the KSampler's effective start step.
maskoptMASKOptional mask (often image-sized) to limit the noising to masked areas. The mask is resized to latent resolution (bicubic when downscaling).

Outputs (1)

NameTypeDescription
LATENTLATENT