ποΈ SM Video Base
Steer your latent interpolation with real video frames
- base_latents
- vae
- video_frames_1
- video_frames_2
- video_frames_3
- video_frames_4
- video_frames_5
- video_frames_6
- video_frames_7
- video_frames_8
- video_frames_9
- video_frames_10
- latents
- batch_count
- weights_plot
Plain latent interpolation is a coin flip: you pick two endpoints, the sampler walks between them, and you pray the motion is what you pictured. SM Video Base is the pack's attempt to take the coin flip out of it. It lets you say exactly which reference video drives which frames of your interpolation, and how hard - deterministic, scripted motion control, no video model required.
It's the centerpiece of the IG Nodes β Steerable Motion category, and honestly the reason most people install this pack at all. It's also the most complex node here, so let's take it apart.
How it works
You feed it a base sequence of latents (your interpolation), up to 10 optional reference clips, and a text script. It then:
- Encodes each provided
video_frames_Nthrough the VAE into latent space, resizing to match your base's spatial dimensions. - Parses your
video_controlscript - one line per reference clip, in the formatstart_frame, end_frame, (mid_start_fraction, mid_end_fraction), (start_weight, mid_weight, end_weight). Line 1 controlsvideo_frames_1, line 2 controlsvideo_frames_2, and so on. - Builds a weight envelope per clip: a linear ramp from
start_weightup tomid_weight, a hold atmid_weight, then a ramp down toend_weight- scaled byoverall_video_weight. - Blends:
base_latents * base_weightplus each weighted clip's latents, then normalizes by the total weights so you get a weighted average, not a pileup. Frames the script doesn't touch keep the base untouched.
The result is a new latent sequence where, say, frames 20β40 follow clip 1 while frames 50β150 follow clip 2, each fading in and out on your terms.
The inputs and outputs that matter
Required: base_latents (the sequence you're steering - wire in the output of an interpolation or any latent batch), vae, video_control (the multiline script; use SM Video Base Control to author and validate it), overall_video_weight (scales every clip's envelope - crank past 1.0 to push video influence harder), and base_weight (how much the base itself contributes).
Optional: video_frames_1 through video_frames_10, each an IMAGE batch from a video loader or frame sequence.
Outputs: latents (the blended sequence β straight into a KSampler), batch_count (the frame count of your base - handy for sizing loops), and weights_plot (a matplotlib-rendered chart of every envelope overlaid, so you can see what you wrote before you sample). Wire that last one into a preview node.
Where people get burned
- The format is strict. Seven comma-separated values per line,
end_frame > start_frame, fractions0 β€ a < b β€ 1, weights 0β1. Get it wrong and you get a clear error naming the line - annoying, but at least it's a clear error. - A control line referencing an unprovided frame raises. And a clip with no control line is silently ignored. Keep the script and the inputs in lockstep.
- The node is loud. It prints
[DEBUG]lines for every encode, every weight, every phase. Your console will look like a packet capture. Harmless, just noisy. - This blends motion, it doesn't invent it. Your output is only as good as the reference frames and envelope you provide. Garbage clip in, garbage steering out.
matplotlibis a hard requirement (it's in the pack's requirements.txt) - theweights_plotoutput depends on it.
Installing it
It's in IDGallagher/ComfyUI-IG-Nodes ("IG Interpolation Nodes"). Via ComfyUI Manager, search "IG Interpolation Nodes", or:
cd ComfyUI/custom_nodes
git clone https://github.com/IDGallagher/ComfyUI-IG-Nodes
Restart and let the requirements install. No model downloads for this node - the author's related project, ComfyUI-IG-Motion-I2V, is where the learned motion lives; here everything runs on the VAE you already have. And a fair warning to set expectations: the README is literally a smiley face and there's almost zero community discussion of this node by name, so you're reverse-engineering alongside everyone else. The defaults are sane, though, and the format is learnable in one sitting.
Inputs (15)
| Name | Type | Default | Description |
|---|---|---|---|
| base_latents | LATENT | β | |
| vae | VAE | β | |
| video_control | STRING | β | |
| overall_video_weight | FLOAT | 1.00 | β |
| base_weight | FLOAT | 1.00 | β |
| video_frames_1opt | IMAGE | β | |
| video_frames_2opt | IMAGE | β | |
| video_frames_3opt | IMAGE | β | |
| video_frames_4opt | IMAGE | β | |
| video_frames_5opt | IMAGE | β | |
| video_frames_6opt | IMAGE | β | |
| video_frames_7opt | IMAGE | β | |
| video_frames_8opt | IMAGE | β | |
| video_frames_9opt | IMAGE | β | |
| video_frames_10opt | IMAGE | β |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| latents | LATENT | β |
| batch_count | INT | β |
| weights_plot | IMAGE | β |