Nodes/ComfyUI_Fill-Nodes/FL Audio Beat Prompt Schedule
ComfyUI Node

FL Audio Beat Prompt Schedule

The audio-to-prompt sequencer that turns a track into a MiniMax H3 video

By filliptm·Created 3 years ago·Updated a day ago· 633
FL Audio Beat Prompt Schedule
    • prompt_schedule
    • total_frames
    • audio
    • BPM
    • envelope_1
    • envelope_2
    • envelope_3
    • prompt_envelopes
    timeline[0 - 48 | fade_in=6 | fade_out=6] The subject slowly turns toward camera. [48 - 96 | fade_in=6 | fade_out=6] The camera pushes forward on the beat.
    default_fade_in0
    default_fade_out0
    curvecosine
    time_unitframes
    fps24.000
    sequence_duration0
    trim_start_frame0
    half_timefalse
    beat_offset_ms0
    analysis_sourcemix
    beat_grid_densityevery_beat
    render_groups
    analysis_cache_key
    envelope_layers
    beat_positions
    audio_file

    This is the flagship of Fill-Nodes' audio-reactive workflow, and honestly it's the node you build a whole music video around. FL Audio Beat Prompt Schedule loads an audio file, detects its beats, and gives you a full-screen editor where you drag prompt clips onto a timeline aligned to the waveform. Each clip is a prompt that's "on" for a frame range, with fades and crossfades, and the whole thing comes out the other end as a typed schedule your video generator can actually consume. You write "the subject slowly turns toward camera" for bars 1–2, "camera pushes in on the beat" for bars 3–4, and the model gets a per-frame prompt mask instead of one flat sentence.

    It's built for MiniMax H3, the omni-modal video model that's native at audio. The schedule you build here feeds the FL MiniMax H3 Beat Shot Planner - which lives in the separate ComfyUI-FL-MiniMaxH3 pack, not this one (node IDs are unchanged, so old workflows keep loading once the new pack is installed).

    How it works

    Beat timing comes from beat-this, an open-source (MIT) beat tracker. The first analysis downloads its 77.3 MiB final0 checkpoint to ComfyUI/models/beat_this/beat_this-final0.ckpt, SHA-256-verifies it, and releases it from GPU memory when done. Analysis covers and caches the full source by content hash, so trimming the crop or nudging the beat offset reuses the cached analysis instead of re-scanning. Everything loads without queueing - pick your audio and the waveform and beat markers appear immediately.

    The editor is where the magic is: a waveform with beat, downbeat, transient, and drum marker lanes, a frame ruler you drag prompt clips onto, right-click to set audio In/Out points, and a shared boundary between touching clips you can drag to lengthen one and shorten the other (it snaps to the beat grid). Three reactive-envelope slots below each pick a source (beat grid, downbeat, kick, snare, hi-hat…) with stride, phase, attack/hold/release, and floor/peak controls. The schedule text format is human-readable too:

    [0 - 48 | fade_in=6 | fade_out=6]
    The subject slowly turns toward camera.
    
    [48 - 96 | fade_out=6 | crossfade=12]
    The camera pushes forward on the beat.
    

    Frame ranges are zero-based with exclusive ends. fade_in/fade_out blend with the global prompt; crossfade blends a clip directly into the previous one.

    Inputs and outputs that matter

    You'll set: timeline (the schedule above), fps (24 for H3), audio_file (upload or pick - waveform loads without queueing), and optionally beat_positions from FL Audio BPM Analyzer to override the internal detection. The sequencer-owned fields (render_groups, envelope_layers, analysis_cache_key) are managed by the popup editor - leave them alone.

    Outputs: prompt_schedule (the resolved schedule for compatible FL diffusion nodes), total_frames, audio (the frame-aligned crop, AUDIO), BPM, three FL_AUDIO_ENVELOPE outputs (envelope_1/2/3) for visualizers and post-effects, and prompt_envelopes (FL_PROMPT_ENVELOPE_SET) for the Beat Shot Planner.

    Install

    It ships in ComfyUI_Fill-Nodes - Manager search "ComfyUI_Fill-Nodes", or:

    cd ComfyUI/custom_nodes
    git clone https://github.com/filliptm/ComfyUI_Fill-Nodes
    

    then restart. Heavy pack, heavy requirements (librosa, beat-this, imageio[ffmpeg], opencv-python, and much more) - the first install takes a while. Stem separation and Whisper transcription are explicit button actions, never automatic; the Whisper model only downloads to ComfyUI/models/whisper/ when you click Transcribe.

    Gotchas

    The big one is cost, not setup: strict scheduling evaluates H3 once per unique active prompt on every sampling step. Start with a few broad sections, and disable cross-step caching (or model compilation) while you validate a masked workflow - you don't want to wait through a whole generation to discover a typo. And remember beat detection needs the model checkpoint on first run; if the first analysis sits there downloading, that's normal, not a hang.

    Category🏵️Fill Nodes/Audio

    Inputs (17)

    NameTypeDefaultDescription
    timelineSTRING[0 - 48 | fade_in=6 | fade_out=6] The subject slowly turns toward camera. [48 - 96 | fade_in=6 | fade_out=6] The camera pushes forward on the beat.Ordered frame ranges followed by prompt text. Range ends are exclusive. Older beat- and second-based schedules are converted by the sequencer.
    default_fade_inFLOAT00–864000Default prompt fade-in in frames. A header override takes priority.
    default_fade_outFLOAT00–864000Default prompt fade-out in frames. A header override takes priority.
    curveCOMBOcosineShape used for prompt fade-ins and fade-outs.
    time_unitCOMBOframesInternal source unit. New schedules use frames; legacy beat and second schedules are converted by the sequencer.
    fpsFLOAT24.0001–240Frames per second used to interpret frame-based positions and report frame counts.
    sequence_durationINT00–864000Maximum schedule length in frames at the selected FPS. Zero uses the full detected audio duration.
    trim_start_frameINT00–864000Source frame where the selected audio crop begins.
    half_timeBOOLEANfalseUse every other detected beat and report half the detected BPM.
    beat_offset_msINT0-1000–1000Backing value for the sequencer's live Beat offset control. It shifts only the regular beat grid while audio-derived reference markers remain fixed.
    analysis_sourceCOMBOmixChoose the waveform and transient reference shown in the editor. Beat This always analyzes the master mix; stem choices become available after separation.
    beat_grid_densityCOMBOevery_beatBacking value for the sequencer's Grid control. Every beat uses the detected tempo; half-beat adds subdivisions.
    render_groupsSTRINGSequencer-owned render grouping metadata. The popup editor manages this automatically; empty keeps every prompt section independent.
    analysis_cache_keySTRINGSequencer-owned analysis cache reference used to restore a previously selected local audio file after workflow widget migrations.
    envelope_layersSTRINGSequencer-owned reactive envelope settings. The popup editor manages the three fixed envelope slots automatically.
    beat_positionsoptSTRINGOptional override from FL Audio BPM Analyzer. When connected, its exact beat_times drive timing instead of this node's internal analysis.
    audio_fileoptCOMBOUpload or choose the source audio. The waveform and beat markers load without queueing the workflow.

    Outputs (8)

    NameTypeDescription
    prompt_scheduleFL_PROMPT_SCHEDULEResolved second-based prompt schedule for compatible FL diffusion nodes.
    total_framesINTEffective schedule duration converted to frames at the selected FPS.
    audioAUDIOThe selected, frame-aligned audio crop for downstream FL audio nodes.
    BPMFLOATDetected musical tempo after applying the Half-time option.
    envelope_1FL_AUDIO_ENVELOPENormalized signal from reactive envelope slot 1.
    envelope_2FL_AUDIO_ENVELOPENormalized signal from reactive envelope slot 2.
    envelope_3FL_AUDIO_ENVELOPENormalized signal from reactive envelope slot 3.
    prompt_envelopesFL_PROMPT_ENVELOPE_SETEnabled reactive prompts and their frame-aligned weights.