FL Audio Beat Prompt Schedule
The audio-to-prompt sequencer that turns a track into a MiniMax H3 video
- prompt_schedule
- total_frames
- audio
- BPM
- envelope_1
- envelope_2
- envelope_3
- prompt_envelopes
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.
Inputs (17)
| Name | Type | Default | Description |
|---|---|---|---|
| timeline | STRING | [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_in | FLOAT | 00–864000 | Default prompt fade-in in frames. A header override takes priority. |
| default_fade_out | FLOAT | 00–864000 | Default prompt fade-out in frames. A header override takes priority. |
| curve | COMBO | cosine | Shape used for prompt fade-ins and fade-outs. |
| time_unit | COMBO | frames | Internal source unit. New schedules use frames; legacy beat and second schedules are converted by the sequencer. |
| fps | FLOAT | 24.0001–240 | Frames per second used to interpret frame-based positions and report frame counts. |
| sequence_duration | INT | 00–864000 | Maximum schedule length in frames at the selected FPS. Zero uses the full detected audio duration. |
| trim_start_frame | INT | 00–864000 | Source frame where the selected audio crop begins. |
| half_time | BOOLEAN | false | Use every other detected beat and report half the detected BPM. |
| beat_offset_ms | INT | 0-1000–1000 | Backing value for the sequencer's live Beat offset control. It shifts only the regular beat grid while audio-derived reference markers remain fixed. |
| analysis_source | COMBO | mix | Choose the waveform and transient reference shown in the editor. Beat This always analyzes the master mix; stem choices become available after separation. |
| beat_grid_density | COMBO | every_beat | Backing value for the sequencer's Grid control. Every beat uses the detected tempo; half-beat adds subdivisions. |
| render_groups | STRING | Sequencer-owned render grouping metadata. The popup editor manages this automatically; empty keeps every prompt section independent. | |
| analysis_cache_key | STRING | Sequencer-owned analysis cache reference used to restore a previously selected local audio file after workflow widget migrations. | |
| envelope_layers | STRING | Sequencer-owned reactive envelope settings. The popup editor manages the three fixed envelope slots automatically. | |
| beat_positionsopt | STRING | Optional override from FL Audio BPM Analyzer. When connected, its exact beat_times drive timing instead of this node's internal analysis. | |
| audio_fileopt | COMBO | Upload or choose the source audio. The waveform and beat markers load without queueing the workflow. |
Outputs (8)
| Name | Type | Description |
|---|---|---|
| prompt_schedule | FL_PROMPT_SCHEDULE | Resolved second-based prompt schedule for compatible FL diffusion nodes. |
| total_frames | INT | Effective schedule duration converted to frames at the selected FPS. |
| audio | AUDIO | The selected, frame-aligned audio crop for downstream FL audio nodes. |
| BPM | FLOAT | Detected musical tempo after applying the Half-time option. |
| envelope_1 | FL_AUDIO_ENVELOPE | Normalized signal from reactive envelope slot 1. |
| envelope_2 | FL_AUDIO_ENVELOPE | Normalized signal from reactive envelope slot 2. |
| envelope_3 | FL_AUDIO_ENVELOPE | Normalized signal from reactive envelope slot 3. |
| prompt_envelopes | FL_PROMPT_ENVELOPE_SET | Enabled reactive prompts and their frame-aligned weights. |