H3 Join — up to 5 rails
H3 Join Fixes the Joins You Never Noticed
- images_1
- audio_1
- images_2
- audio_2
- images_3
- audio_3
- images_4
- audio_4
- images_5
- audio_5
- frames
- audio
- total_frames
- report
The boring node that keeps your video from drifting and clicking
H3 Join - up to 5 rails (H3 Join - up to 5 rails, from PromptMasterLD) is the one nobody plans for and everybody needs: it concatenates up to five IMAGE rails and their AUDIO rails into a single output. Wire rails 1, 2 and 5, and it joins three. An empty slot is skipped, not an error - which matters when a graph bypasses a rail or only sometimes uses one.
But "no knobs, just concatenate" hides the two things that make it worth reaching for over a pile of stock Concat nodes, and both are H3-specific.
The two fixes nobody thinks about
Audio drift. H3's audio grid is 40Hz against 24fps picture. A clip carries up to half a latent step - around 8.3ms - more or less sound than picture, and which way depends on its frame count. Leave that error alone and it accumulates across joins; correct it per clip and it's exactly zero. H3 Join corrects each clip, so the fourth join doesn't land a frame out of sync with the song.
Clicking. A join is a hard cut between two separate renderings of different instants. It's not a crossfade - a crossfade needs two renderings of the same instant, and a join has none - so H3 Join ramps both sides through zero for 1ms. Without that ramp, every join clicks like a dirty potentiometer. The node used to expose both fps and declick_ms as widgets; they're now fixed constants (24fps, 1ms), because there was never a second correct answer and a tidier face beat a false choice.
What it does behind the scenes, and what you see
Concatenation can't happen without agreement, so the first wired clip sets the canvas and later clips are resized to it, and mismatched sample rates get resampled - both reported in the report output, because a resize nobody asked for deserves a line. The old version raised an error when nothing was wired or a slot arrived empty; the new one treats both as ordinary and passes through.
The inputs are just the rail pairs: images_1 through images_5 (IMAGE), each with a matching audio_1 through audio_5 (AUDIO). All optional. Outputs:
- frames - the concatenated IMAGE.
- audio - the concatenated AUDIO.
- total_frames - INT, useful for checking a length against expectations.
- report - STRING, the human-readable summary of what got joined and what got resized.
Install
This is a PromptMasterLD node:
cd ComfyUI/custom_nodes
git clone https://github.com/Lora-Daddy/PromptMasterLD
cd PromptMasterLD
pip install -r requirements.txt
Restart ComfyUI, or install via ComfyUI Manager by searching "PromptMasterLD".
When you'd actually use it
The canonical spot is the end of a multishot or multi-take pipeline where several rails converge into one file - after H3 Multishot's per-shot saves, or when you render a chorus in pieces and want one deliverable. Because it's deliberate about being boring (no settings, no surprises), it's the rare utility node you can drop into a shared workflow and never think about again. About the only thing to check: the rails you join should genuinely be meant to play back to back. It will happily concatenate two shots that have nothing to do with each other - it just won't make them feel connected.
Inputs (10)
| Name | Type | Default | Description |
|---|---|---|---|
| images_1opt | IMAGE | Frames for rail 1. Leave it empty to skip. | |
| audio_1opt | AUDIO | Sound for rail 1, if it has any. | |
| images_2opt | IMAGE | Frames for rail 2. Leave it empty to skip. | |
| audio_2opt | AUDIO | Sound for rail 2, if it has any. | |
| images_3opt | IMAGE | Frames for rail 3. Leave it empty to skip. | |
| audio_3opt | AUDIO | Sound for rail 3, if it has any. | |
| images_4opt | IMAGE | Frames for rail 4. Leave it empty to skip. | |
| audio_4opt | AUDIO | Sound for rail 4, if it has any. | |
| images_5opt | IMAGE | Frames for rail 5. Leave it empty to skip. | |
| audio_5opt | AUDIO | Sound for rail 5, if it has any. |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| frames | IMAGE | — |
| audio | AUDIO | — |
| total_frames | INT | — |
| report | STRING | — |