Pulse Retake · MiniMax H3
Re-render the three bad seconds, not the whole MiniMax H3 film
- model_fl2va
- clip
- vae
- audio_vae
- images
- base_audio
- images
- audio
- plan
The whole film is good except the three seconds at 0:12
That's the moment this node exists for. With most video models, "fixing" a bad span means re-rendering the whole clip and hoping the rest doesn't drift. Pulse Retake is the scissor: you mark the bad span, it pins the exact frame before the cut and the exact frame after it as anchors, renders only the gap, and stitches the patch back into the untouched head and tail.
The elegant bit is that this is the one job where H3's two-anchor limit - keyframes only at frame 0 and the final frame - is an advantage rather than a compromise. A patch needs exactly two anchors. That's what the fl2va (First/Last-Frame) checkpoint is for, which is why model_fl2va is a required input here and why the reference branch isn't involved at all: patching pins both surrounding frames, no references, no <Subject N> bookkeeping.
How it works
images- the rendered clip to patch (anIMAGEbatch).cut_start_seconds/cut_end_seconds- the bad span. Patch length must sit on H3's 17k+5 frame grid, so the cut snaps to fit rather than being rejected after you've made it.prompt- what should happen in the patched span. Defaults to describing the shots that overlapped the cut.keep_base_audio(default on) - keeps the original clip's audio, because a re-rendered patch invents its own score and won't match the surrounding track. This is the setting that stops the seam sounding like a cut. Pass the clip's audio in viabase_audioso it can be returned as-is.
It also carries its own sampler controls - seed, steps (default 20), sampler_name (default res_multistep, the flow-model standard), scheduler (simple), cfg (default 1.0 - leave it; H3's pipeline has no negative conditioning), and shift_video / shift_audio. The stitch is length-preserving by construction and asserted at runtime: a mismatch would shift every frame after the patch and desync the audio. Outputs are images (the patched clip), audio, and plan - a text readout of the cut geometry.
The one job where the geometry can't line up is refused up front with a message, not silently patched.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/Addis-Pulse-Studio/comfyui-pulse-studio
Restart ComfyUI. No pip install, no dependencies beyond what a working ComfyUI already has (torch, numpy, Pillow, av), but the host must be ComfyUI 0.30.0+ with H3 support (comfy_extras/nodes_minimax_h3.py and comfy/ldm/minimax/). You need the fl2va DiT (~20 GB) from Comfy-Org/MiniMax-H3 into models/diffusion_models/minimax/, plus the text encoder and both VAEs. Remember the weights are under the geofenced MiniMax H3 Community License (no US, EU, UK, Korea), and on Linux/macOS the example graphs' loaders show red until you re-pick each file.
Where people get burned
keep_base_audioon butbase_audionot connected - the node warns and returns the patch's own audio, which covers only the patched span. The film gets quieter for those three seconds. Wire the original audio in if you want it kept; that's the whole point of the flag.- Expecting the patch to match the surrounding grade. It won't, exactly - the two sides are independent generations.
keep_base_audiohandles the audio side; the visual seam is up to how carefully yourpromptdescribes the patched span. This is a scissor, not a magic wand. - The render target is the fl2va checkpoint, and it samples internally, so an unpatched model is felt here too - the node runs the same patch inspection and warning as the rest of the pack. Run it without Sol-Attn/Spectrum wired and expect the memory and speed characteristics of an unpatched H3 render.
Inputs (19)
| Name | Type | Default | Description |
|---|---|---|---|
| model_fl2va | MODEL | The First/Last-Frame checkpoint. Patching pins both surrounding frames, which is the fl2va branch specifically. | |
| clip | CLIP | — | |
| vae | VAE | — | |
| audio_vae | VAE | — | |
| images | IMAGE | The rendered clip to patch. | |
| schema_version | STRING | 3.0.0 | Which widget layout this node was saved with. Written by the node, read at load time to restore values by name. Do not edit. |
| prompt | STRING | What should happen in the patched span. Defaults to describing the shots that overlapped the cut. | |
| cut_start_seconds | FLOAT | 0.000–3600 | — |
| cut_end_seconds | FLOAT | 1.000–3600 | — |
| keep_base_audio | BOOLEAN | true | Keep the original clip's audio. A re-rendered patch invents its own score and will not match the surrounding track. |
| fps | INT | 241–120 | — |
| seed | INT | 00–18446744073709550000 | — |
| steps | INT | 201–100 | — |
| sampler_name | COMBO | res_multistep | 6 options: res_multistep, euler, euler_ancestral, dpmpp_2m, dpmpp_2m_sde, ddim |
| scheduler | COMBO | simple | 6 options: simple, normal, beta, sgm_uniform, karras, exponential |
| cfg | FLOAT | 1.01–20 | — |
| shift_video | FLOAT | 12.000.01–100 | — |
| shift_audio | FLOAT | 3.000.01–100 | — |
| base_audioopt | AUDIO | The clip's original audio, returned as-is when keep_base_audio is on. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| images | IMAGE | — |
| audio | AUDIO | — |
| plan | STRING | — |