ποΈ SM Video Base Control
The scratchpad that decodes SM Video Base's control script
- video_control
- base_steps
- video_length_1
- video_length_2
- video_length_3
- video_length_4
- video_length_5
- video_length_6
- video_length_7
- video_length_8
- video_length_9
- video_length_10
If you've ever opened SM Video Base, stared at its video_control text field, and thought "what the hell goes in here," this node is the author's answer. SM Video Base Control is the companion node to the pack's Steerable Motion pipeline: it opens pre-loaded with the control format written out, parses your script, and tells you how long each section of it is - before you commit to generating a single frame.
It lives in the IG Nodes β Steerable Motion menu, and it shares its text format with SM Video Base, so you can author and validate your control script in one node, then feed the same string to the base node.
What it does
The default video_control text is basically the documentation, and it's the clearest docs in the whole pack:
# Each line defines a control with the following comma-separated values:
# start_frame, end_frame, (mid_start_fraction, mid_end_fraction), (start_weight, mid_weight, end_weight)
20, 40, (0.4,0.6), (0.5,1.0,0.5)
50, 150, (0.3,0.7), (0.3,0.8,0.3)
For each line, the node parses the same strict format SM Video Base uses - end_frame must exceed start_frame, the two fractions must satisfy 0 β€ a < b β€ 1, weights must be between 0 and 1 - and computes the section length as end_frame - start_frame. That length comes out as one of the video_length_1 through video_length_10 outputs, one per control line, with unused slots sitting at 0.
What it hands you
video_control- the script string, passed through so you can wire it straight into SM Video Base.base_steps- a passthrough integer (default 0) you can use for whatever stepping logic your graph needs; it's not consumed by this node.video_length_1β¦video_length_10- the frame counts each control covers. Line 1 feedsvideo_length_1, line 2 feedsvideo_length_2, and so on. This is the useful part: it tells you the total span of your script before you buildbase_latents, so you don't discover at sampling time that your base is shorter than your controls.
The parse errors are also genuinely helpful - a malformed line raises a ValueError that names the offending line and repeats the expected format, which is more than most nodes in this pack bother to do.
Where it fits
Think of it as the "measure twice" node for the Steerable Motion workflow: author the script here, check the computed lengths, size your base latents to match, then pipe the same video_control string into SM Video Base with your reference frames. If the two nodes parse identically (they share the parser logic), what validated here runs there.
Installing it
It's part of IDGallagher/ComfyUI-IG-Nodes ("IG Interpolation Nodes"). In ComfyUI Manager, search "IG Interpolation Nodes", or:
cd ComfyUI/custom_nodes
git clone https://github.com/IDGallagher/ComfyUI-IG-Nodes
Restart and let requirements.txt install - the usual pack set: diffusers, opencv-contrib-python, matplotlib, scikit-image. No model files needed for this node itself. Worth knowing: the README is a literal smiley face and there's basically no community write-up of this node, so the format example in the default text field is the manual. Good thing it's self-explanatory.
Inputs (2)
| Name | Type | Default | Description |
|---|---|---|---|
| base_steps | INT | 0 | β |
| video_controlopt | STRING | # Video Control Format: # Each line defines a control with the following comma-separated values: # start_frame, end_frame, (mid_start_fraction, mid_end_fraction), (start_weight, mid_weight, end_weight) # Example: 20, 40, (0.4,0.6), (0.5,1.0,0.5) 50, 150, (0.3,0.7), (0.3,0.8,0.3) | β |
Outputs (12)
| Name | Type | Description |
|---|---|---|
| video_control | STRING | β |
| base_steps | INT | β |
| video_length_1 | INT | β |
| video_length_2 | INT | β |
| video_length_3 | INT | β |
| video_length_4 | INT | β |
| video_length_5 | INT | β |
| video_length_6 | INT | β |
| video_length_7 | INT | β |
| video_length_8 | INT | β |
| video_length_9 | INT | β |
| video_length_10 | INT | β |