FL Scan Audio Edit
Cut the footage on the drums
- images
- scan_images
- normal_images
- kick_envelope
- snare_envelope
- hihat_envelope
- final
- edited_original
- reveal_mask
- edit_report
Editing to music is easy to describe and tedious to do. FL Scan Audio Edit is the node that does it for you: your kick and snare envelopes drive the cut points, the node picks the sources and the seek positions, and every fifth cut is a jump cut for good measure. It also does the cursor-drag reveal thing from Interactive Scan FX, in the same pass.
Best use case: you've rendered a bunch of scan shots and you want a music-video assembly that hits on the beat without you scrubbing a timeline for two hours.
The inputs
images is the timeline you're cutting into - typically a rendered scan effect. scan_images and normal_images are the banks the reveals pull from, the same length and frame order as images. All source banks must use identical frame order - that's in the node's description, and it's not a suggestion.
kick_envelope, snare_envelope and hihat_envelope are typed FL_AUDIO_ENVELOPE sockets from the pack's audio analysis nodes. The output lasts exactly as long as the envelopes, so the audio defines the length of your edit.
shot_lengths is a comma-separated string of source shot lengths (66,66,66,66 by default) - how long each clip in your source bank is, in frames. The node uses these to work out valid seek ranges per shot, so wrong numbers here mean seeks that run past the end of a shot.
fps (1–120), seed, and the two cut constraints: min_cut_frames (2–120) and max_cut_frames (2–240). The description puts it well: maximum cut length caps holds between detected onsets. So you get a cut when a drum hit lands, and a forced cut if nothing has happened for too long - no dead air.
Then playback_rate (0.25–5) for slow-motion and speed-up, cursor_count (0–3), cursor_scale, reveal_strength and motion_strength for the reveal gestures.
timing_mode, the one that changes everything
Two options, and they produce genuinely different videos:
- remix is the default and does what you'd expect from an editor: it seeks into shots, reorders them, retimes them. Shots are chosen from a shuffled cycle so you don't get the same clip twice in a row, and every fifth segment is a jump cut with a seek as far from the previous frame as it can get.
- audio_locked preserves chronological source frames and uses camera cuts instead of seeking or retiming. So the footage stays honest - no time travel - and the rhythm comes from where you cut. If the remix version felt like a montage of disconnected moments, this is the setting that fixes it.
That distinction is the node's best feature, and it's buried in a dropdown. Try both on the same audio.
Outputs
final is the finished edit. edited_original is the same edit applied to the original bank rather than the scan bank - quietly very useful, since it gives you a beat-cut version of your un-effected footage for free. reveal_mask is the per-frame reveal area, and edit_report is a string listing each segment: start and end frame, which shot, where it seeks to, its playback rate, and what triggered the cut (audio_onset or maximum_hold). Read it. It's how you learn why your edit made the choices it did.
Install
cd ComfyUI/custom_nodes
git clone https://github.com/filliptm/ComfyUI_Fill-Nodes
Restart ComfyUI. The audio envelopes come from the pack's beat/drum analysis nodes, which live on librosa (and on Beat This for beat and downbeat grids - that one downloads a ~77 MiB checkpoint to ComfyUI/models/beat_this/ on its first analysis, SHA-256 verified). This node itself is OpenCV and torch plus the pack's usual long dependency list.
Where people get burned
Bank length mismatches. images, scan_images and normal_images must share frame order and length. Mix in a bank that's been trimmed differently and the reveals pull the wrong frames - visible immediately, but confusing until you check.
Shot lengths that lie. If shot_lengths doesn't describe your actual source clips, seeks land in the wrong place and you get cuts into the middle of unrelated material. Regenerate the string whenever the bank changes.
Envelope length is the timeline. You can't get a longer edit than your envelopes. If the result feels short, your audio analysis was short.
Expecting smooth. This is a cut-driven aesthetic by design. If you want dissolves, you're in the wrong node - read the report, and you'll see every edit is a hard boundary with a stated reason.
Inputs (17)
| Name | Type | Default | Description |
|---|---|---|---|
| images | IMAGE | — | |
| scan_images | IMAGE | — | |
| normal_images | IMAGE | — | |
| kick_envelope | FL_AUDIO_ENVELOPE | — | |
| snare_envelope | FL_AUDIO_ENVELOPE | — | |
| hihat_envelope | FL_AUDIO_ENVELOPE | — | |
| shot_lengths | STRING | 66,66,66,66 | — |
| fps | INT | 241–120 | — |
| seed | INT | 730–2147483647 | — |
| min_cut_frames | INT | 102–120 | — |
| max_cut_frames | INT | 202–240 | — |
| playback_rate | FLOAT | 1.700.25–5 | — |
| cursor_count | INT | 20–3 | — |
| cursor_scale | FLOAT | 1.200.5–3 | — |
| reveal_strength | FLOAT | 1.000–1 | — |
| motion_strength | FLOAT | 0.800–2 | — |
| timing_modeopt | COMBO | remix | Audio locked preserves chronological source frames and uses camera cuts instead of seeking or retiming. |
Outputs (4)
| Name | Type | Description |
|---|---|---|
| final | IMAGE | — |
| edited_original | IMAGE | — |
| reveal_mask | MASK | — |
| edit_report | STRING | — |