Control Crossfade (Simple)
Blend two control sequences without a hard cut
- images_A
- images_B
- blended
Control Crossfade (Simple) takes two image sequences and blends one into the other over a short window, so the handoff between them reads as a transition instead of a jarring cut. It's a Mickmumpitz pack utility that shows up mostly in video work - think control frames or context images for LTX/Wan iterative generation, where you have sequence A (say, shot one) and sequence B (shot two) and want the conditioning to ease between them rather than snap.
The full pack ships a fancier ControlCrossfadeIterationFix that's aware of the pack's iteration loop and blends at the seam where one pass hands off to the next. This is the "Simple" version: no iteration tracking, no seam logic - you give it two batches, a transition point, and it cross-fades. For a beginner it's often the better place to start, because you can drop it in a plain workflow with no iterative machinery and watch exactly what it does.
How it works
The node walks the output batch frame by frame. Before the blend window it copies frames from images_A; after the window it copies from images_B; inside the window it interpolates each frame as (1-w) * A + w * B, where w ramps from 0 to 1 across the window. The blend is centered on transition_frame: the window starts blend_frames // 2 frames before the transition and ends half a window after. The curve choice (ease_in_out, linear, ease_in, ease_out) shapes that ramp. If one input batch is shorter than the other, the last frame of the shorter one is held, so the node never indexes past the end. Output length matches the longer batch.
The inputs that matter
images_A/images_B- the two IMAGE batches to blend, A being the "before" sequence.transition_frame(default 14) - the frame around which the cross-fade happens. Frames before the window are pure A, after it pure B.blend_frames(default 8, min 2) - width of the fade. Too narrow and you're back to a hard cut; too wide and you'll see the A footage ghosting through the middle. 8 is a sensible starting point.curve- easing applied to the blend weight.ease_in_outis the standard choice;linearis fine for short fades where nobody's counting.
The single output, blended, is an IMAGE you'd wire straight into whatever consumed the originals - a ControlNet apply, a context-image input, a save node.
Installing it
This is part of the Mickmumpitz pack, so it comes with the whole set. In ComfyUI Manager, search "Mickmumpitz", install, restart. Or:
cd ComfyUI/custom_nodes
git clone https://github.com/mickmumpitz/ComfyUI-Mickmumpitz-Nodes.git
Dependencies are just numpy, Pillow and opencv-python (already in most ComfyUI installs) - no models to download for this node.
Common issues
The main trap is ordering: images_A and images_B must share the same spatial dimensions, and the node uses A's dimensions for the output buffer - if B is a different size you'll get a tensor-shape error rather than a graceful scale. It's a blender, not a resizer, so normalize your batches first. Also, this node is frame-index naive: it doesn't know anything about your iteration loop, so if you set transition_frame beyond the batch length you get a pure pass-through of the last frames. That's not a bug - it's what "Simple" means.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| images_A | IMAGE | — | |
| images_B | IMAGE | — | |
| transition_frame | INT | 140–200 | — |
| blend_frames | INT | 82–40 | — |
| curve | COMBO | 4 options: ease_in_out, linear, ease_in, ease_out |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| blended | IMAGE | — |