Video Wave Controller
The heartbeat of the pack — cycle motion, zoom and steps over time
- wave_config
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, orsquare. 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_floorandend_at_stepacross 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_max1.25 withzoom_min1.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.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| wave_type | COMBO | triangle | 4 options: triangle, sine, sawtooth, square |
| cycle_length | INT | 601–10000 | — |
| step_floor | INT | 51–10000 | — |
| start_at_step | INT | 160–10000 | — |
| end_at_step | INT | 361–10000 | — |
| zoom_min | FLOAT | 1.000.1–10 | — |
| zoom_max | FLOAT | 1.250.1–10 | — |
| clip_strength_min | FLOAT | 0.000–2 | — |
| clip_strength_max | FLOAT | 1.000–2 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| wave_config | WAVE_CONFIG | — |