Nodes/kentskooking-nodes/Video Wave Controller
ComfyUI Node

Video Wave Controller

The heartbeat of the pack — cycle motion, zoom and steps over time

By Kentskooking·Created 10 months ago·Updated 15 days ago· 8
Video Wave Controller
    • wave_config
    wave_typetriangle
    cycle_length60
    step_floor5
    start_at_step16
    end_at_step36
    zoom_min1.00
    zoom_max1.25
    clip_strength_min0.00
    clip_strength_max1.00

    Every animation needs a rhythm, and in kentskooking-nodes the rhythm comes from a wave. Video Wave Controller is where you define that rhythm for video: how long a cycle lasts, how the denoise steps swing, how much the zoom pushes in, and how hard CLIP guidance holds across the run. It's a config node - it outputs a WAVE_CONFIG, nothing more - but it's the node that makes the Video Iterative Sampler feel alive instead of like a static image with noise on top.

    What the knobs do

    • wave_type - triangle (default), sine, sawtooth, or square. Triangle gives the classic smooth up-and-down cycle that starts at minimum and peaks at maximum. Sawtooth ramps up and resets (a one-way push each cycle); square is an on/off binary - best for strobing effects, worst for anything organic.
    • cycle_length - frames per cycle. The wave resets here, so 60 frames at 30fps is a 2-second rhythm. This is the tempo knob.
    • step_floor - the minimum denoise steps per frame. The low end of the cycle; too low and the "calm" frames turn to mush.
    • start_at_step / end_at_step - the denoise step scheduler range. The wave oscillates the end step between start_at_step + step_floor and end_at_step across the cycle, so frames breathe between heavy and light re-noise. That swing is what produces the pulsing motion feel.
    • zoom_min / zoom_max - the zoom range per cycle. Both at 1.0 means no zoom; zoom_max 1.25 with zoom_min 1.0 gives a push-in that retracts each cycle. Note the VAE rule: any zoom ≠ 1.0 means the sampler needs a VAE for pixel-space zooming.
    • clip_strength_min / clip_strength_max - the range of CLIP guidance strength. Waving this is how you let the video drift stylistically at the cycle's low points and snap back toward the prompt at its high points.

    How it works

    The controller packages all of it into a wave_config dict with a controller_variant: "advanced" marker. The sampler reads it per frame: it computes position = frame_idx % cycle_length, evaluates the wave at that position for the end step, zoom, and CLIP strength, then runs that frame's sample. Everything downstream - the apply nodes for ControlNet, IPAdapter, style - reads the same wave_config and modulates its own strength off the same clock, which is how the whole graph stays in sync.

    One output: wave_config. Wire it to the Video Iterative Sampler, and optionally through the apply/controller nodes in between.

    Installing it

    Part of kentskooking-nodes: ComfyUI Manager → search kentskooking-nodes → install → restart, or:

    cd ComfyUI/custom_nodes
    git clone https://github.com/Kentskooking/kentskooking-nodes
    

    Restart after. No models, no extra dependencies.

    Tuning notes

    Start with the defaults and only change cycle_length and step_floor on your first run - the rhythm and the floor are what you can hear with your eyes. If frames come out blurry at the cycle low points, raise step_floor. If the motion feels too mechanical, switch triangle to sine, which eases into the peaks instead of hitting them at constant speed. And if zoom feels like a cheap digital punch, lower zoom_max - the exponential zoom compounds over cycles, so 1.25 gets aggressive fast.

    Categorykentskooking/controllers

    Inputs (9)

    NameTypeDefaultDescription
    wave_typeCOMBOtriangle4 options: triangle, sine, sawtooth, square
    cycle_lengthINT601–10000
    step_floorINT51–10000
    start_at_stepINT160–10000
    end_at_stepINT361–10000
    zoom_minFLOAT1.000.1–10
    zoom_maxFLOAT1.250.1–10
    clip_strength_minFLOAT0.000–2
    clip_strength_maxFLOAT1.000–2

    Outputs (1)

    NameTypeDescription
    wave_configWAVE_CONFIG