Batch Creative Interpolation ποΈπ ’π
The node that makes images travel
- positive
- negative
- images
- model
- ipadapter
- clip_vision
- base_ipa_advanced_settings
- detail_ipa_advanced_settings
- GRAPH
- POSITIVE
- NEGATIVE
- MODEL
- KEYFRAME_POSITIONS
- BATCH_SIZE
- BUFFER
- FRAMES_TO_DROP
This is the node Steerable Motion is named after. Feed Batch Creative Interpolation ποΈπ ’π a batch of images and it builds the weight schedules that walk AnimateDiff from image 1 to image 2 to image 3 - not a linear morph, but a creative interpolation, where each keyframe steers motion, prompt, and detail through the run. The author's founding idea, back when this was a fine-tuning project in 2023, was exactly this: small changes get FILM's linear interpolation, big changes get "creative interpolation" from a video model. This node is the creative half, shipped as a box you can actually use.
What it does
It takes your keyframe images plus your model, IP-Adapter, and CLIP Vision, computes where each keyframe lands in the timeline, builds per-frame IP-Adapter weight schedules between them, applies IP-Adapter to the model (in high-detail mode, twice - a base pass and a tiled detail pass), and returns the model ready for the sampler plus the whole schedule so the rest of the workflow can use it.
The inputs that matter
Ignore the wall of fields at first; there are three "distribution" groups and everything else supports them:
- type_of_frame_distribution: linear spreads your keyframes evenly every
linear_frame_distribution_valueframes (default 16); dynamic uses your explicit list indynamic_frame_distribution_values(default0,10,26,40). - type_of_key_frame_influence: how far each keyframe's grip reaches into its neighbors - linear (default
(1.0,1.0)) or dynamic per-keyframe tuples. - type_of_strength_distribution: the strength envelope per keyframe - linear default
(0.3,0.4)or dynamic tuples like(0.0,1.0). - buffer (default 4): padding frames added at the start and end so the motion isn't slammed to a stop.
- high_detail_mode (default true): toggles the second, tiled IP-Adapter pass that keeps detail crisp. Turn it off if VRAM is tight; the visual difference is real but the memory cost is too.
- The two optional
ADVANCED_IPA_SETTINGSinputs (base_ipa_advanced_settings,detail_ipa_advanced_settings) take the output of the pack'sIpaConfigurationnode - that's where the real motion-tuning happens.
The outputs and where they go
Eight outputs, and they're a shopping list for the rest of the AnimateDiff workflow:
- GRAPH - an IMAGE: a matplotlib plot of the ControlNet vs IP-Adapter weight curves. This is your debug screen; if the curves look wrong, the video will too.
- MODEL - the model with IP-Adapter applied, straight into your AnimateDiff sampler.
- POSITIVE / NEGATIVE - your conditioning, passed through untouched.
- KEYFRAME_POSITIONS (STRING) and FRAMES_TO_DROP (STRING) - the schedule values, the latter feeding
RemoveAndInterpolateFramesto clean up the glitch frames that keyframe handoffs love to produce. - BATCH_SIZE and BUFFER (INT) - wire BATCH_SIZE into the sampler's latent frame count; they must agree or nothing renders.
Install and the honest part
Pack install is the same as always - Manager β "Steerable Motion", or git clone https://github.com/banodoco/steerable-motion into ComfyUI/custom_nodes/. The repo needs only matplotlib (for that GRAPH plot, hence the dependency). But this node is the reason the README tells you to hit "Install Missing Custom Nodes": the shipped workflows lean on AnimateDiff-Evolved, Advanced-ControlNet with SparseCtrl, FizzNodes for prompt scheduling, and VideoHelperSuite, plus an IP-Adapter model and a CLIP Vision model from Manager.
The honest part is that people find this node - and this whole pack - genuinely hard. The launch thread's top sentiment was "very complex to use," and the author's own framing is that this is a paintbrush, not a text-to-video button. Start with the Smooth n' Steady workflow, change one value, watch the GRAPH, repeat. The SuperBeasts POM derivative workflow in the demo/ folder is a friendlier, better-tested starting point if you want results before you want understanding.
Inputs (19)
| Name | Type | Default | Description |
|---|---|---|---|
| positive | CONDITIONING | β | |
| negative | CONDITIONING | β | |
| images | IMAGE | β | |
| model | MODEL | β | |
| ipadapter | IPADAPTER | β | |
| clip_vision | CLIP_VISION | β | |
| type_of_frame_distribution | COMBO | 2 options: linear, dynamic | |
| linear_frame_distribution_value | INT | 164β64 | β |
| dynamic_frame_distribution_values | STRING | 0,10,26,40 | β |
| type_of_key_frame_influence | COMBO | 2 options: linear, dynamic | |
| linear_key_frame_influence_value | STRING | (1.0,1.0) | β |
| dynamic_key_frame_influence_values | STRING | (1.0,1.0),(1.0,1.5)(1.0,0.5) | β |
| type_of_strength_distribution | COMBO | 2 options: linear, dynamic | |
| linear_strength_value | STRING | (0.3,0.4) | β |
| dynamic_strength_values | STRING | (0.0,1.0),(0.0,1.0),(0.0,1.0),(0.0,1.0) | β |
| buffer | INT | 41β16 | β |
| high_detail_mode | BOOLEAN | true | β |
| base_ipa_advanced_settingsopt | ADVANCED_IPA_SETTINGS | β | |
| detail_ipa_advanced_settingsopt | ADVANCED_IPA_SETTINGS | β |
Outputs (8)
| Name | Type | Description |
|---|---|---|
| GRAPH | IMAGE | β |
| POSITIVE | CONDITIONING | β |
| NEGATIVE | CONDITIONING | β |
| MODEL | MODEL | β |
| KEYFRAME_POSITIONS | STRING | β |
| BATCH_SIZE | INT | β |
| BUFFER | INT | β |
| FRAMES_TO_DROP | STRING | β |