Image Wave Controller
Shape your image morph before it burns the GPU
- wave_config
Image Wave Controller is the config node that tells the Image Iterative Sampler what kind of morph it's about to run. It doesn't sample anything itself - it just builds a WAVE_CONFIG describing the cycles, the step ramp, and the zoom curve. It's small, it's boring, and it's the difference between "gentle breathing zoom" and "500 frames of violent screaming".
What the knobs do
- cycle_count - how many times the whole morph cycle repeats. Each cycle is a pass of the ramp. More cycles, longer animation, more GPU time.
- step_floor - the minimum denoise steps per iteration. This sets the low end of the ramp; don't go below ~4 or your frames start looking like static.
- start_at_step / end_at_step - the step scheduler range. The sampler ramps the denoise step count from the low end up to
end_at_stepacross the cycle, which is what gives you the classic deforum "settle down over time" feel: heavy re-noise early, careful refinement late. - zoom_rate - exponential zoom multiplier per iteration. The tooltip says it best: 1.05 = 5% zoom per iteration. At 1.0, zoom is off. This is the parameter that defines the whole vibe - a slow push-in is 1.005–1.01, a frenetic plunge is 1.05+.
- clip_strength_min / clip_strength_max - the range of CLIP/style guidance strength applied across the cycle. This is your style-hold dial: keep it high if you want the subject's identity to stick, let it dip if you want the morph to wander.
How it works
The node computes an effective cycle length from your step range and packages everything (cycle count, step ramp, zoom rate, clip strength range) into a wave_config dict. The sampler then reads it per-iteration: exponential zoom chains across cycles (each cycle picks up where the last zoom left off), while the step and clip values ramp within each cycle. That split - zoom accumulates globally, steps reset locally - is why the output has that smooth expanding-motion character instead of a strobe.
One output: wave_config. It goes to the Image Iterative Sampler, and you can run it through Wave Visualizer first to see the ramp drawn out.
Where it sits
Chain: VAE Encode your image → Image Wave Controller → Image Iterative Sampler → VAE Decode → save. That's the whole "Image Iteration" pattern from the pack README.
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 deps.
The trap
Remember the VAE rule: the moment zoom_rate is anything but 1.0, the sampler requires a VAE input (pixel-space zooming). So if you set a zoom here and get an error about a missing VAE, that's this controller's setting doing it - connect a VAE or drop zoom to 1.0. And don't sleep on clip_strength_max: at 0 it quietly stops applying CLIP guidance, and your morph turns into pure noise drift.
Inputs (7)
| Name | Type | Default | Description |
|---|---|---|---|
| cycle_count | INT | 51–10000 | Number of times to repeat the morph cycle |
| step_floor | INT | 51–10000 | Minimum steps to run (start of cycle) |
| start_at_step | INT | 160–10000 | Step scheduler start point |
| end_at_step | INT | 361–10000 | Step scheduler end point |
| zoom_rate | FLOAT | 1.000.1–2 | Exponential zoom multiplier per iteration (e.g. 1.05 = 5% zoom) |
| clip_strength_min | FLOAT | 0.000–2 | — |
| clip_strength_max | FLOAT | 1.000–2 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| wave_config | WAVE_CONFIG | — |