Video Noise Factory
Procedural animated noise and film grain
- IMAGE
Video Noise Factory is a straight-up procedural generator: it synthesizes animated noise and film grain from scratch - no input image, no model. You give it a resolution and a frame count, and it hands back a batch of moving abstract textures. It's for when you need dynamic backgrounds, a noise overlay for a VHS/analog look, abstract looping footage, or just grain to layer over a clean render so it stops looking like a clean render.
This is the "generation" end of DJZ-Nodes' effects family, and it shares its DNA with the pack's video post tools - only instead of processing your frames, it makes its own.
How it works
The node is built on OpenSimplex noise (the smoothed, natural-looking cousin of Perlin noise) plus a per-pixel math layer for grain. There are eight noise_type flavors, and they're distinct algorithms, not just recolors:
- Plasma - flowing plasma blobs; RGB Turbulence - turbulent distortion per color channel; Prismatic - smooth rainbow transitions; HSV Noise - noise computed in hue/saturation space, so the colors stay rich; Perlin RGB - independent Perlin fields per channel; Polychromatic Cellular - Voronoi-style cell patterns; Rainbow Fractal - fractal layering with rainbow hues; Color Wavelet - wave-like patterns with color phase shifts.
Shared noise dials (noise_scale, octaves 1–8 for layering detail, persistence for how each octave contributes, turbulence, frequency, saturation) tune whichever type you picked.
Then there's the film grain layer, which is a separate system on top of the noise. grain_preset offers a few ready-made personalities (subtle, vintage, unstable_signal, dip, ebb, flow) and custom, where grain_expression is a math string you write with t (frame) and normal(...) available - the default is 0.08 * normal(0.5, 0.15) * (1 + 0.2 * sin(t/25)), which reads as "moderate random grain that breathes slowly." base_intensity scales it, time_scale speeds the animation, grain_scale sets the grain's fineness.
The inputs that matter
width/height(64–4096) andnum_frames(1–1000) - this is a generator, so you set the canvas and length, not an input image.noise_type- the biggest lever; try all eight, they're wildly different.noise_seedandgrain_seed- two independent seeds so you can hold the pattern still while re-rolling the grain, or vice versa.red_balance/green_balance/blue_balance(0–2) - channel tinting, handy for pushing the whole output warm or cool.octavesandpersistence- the two knobs that move it from "smooth gradient" to "detailed texture."
Output is a single IMAGE batch, num_frames long.
Installing it
Standard DJZ-Nodes install:
cd ComfyUI/custom_nodes
git clone https://github.com/MushroomFleet/DJZ-Nodes
cd DJZ-Nodes
pip install -r requirements.txt
Restart ComfyUI, or find it via ComfyUI Manager by searching "DJZ-Nodes". The opensimplex dependency in requirements.txt is what powers this node.
Troubleshooting
- Grain expression does nothing / breaks. It's
eval-based with a restricted namespace. Keep it to simple math witht,sin,cos,normal; a bad expression falls back to 1.0 and your grain silently vanishes. - Output is too smooth. Bump
octaves(6–8) and raisenoise_scale; low octaves give you featureless blobs. - Grain is invisible.
base_intensityat 0.1 is subtle by design - raise it, or dropgrain_scaleso the grain is finer and denser. - "Why does this look like a screensaver?" Because it kind of is one - that's the intended use. If you wanted it for grain overlay, layer it over footage with a blend node rather than using it as the whole frame.
Good honest tool. The film grain side alone justifies it if you do analog-video finishing, and the generator end is fun to throw at backgrounds when you're out of ideas.
Inputs (20)
| Name | Type | Default | Description |
|---|---|---|---|
| width | INT | 51264–4096 | — |
| height | INT | 51264–4096 | — |
| num_frames | INT | 241–1000 | — |
| noise_type | COMBO | RGB Turbulence | 8 options: Plasma, RGB Turbulence, Prismatic, HSV Noise, Perlin RGB, Polychromatic Cellular, +2 |
| noise_scale | FLOAT | 1.00.1–10 | — |
| octaves | INT | 41–8 | — |
| persistence | FLOAT | 0.500–1 | — |
| turbulence | FLOAT | 0.50–2 | — |
| frequency | FLOAT | 1.00.1–5 | — |
| saturation | FLOAT | 1.00–2 | — |
| grain_preset | COMBO | subtle | 7 options: custom, subtle, vintage, unstable_signal, dip, ebb, +1 |
| grain_expression | STRING | 0.08 * normal(0.5, 0.15) * (1 + 0.2 * sin(t/25)) | — |
| base_intensity | FLOAT | 0.100–1 | — |
| time_scale | FLOAT | 1.00.1–10 | — |
| grain_scale | FLOAT | 0.200–1 | — |
| red_balance | FLOAT | 1.00–2 | — |
| green_balance | FLOAT | 1.00–2 | — |
| blue_balance | FLOAT | 1.00–2 | — |
| noise_seed | INT | 00–4294967295 | — |
| grain_seed | INT | 00–4294967295 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | — |