Nodes/ComfyUI-Purz/Animated Noise (Purz)
ComfyUI Node

Animated Noise (Purz)

Film grain and TV static that actually moves

By purzbeats·Created about a year ago·Updated 3 months ago· 24
Animated Noise (Purz)
    • image
    width512
    height512
    noise_typesmooth
    intensity1.0
    seed0
    frame_count30
    wave_typesine
    wave_scale0.10
    wave_directionradial
    wave_shapesine
    math_operationadd
    wave_factor0.50
    reverse_phasefalse
    color1#000000
    color2#FFFFFF
    color_ramp_typelinear

    Static noise is the lazy man's animation - every frame is random, so nothing needs to be coherent. Animated Noise (Purz) is the opposite: it's noise with memory. Each frame evolves from the last via a moving wave, so you get drifting, swirling grain instead of frantic flicker. That's the difference between "TV static" and "organic film grain," and it's the whole reason this node exists.

    It's one of the four Purz/Patterns/Animated nodes in ComfyUI-Purz, the pack by PurzBeats (a Comfy Org staffer). If you've used the animated checkerboard or stripes, the wave controls will look familiar - same engine, different base pattern.

    How it works

    The node generates a base noise texture (random, smooth, or cloudy), then modulates it with an animating wave - a phase that advances with each frame - and finally maps the combined result onto a color ramp between two hex colors. The output is a batch of frames you can play back or feed to a video combiner.

    The star of the show is the noise_type dropdown: random (pure static, closest to TV snow), smooth (interpolated low-res noise - soft, organic, default), and cloudy (blobby, like clouds drifting). Pick smooth and a low wave factor and you've got something that reads as subtle film grain; crank the wave and it becomes an evolving liquid texture.

    The inputs that matter

    • width / height - canvas size (64–4096).
    • noise_type - random, smooth, or cloudy.
    • intensity - 0.1 to 2, default 1. How strong the noise is before the wave touches it.
    • seed - 0–9999. Reproducible: same seed + same settings = same frames.
    • frame_count - number of frames in the output batch, up to 300.
    • wave_type / wave_direction / wave_shape - the motion engine. wave_direction defaults to radial here, which gives that nice center-out swell; horizontal and vertical are useful for directional drift.
    • wave_scale - wave frequency; lower = slower, larger-scale motion.
    • wave_factor - wave strength, 0–2. This is your "how much does it move" dial - 0 makes it a static noise texture.
    • math_operation - how the wave is combined with the noise (add, multiply, maximum…).
    • reverse_phase - flips the direction of travel.
    • color1 / color2 - hex endpoints for the color ramp. Defaults are black→white; a sepia pair (#3b2f2f#e8d5b7) instantly reads as aged film.
    • color_ramp_type - linear, ease, b_spline, cardinal, constant.

    Output is image, an IMAGE batch with frame_count frames.

    Installing it

    ComfyUI Manager - search ComfyUI-Purz - or:

    cd ComfyUI/custom_nodes/
    git clone https://github.com/purzbeats/ComfyUI-Purz.git
    cd ComfyUI-Purz
    pip install -r requirements.txt
    

    Restart ComfyUI. Requirements are OpenCV, Pillow, torch, numpy; no models, no downloads beyond the pack.

    Where people get burned

    The big one: random noise is not temporal noise. If you want film grain on a video, random with a high intensity will shimmer distractingly because every frame is independent - that's the "TV static" look, which you sometimes want and usually don't. For grain that settles like real film, use smooth or cloudy and keep intensity under 1. And as with all the animated nodes, watch resolution × frame_count - 300 frames at high res is a real render. Prototype small, then scale up.

    CategoryPurz/Patterns/Animated

    Inputs (16)

    NameTypeDefaultDescription
    widthINT51264–4096
    heightINT51264–4096
    noise_typeCOMBOsmooth3 options: random, smooth, cloudy
    intensityFLOAT1.00.1–2
    seedINT00–9999
    frame_countINT301–300
    wave_typeCOMBOsine5 options: sine, cosine, square, triangle, sawtooth
    wave_scaleFLOAT0.100.01–1
    wave_directionCOMBOradial4 options: horizontal, vertical, diagonal, radial
    wave_shapeCOMBOsine3 options: sine, square, triangle
    math_operationCOMBOadd12 options: add, subtract, multiply, divide, power, minimum, +6
    wave_factorFLOAT0.500–2
    reverse_phaseBOOLEANfalse
    color1STRING#000000
    color2STRING#FFFFFF
    color_ramp_typeCOMBOlinear5 options: linear, ease, b_spline, cardinal, constant

    Outputs (1)

    NameTypeDescription
    imageIMAGE