ComfyUI Node

Scene-Beat

The leaf that decides how long your video actually is

By wgedeon·Created 12 months ago·Updated 10 months ago· 2
Scene-Beat
    • scene_beats
    title<Set Title>
    filename_partb1
    duration_secs1.0
    positive
    negative

    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's fps to get the beat's frame count. This is your video-length knob.
    • positive, negative - plain text prompts, not conditioning. Wire a string in, not a CLIPTextEncode output. 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 like fot_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/fps seconds 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.5s at 24 fps is 12 frames, but at 30 fps it's 15. The math is int(fps × duration) and the leftover frames get shaved off, so don't expect durations to round-trip exactly.
    • The hard-coded beat limit. A Scene only 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.

    CategoryFeller of Trees/Play Traversal

    Inputs (5)

    NameTypeDefaultDescription
    titleSTRING<Set Title>
    filename_partSTRINGb1
    duration_secsFLOAT1.01–100000
    positiveSTRING
    negativeSTRING

    Outputs (1)

    NameTypeDescription
    scene_beatsSCENE_BEAT