Curved ControlNet Scheduler
ControlNet strength that fades along a curve, not a cliff
- prev_timestep_kf
- TIMESTEP_KF
- curve_graph
Every ControlNet user learns the same lesson: the condition shouldn't usually ride at full strength for all 30 steps. Hold a pose ControlNet at 1.0 the whole way and the image looks pasted; let it go entirely and you lose the composition. The standard tool is two fields - start and end step - which gives you a cliff. This node is the pack's namesake, and it replaces that cliff with a curve: ControlNet strength that eases, bells, waves, or exponentially decays across the generation, defined by a dropdown and a steepness knob. It's the simplest on-ramp into the whole curved_weight_schedule ecosystem, and honestly the one to start with.
How it works
It samples a strength curve across num_keyframes control points spanning start_percent to end_percent, with start_strength and end_strength at the ends. Between them, curve_type decides the shape:
linear,ease_in,ease_out,ease_in_out- the standard transitions. These are the workhorses.sine_wave- oscillating, for when you want control to pulse. Experimental, per the author.bell_curve,reverse_bell- peak in the middle, or valley.exponential,bounce,custom_bezier- the flavour picks.
curve_param controls how extreme the curve gets (higher = steeper). invert_curve flips the shape, clamp_strengths keeps values in the 0–10 band, and show_graph gives you the all-important visual preview.
The output TIMESTEP_KF goes straight into Apply Advanced ControlNet's timestep_kf input; curve_graph is the preview IMAGE. That's the whole interface - two outputs, no extra machinery. prev_timestep_kf exists so you can chain a scheduler onto existing keyframes without losing them.
Installing it
Standard pack install:
cd ComfyUI/custom_nodes
git clone https://github.com/diffussy69/comfyui-curved_weight_schedule
pip install matplotlib pillow numpy torch scipy
This node needs Kosinkadink's ComfyUI-Advanced-ControlNet to be present (it emits TimestepKeyframe objects). The original upstream version is fine for non-temporal scheduling; only the temporal-mask features need the modified fork. Restart, hard-refresh.
Where people get burned
Missing Advanced ControlNet = Could not import TimestepKeyframe at startup. And the classic conceptual slip: start_strength/end_strength are yours to set - "Fade Out" isn't automatic. Want strong-to-weak? Set 1.0 → 0.0. Want weak-to-strong? 0.0 → 1.0. The node won't guess the direction for you.
One more honest note: this whole pack has basically zero community discussion - I checked, and nobody's sharing tuned curves for it. You'll be tuning curve_param yourself. That's fine: the graph preview makes iteration fast, and the Advanced version of this node adds presets if you want a one-click Fade Out without thinking about strength values at all.
Inputs (12)
| Name | Type | Default | Description |
|---|---|---|---|
| num_keyframes | INT | 102–100 | Number of keyframes to generate across the timestep range |
| start_percent | FLOAT | 0.0000–1 | Starting point in generation (0.0 = beginning) |
| end_percent | FLOAT | 1.0000–1 | Ending point in generation (1.0 = end) |
| start_strength | FLOAT | 1.000–10 | ControlNet strength at start_percent |
| end_strength | FLOAT | 0.000–10 | ControlNet strength at end_percent |
| curve_type | COMBO | Shape of the interpolation curve between start and end strength | |
| curve_param | FLOAT | 2.00.1–10 | Curve steepness: higher = more extreme curve |
| prev_timestep_kfopt | TIMESTEP_KEYFRAME | — | |
| invert_curveopt | BOOLEAN | false | Invert the curve shape |
| clamp_strengthsopt | BOOLEAN | true | Clamp strength values to valid range (0-10) |
| print_keyframesopt | BOOLEAN | false | Print generated keyframes for debugging |
| show_graphopt | BOOLEAN | true | Generate visual graph of the curve |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| TIMESTEP_KF | TIMESTEP_KEYFRAME | — |
| curve_graph | IMAGE | — |