Nodes/Steerable Motion/Batch Creative Interpolation πŸŽžοΈπŸ…’πŸ…œ
ComfyUI Node

Batch Creative Interpolation πŸŽžοΈπŸ…’πŸ…œ

The node that makes images travel

By banodocoΒ·Created 3 years agoΒ·Updated 11 months agoΒ· 975
Batch Creative Interpolation πŸŽžοΈπŸ…’πŸ…œ
  • 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
β—„type_of_frame_distributionβ–Ύβ–Ί
β—„linear_frame_distribution_value16β–Ί
β—„dynamic_frame_distribution_values0,10,26,40β–Ί
β—„type_of_key_frame_influenceβ–Ύβ–Ί
β—„linear_key_frame_influence_value(1.0,1.0)β–Ί
β—„dynamic_key_frame_influence_values(1.0,1.0),(1.0,1.5)(1.0,0.5)β–Ί
β—„type_of_strength_distributionβ–Ύβ–Ί
β—„linear_strength_value(0.3,0.4)β–Ί
β—„dynamic_strength_values(0.0,1.0),(0.0,1.0),(0.0,1.0),(0.0,1.0)β–Ί
β—„buffer4β–Ί
β—„high_detail_modetrueβ–Ί

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_value frames (default 16); dynamic uses your explicit list in dynamic_frame_distribution_values (default 0,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_SETTINGS inputs (base_ipa_advanced_settings, detail_ipa_advanced_settings) take the output of the pack's IpaConfiguration node - 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 RemoveAndInterpolateFrames to 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.

CategorySteerable-Motion

Inputs (19)

NameTypeDefaultDescription
positiveCONDITIONINGβ€”
negativeCONDITIONINGβ€”
imagesIMAGEβ€”
modelMODELβ€”
ipadapterIPADAPTERβ€”
clip_visionCLIP_VISIONβ€”
type_of_frame_distributionCOMBO2 options: linear, dynamic
linear_frame_distribution_valueINT164–64β€”
dynamic_frame_distribution_valuesSTRING0,10,26,40β€”
type_of_key_frame_influenceCOMBO2 options: linear, dynamic
linear_key_frame_influence_valueSTRING(1.0,1.0)β€”
dynamic_key_frame_influence_valuesSTRING(1.0,1.0),(1.0,1.5)(1.0,0.5)β€”
type_of_strength_distributionCOMBO2 options: linear, dynamic
linear_strength_valueSTRING(0.3,0.4)β€”
dynamic_strength_valuesSTRING(0.0,1.0),(0.0,1.0),(0.0,1.0),(0.0,1.0)β€”
bufferINT41–16β€”
high_detail_modeBOOLEANtrueβ€”
base_ipa_advanced_settingsoptADVANCED_IPA_SETTINGSβ€”
detail_ipa_advanced_settingsoptADVANCED_IPA_SETTINGSβ€”

Outputs (8)

NameTypeDescription
GRAPHIMAGEβ€”
POSITIVECONDITIONINGβ€”
NEGATIVECONDITIONINGβ€”
MODELMODELβ€”
KEYFRAME_POSITIONSSTRINGβ€”
BATCH_SIZEINTβ€”
BUFFERINTβ€”
FRAMES_TO_DROPSTRINGβ€”