Scene-Beat
The leaf that decides how long your video actually is
- scene_beats
Scene-Beat is the bottom of the pack's "play" tree - the leaf node where the actual video content gets described. It's the one node whose inputs directly change your video's total runtime, because in this whole tree the beat's duration_secs is the only parameter that controls time. The README is explicit about it: "A beat has a length in seconds (this is the only parameter that impacts the video total time)." Everything above it - scenes, acts, the play itself - is structure and shared flavor; the beats are where the seconds come from.
The theatre framing is doing real work here. A scene-beat is a segment with consistent visual and audio character: same location, same mood, same music. Change the beat, change the "Tension, Anxiety, Mystery, Joy" energy. So you'd build a scene as a handful of beats - "camera approaches a man on the beach," "he turns to face the sea," "slow zoom out" - each with its own prompt and length.
The inputs that matter
duration_secs(default 1, step 0.5) - the beat's length in seconds. The pack multiplies this by the play'sfpsto get the beat's frame count. This is your video-length knob.positive,negative- plain text prompts, not conditioning. Wire a string in, not aCLIPTextEncodeoutput. The README has a TODO about making negative optional; right now both are required fields.title(default "<Set Title>") - purely descriptive; shows up in the console traversal logs so you can tell beats apart.filename_part(default "b1") - the chunk of the output filename this beat contributes. Play (Start) builds names likefot_play_#1_#1_b1_0_0, so keep this filesystem-friendly - no slashes, no spaces you'll regret.
The single output, scene_beats, is typed SCENE_BEAT and feeds into a Scene node's scene_beat_1/scene_beat_2 inputs. The plural name is a bit of a lie - it's one beat object per node. You chain beats by using multiple Scene-Beat nodes, not by stacking them through one.
Installing
With the rest of the pack, through ComfyUI Manager (search "comfyui_play_traversal") or:
cd ComfyUI/custom_nodes
git clone https://github.com/wgedeon/comfyui_play_traversal
pip install -r requirements.txt
Restart ComfyUI. The install is the pack's usual heavy one - diffusers, accelerate, onnxruntime, opencv-python, spandrel, peft and friends - but no model downloads; you bring the video checkpoint.
Where people get burned
- Zero-frame beats. A beat shorter than
1/fpsseconds rounds to zero frames and generates no batches at all, which silently shortens your video. At 20 fps keep beats at 0.05s or more - in practice the min of 1.0 and the 0.5 step make this a non-issue unless you really crank the fps. - Frames are floating-point time × fps.
0.5sat 24 fps is 12 frames, but at 30 fps it's 15. The math isint(fps × duration)and the leftover frames get shaved off, so don't expect durations to round-trip exactly. - The hard-coded beat limit. A
Sceneonly takes two beats. The README flags this as a known limitation with dynamic lists on the TODO. - Strings, strings, strings. If you're coming from normal ComfyUI video workflows where prompts are conditioning, the STRING-only inputs here will bite you exactly once.
This is an early, single-author pack (version "2.0.0-inprogress"). It works, and the console logs the tree traversal loudly - that's your debugging aid, since the node graph itself gives you very little feedback.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| title | STRING | <Set Title> | — |
| filename_part | STRING | b1 | — |
| duration_secs | FLOAT | 1.01–100000 | — |
| positive | STRING | — | |
| negative | STRING | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| scene_beats | SCENE_BEAT | — |