H3 Time Smear (integer holds)
The node that teaches MiniMax-H3 to draw fast motion twice as slowly
- images
- images
- hold_map_used
- length
- report
H3 Time Smear is the engine room of the MAINodes Motion Lab, and understanding it is understanding the whole de-rope trick. MiniMax-H3 smears fast motion - backflips, sword arcs, whip-fast reversals - because one latent token spans four pixel frames, and a single token can't hold four distinct poses at once. You can't re-denoise your way out of that, because the missing poses were never generated. So the pack cheats in the time domain: it regenerates the clip as a slowed-down version of itself, seeded from the original. Frames where motion is too fast get held so the model has more temporal room to draw them, and the original frame rate is recovered afterward by dropping the held frames. This node is the "slow it down" step.
How it works
Feed it the baseline frames (images) and it retimes them onto a longer, uniform grid using integer frame holds. Two modes:
- Uniform (nothing wired to
hold_map): every frame is helddilationtimes (default 4 - the zero-artifact reference point, and the highest cost). - Adaptive (wire H3 Jerk Oracle's
hold_map): only jerk-hot spans get held; quiet spans stay real-time. Cheaper, preserves the clip's natural beat contrast, at a small artifact risk where the hold curve dips inside a burst.
The output images get their length snapped up to the H3-legal 17k+5 grid by extending the final hold - or to the target model's grid when the map comes from H3 Clock Remap (LTX-2.5 is 8k+1). expand_to_end (default on) handles the awkward case where a map ends in a short rate-1 tail after an expansion span: it runs the span through the last world frame instead of jumping back to real time at the clip end.
The outputs that actually matter
hold_map_used- the map after padding and snapping. The README is emphatic: always pass this to H3 Exact Recover. It records exactly what happened so recovery is lossless. It's also what H3 True Clock, H3 Save Hold Map, and the recover nodes read.length- the dilated frame count; wire it where the pipeline needs the regenerated length.report- the price tag. A 5 s action clip regenerates as 11–13 s of frame data, and that dilated length, not your clip length, is what sets the bill and the VRAM peak. Read the TIME multiplier, not the frame one: per-step cost is superlinear in tokens, so 2.5× the frames is roughly 4.9× the time per step. You can sets_per_stepfrom a baseline render of the same clip on your card to get a minutes estimate.
Install
Ships in matlowai/ComfyUI-MAINodes:
cd ComfyUI/custom_nodes
git clone https://github.com/matlowai/ComfyUI-MAINodes
Restart, under image/minimax/motion. No extra Python deps for the nodes themselves, though the example graphs need ComfyUI-KJNodes; you also need MiniMax-H3 weights and ComfyUI's stock H3 support (check the licence's US/EU/UK/Korea carve-outs first).
The recurring beginner mistake is treating Time Smear in isolation. It's the first third of a pipeline - the full chain is baseline → oracle → Time Smear → VAE encode → H3 V2V Init → partial-denoise regen → H3 Exact Recover. Grab examples/motion_pipeline.json and read it as a whole; every node past this one exists because of the retiming it produces.
Inputs (8)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| dilation | INT | 41–8 | uniform hold count; ignored when hold_map is wired |
| hold_mapopt | STRING | from H3JerkOracle — per-frame integer holds | |
| expand_to_endopt | BOOLEAN | true | when the map ends in a SHORT rate-1 tail (<= 17 frames) after an expansion span, run that span through the last frame instead (kills the end jump). Uniform maps and longer rest tails are untouched |
| fpsopt | INT | 241–120 | only used to phrase the report in seconds |
| s_per_stepopt | FLOAT | 0.000–120 | seconds per step from a baseline render of this clip; 0 skips the minutes estimate |
| est_stepsopt | INT | 181–100 | steps the regen pass will actually run (total_steps x inject) |
| overhead_sopt | FLOAT | 6.70–600 | fixed non-sampling seconds per render (setup, VAE encode/decode). 40 measured at 1.5 MP on a warm instance; take it from the gap between your own 1-step and 2-step wall times |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |
| hold_map_used | STRING | — |
| length | INT | — |
| report | STRING | — |