Nodes/DJZ-Nodes/Film Gate Weave
ComfyUI Node

Film Gate Weave

That subtle wobble only a projector can give you

By MushroomFleet·Created 2 years ago·Updated 5 months ago· 78
Film Gate Weave
  • images
  • IMAGE
weave_presetsubtle
custom_expressionsin(t * 0.1) * 5
amplitude_x3.0
amplitude_y1.0
frequency1.0
phase_shift0.0

Film gate weave is the reason old film footage looks alive even when nothing is moving: the frame shifts a pixel or two left and right as the film jitters through the projector gate. It's one of those artifacts nobody notices until it's gone, and then the footage suddenly looks like a clean render instead of film. FilmGateWeave adds exactly that - a small, rhythmic horizontal (and vertical) displacement to every frame in your sequence. It's a finishing node: you run it last, after your film grain and scratches, to sell the "this came off a projector" story.

How it works

The node moves each frame by an offset that varies over time - separate sine-based displacement for X and Y, with configurable amplitude, frequency, and phase. The displacement is applied via a grid warp with bilinear interpolation, so frames shift smoothly rather than snapping. The key settings:

  • weave_preset - none, subtle, moderate, heavy, or custom. The presets are sensibly tuned: subtle is about 2px of horizontal wobble (right for well-maintained projection), moderate pushes it to 4px, heavy goes to 8px plus visible vertical movement. Start with subtle; the effect reads far stronger in motion than it does in a single still.
  • amplitude_x / amplitude_y (0–20, defaults 3 and 1) - horizontal and vertical movement in pixels. Keep Y well below X; that's what real projector weave does.
  • frequency (0.1–5) - how fast the wobble cycles. Slower feels like a worn machine; faster starts to feel like a glitch.
  • phase_shift (0–2π) - offsets the start of the pattern. Use it to desync two clips you're cross-cutting, so the weaves don't line up suspiciously.
  • custom_expression - if you pick custom, this string (default sin(t * 0.1) * 5) drives the displacement, where t runs 0–2π. It's evaluated with a sandboxed math environment - sin, cos, tan, pi - so you can compose multi-frequency motion like sin(t * 1.2) * 4 + cos(t * 0.4) * 2 for that slightly irregular, organic wobble that pure sine never quite nails.

The honest take

Weave is a "you'll barely see it on a still" effect, which makes it hard to tune while staring at one frame - evaluate it in motion. The full recipe for an old-film look is usually weave (subtle/moderate) + grain + scanlines or flicker, and DJZ's pack has grain and kinescope nodes sitting right next to this one for exactly that stack. One thing to watch: at heavy with high amplitude, the edges of your frame shift enough that you'll see the image slide against the frame boundary - which is actually the authentic behavior, but if you want to hide it, generate slightly oversized frames and crop after the weave.

It's deterministic, cheap to run, and takes a whole batch of frames at once. For a two-minute video project it's the difference between "nice render with grain" and "footage."

Categoryimage/effects

Inputs (7)

NameTypeDefaultDescription
imagesIMAGE
weave_presetCOMBOsubtle5 options: none, subtle, moderate, heavy, custom
custom_expressionSTRINGsin(t * 0.1) * 5
amplitude_xFLOAT3.00–20
amplitude_yFLOAT1.00–20
frequencyFLOAT1.00.1–5
phase_shiftFLOAT0.00–6.283185307179586

Outputs (1)

NameTypeDescription
IMAGEIMAGE