Nodes/ComfyUI-SCAIL-AudioReactive/SCAIL AIST Beat Dance
ComfyUI Node

SCAIL AIST Beat Dance

Real professional dance mocap that actually reacts to your track

By ckinpdx·Created 11 months ago·Updated 10 months ago· 17
SCAIL AIST Beat Dance
  • library
  • beat_info
  • audio_features
  • reference_pose
  • pose_sequence
◄sync_dancerstrue►
◄genre_breaktrue►
◄genre_poptrue►
◄genre_locktrue►
◄genre_waackfalse►
◄genre_krumpfalse►
◄genre_housefalse►
◄genre_street_jazzfalse►
◄genre_ballet_jazzfalse►
◄genre_la_hip_hopfalse►
◄genre_middle_hip_hopfalse►
◄transition_frames6►
◄chunks_per_beat1►
◄energy_sensitivity1.00►
◄seed0►

Procedural dance (the SCAILBeatDrivenPose node) is great, but it's synthetic. If you want the pack to play actual motion capture of professional dancers, this is the node: SCAILAISTBeatDance grabs short chunks of real AIST++ dance recordings and fires them off in time with your music. It's the "reactive" half of the AIST options - beat-triggered, energy-aware, and happy to mix genres. The trade, and the author is upfront about it, is that chunk boundaries can feel a bit janky. You're trading smoothness for real motion and variety.

What it needs

This is not a standalone node. It wants three things wired in:

  • library - an AIST_LIBRARY from SCAILAISTLibraryLoader (that's the ~220MB chunked download, first run only)
  • beat_info - from SCAILBeatDetector, so it knows where the beats land
  • audio_features - from SCAILAudioFeatureExtractor, so it knows how much energy each moment has

You can also feed an optional reference_pose (from DWPose or the Base Pose generator) to blend the first chunk in from your character's actual pose.

How it picks chunks

The AIST++ data was cut into roughly half-second chunks at velocity minimums - natural pauses in the movement - so each chunk is a self-contained move rather than an arbitrary slice. Each chunk is tagged low/mid/high energy, calculated per-genre (a high-energy krump chunk isn't judged against a low-energy house chunk; that's the smart part). On each beat the node picks a chunk that fits the energy, chains consecutive chunks together, and blends between them over transition_frames.

The inputs you'll actually touch:

  • sync_dancers - true means every character does the same move (for a solo this is moot; for a group it's the difference between a crew and chaos)
  • The genre_* toggles - break, pop and lock default on; waack, krump, house, street_jazz, ballet_jazz, la_hip_hop and middle_hip_hop default off. Turn on only what fits your track
  • chunks_per_beat - chain longer sequences per beat (1 = 0.5s, 2 = 1s, up to 4 = 2s)
  • energy_sensitivity - how hard audio energy pulls chunk selection; crank it up for EDM, drop it for a track with a flat mix
  • transition_frames and seed - blend length and the random pick

Everything else (beats, energy, library) arrives by wire.

The output and where it goes

Single output, pose_sequence, straight into SCAILPoseRenderer, and from there the rendered skeleton frames feed your Wan video pose-control nodes (the pack's example workflows use WanVideoAddSCAILPoseEmbeds in ComfyUI-WanVideoWrapper with the SCAIL-preview model).

Installing and troubleshooting

Same pack, same install: clone into custom_nodes, pip install -r requirements.txt (taichi, numpy, torch, librosa), or grab it via ComfyUI Manager by searching the pack title. First run triggers the AIST chunk download from HuggingFace - give it a few minutes and watch the console for the progress bar.

Two things trip people up. First, if library shows nothing, you probably skipped the loader or the download failed partway - the loader retries, but a full re-clone of that folder is the blunt fix. Second, janky transitions are expected: chunks are cut at velocity minimums, not phrase boundaries. If it bothers you, raise transition_frames or switch to SCAILAISTFullSequence, which trades reactivity for buttery real choreography.

CategorySCAIL-AudioReactive/AIST

Inputs (19)

NameTypeDefaultDescription
libraryAIST_LIBRARYAIST chunk library from loader
beat_infoSCAIL_BEAT_INFOBeat detection from SCAILBeatDetector
audio_featuresSCAIL_AUDIO_FEATURESAudio features for energy mapping
sync_dancersBOOLEANtrueAll dancers do same moves (True) or independent (False)
genre_breakBOOLEANtrueInclude breakdance moves
genre_popBOOLEANtrueInclude popping moves
genre_lockBOOLEANtrueInclude locking moves
genre_waackBOOLEANfalseInclude waacking moves
genre_krumpBOOLEANfalseInclude krumping moves
genre_houseBOOLEANfalseInclude house moves
genre_street_jazzBOOLEANfalseInclude street jazz moves
genre_ballet_jazzBOOLEANfalseInclude ballet jazz moves
genre_la_hip_hopBOOLEANfalseInclude LA hip hop moves
genre_middle_hip_hopBOOLEANfalseInclude middle hip hop moves
transition_framesINT61–30Frames to blend between chunks
chunks_per_beatINT11–4Chain consecutive chunks together (1=0.5s, 2=1s, 3=1.5s, 4=2s per beat)
energy_sensitivityFLOAT1.000–3How strongly audio energy affects chunk selection
seedINT00–4294967295Random seed for chunk selection
reference_poseoptSCAIL_POSEStarting pose from DWPose to blend from

Outputs (1)

NameTypeDescription
pose_sequenceSCAIL_POSE_SEQUENCE—