π H3 Chain - LD
Motion, Voice and Continuity Carry Across Every Cut
- model
- clip
- video_vae
- audio_vae
- start_image
- sampler
- sigmas
- latent
- master_frames
- master_audio
- shots_rendered
The multishot idea, but with continuity instead of hope
The stock multishot sampler chains shots and mostly keeps the scene alive. H3 Chain (π H3 Chain - LD, under LD / PromptMaster, in PromptMasterLD) does the same job with a stricter idea of what "continuous" means: each new shot doesn't just start from the previous shot's last frame - it's handed three separate pieces of memory, each with its own job.
- A keyframe - where the shot continues from.
- A short video + audio reference of the previous shot's tail - how it was moving. This is the motion carry: the exact velocity, the gait, the momentum the next shot has to match.
- A long standalone voice anchor from shot 1 - who is speaking. Voice timbre and room tone, held across the whole chain.
The script format is the same ----separated contract the multishot sampler uses, so scripts you already wrote port unchanged. Which is the nice thing about this pack's philosophy: the formats don't fork, only the mechanism does.
The dials that cost you money, and the ones that don't
H3 sampling bills by reference rows, and this node is unusually honest about pricing - it prints the exact cost of every carry before the first step. Two inputs live on that ledger:
- carry_frames (default 22) - frames of the previous shot handed over as video reference. Snaps down to H3's 17k+5 grid (5, 22, 39, 56, 73...), so type 72 and you get 56. The paired audio length is derived from this, never set separately, so picture and sound can't drift apart. 22 (about 0.92s) is enough to establish velocity; go higher only for rhythm or gait. The catch: reference rows ride through every sampling step, and picture costs roughly 43Γ what sound does per second.
- voice_anchor_seconds (default 15) - seconds of shot 1's audio shown to every later shot as a standalone reference. It's anchored to shot 1 rather than the previous shot specifically so voice can't drift down the chain like a game of telephone. Costs 80 rows per second, so 15s is about a third of one second of picture. 0 disables it.
- carry_scale - the resolution of the carried reference as a fraction of the render. Rows scale with the square of this, so 0.5 costs a quarter. Motion survives downscaling far better than detail does - this is the cheap dial to reach for before you shorten the carry.
The other settings are familiar: script, shot_count (0 = one per prompt), width/height/frames_per_shot (all ignored if you connect latent - H3 Studio's latent sets shape for every shot), steps, seed, and start_image for shot 1's first frame. seed_per_shot defaults on because the pack measured it: varying the seed per shot holds the face; one seed for everything drifts both face and voice. You can also override the sampler or schedule with a SAMPLER or SIGMAS node, and flip vram_guard on if you hit Fault failed: 2.
Outputs and install
The outputs follow the same contract as the multishot sampler: master_frames (IMAGE) and master_audio (AUDIO) are the finished chained render, with shots_rendered (INT) telling you how many shots made it into the master.
cd ComfyUI/custom_nodes
git clone https://github.com/Lora-Daddy/PromptMasterLD
cd PromptMasterLD
pip install -r requirements.txt
Restart, or install via ComfyUI Manager β search "PromptMasterLD".
Where people get burned
The voice anchor only helps if shot 1 actually has a voice - write shot 1 so the character speaks. And watch the cumulative price: a carry_frames of 56 across eight shots isn't 56 frames of work, it's 56 Γ steps Γ 7 later shots. If a long chain is crawling, cut carry_frames to 22 and drop carry_scale before you shorten anything else.
Inputs (22)
| Name | Type | Default | Description |
|---|---|---|---|
| model | MODEL | β | |
| clip | CLIP | β | |
| video_vae | VAE | β | |
| audio_vae | VAE | β | |
| script | STRING | Shot 1 prompt. --- Shot 2 prompt. | One prompt per shot, '---' between shots. |
| shot_count | INT | 00β64 | 0 = one shot per prompt in the script. |
| width | INT | 57632β4096 | Ignored when 'latent' is connected. |
| height | INT | 86432β4096 | Ignored when 'latent' is connected. |
| frames_per_shot | INT | 2265β1000 | Snaps to H3's 17k+5 grid. Ignored when 'latent' is connected. |
| seed | INT | 00β18446744073709550000 | β |
| steps | INT | 61β50 | Ignored when 'sigmas' is connected. |
| carry_frames | INT | 225β243 | Frames of the PREVIOUS shot handed to this one as a video reference β this is the motion carry. Snapped DOWN to H3's 17k+5 grid (5, 22, 39, 56, 73...), so 72 becomes 56. The paired audio length is derived from this, never set separately, so picture and sound cannot drift apart. 22 (0.92s) is enough to establish velocity; go higher only for rhythm or gait. Reference rows ride through EVERY sampling step and picture is ~43x dearer per second than sound β the exact cost is printed before the first step. |
| voice_anchor_seconds | FLOAT | 15.00β30 | Seconds of SHOT 1's audio shown to every later shot as a standalone reference β voice timbre and room tone. Anchored to shot 1 rather than the previous shot so it cannot drift down the chain. Costs 80 rows per second, so 15s is roughly a third of one second of picture. 0 disables. |
| start_imageopt | IMAGE | Optional first frame. Shot 1 continues from it exactly as later shots continue from their predecessor. | |
| seed_per_shotopt | BOOLEAN | true | Measured upstream: varying the seed per shot HOLDS the face across the chain; one seed for every shot made both face and voice drift. |
| sampler_nameopt | COMBO | res_multistep | Ignored when 'sampler' is connected. |
| scheduleropt | COMBO | simple | Ignored when 'sigmas' is connected. |
| carry_scaleopt | FLOAT | 1.000.25β1 | Resolution of the carried reference, as a fraction of the render. Rows scale with the SQUARE of this, so 0.5 costs a quarter. Motion survives downscaling far better than detail does, so this is the cheap dial to reach for before shortening the carry. |
| vram_guardopt | BOOLEAN | false | Evict the DiT before each text encode and release the encoder before each sample. Costs a full model swap per shot; turn on only if 'Fault failed: 2' appears. |
| sampleropt | SAMPLER | Any SAMPLER node β the Turbo sampler included. Replaces sampler_name for every shot. | |
| sigmasopt | SIGMAS | Any SIGMAS node. Replaces scheduler + steps for every shot. | |
| latentopt | LATENT | H3 Studio's latent. Its shape sets width, height and frames_per_shot for EVERY shot. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| master_frames | IMAGE | β |
| master_audio | AUDIO | β |
| shots_rendered | INT | β |