Flex Audio Visualizer Circular β‘π ‘π π £π
Generate a beat-reactive ring visualizer
- audio
- opt_feature
- IMAGE
- MASK
This is the node for the classic circular audio-reactive visual - a ring of bars or a wavy line pulsing outward from a center point, driven by the actual frequency content of a track. Unlike most of this pack's other targets, it doesn't modify an existing image sequence - it generates its own visualization frames from scratch, straight out of the audio.
How it works
Feed it audio, and it runs an FFT (fft_size, 256 to 8192 - bigger windows give finer frequency resolution at the cost of temporal precision) over a slice defined by min_frequency/max_frequency, then draws the result as either bar (individual radial spikes) or line (a continuous connected ring) around a circle of num_points points. visualization_feature picks whether that circle is driven by frequency data (a spectrum, bass-to-treble around the ring) or waveform data (the raw signal shape). radius/base_radius and amplitude_scale control the ring's resting size and how far it deforms with the audio; smoothing damps frame-to-frame jitter so the motion reads as pulsing rather than flickering; rotation spins the whole ring.
frame_rate, screen_width, and screen_height set the canvas the visualizer renders onto - these need to line up with whatever you're compositing this into downstream, or you'll be resizing afterward. position_x/position_y place the visualizer's center within that canvas (0 to 1, normalized), which matters if you're layering this over existing footage rather than using it as a full-frame element.
As with the rest of the Flex family, every one of the visual parameters - smoothing, rotation, point count, FFT size, frequency range, radius, line width, amplitude scale, base radius - can additionally be modulated by an optional FEATURE through opt_feature, via feature_param and feature_mode. That's mostly a power-user knob, though: the audio itself is already driving the primary visual through the FFT, so feature modulation here is for a second, independent reactive layer - say, having the ring's rotation speed respond to a different feature than the one making it pulse.
Inputs and outputs
audio(required,AUDIO) - the track to visualize.visualization_method(barorline) andvisualization_feature(frequencyorwaveform) - the two settings that define the visualizer's basic character.screen_width/screen_height- output canvas size; match your target composite.- Outputs - two: an
IMAGE(the rendered visualization frames) and aMASK(an alpha you can use to composite the visualizer over other footage without it dragging a solid background along with it).
Installing it
Install through ComfyUI Manager (search RyanOnTheInside) or manually:
cd ComfyUI/custom_nodes
git clone https://github.com/ryanontheinside/ComfyUI_RyanOnTheInside
Then pip install -r requirements.txt and restart ComfyUI. Audio feature extraction here runs on librosa, which is exactly what that install step pulls in - skip it and this node won't import.
Common issues
If the visualizer barely moves, check min_frequency/max_frequency before touching amplitude_scale - a range that's too narrow, or set to a band your source track doesn't have much energy in, will look nearly static regardless of how high you push the amplitude setting. Conversely, if it looks jittery and chaotic rather than pulsing, raise smoothing - the default is a reasonable middle ground, but percussive or noisy tracks benefit from more damping.
Remember the two outputs are separate: if you plug only the IMAGE output into a composite and the visualizer shows up with a hard rectangular background instead of blending cleanly, that's because you skipped wiring the MASK output in as the alpha for that composite step.
Inputs (23)
| Name | Type | Default | Description |
|---|---|---|---|
| strength | FLOAT | 1.000β1 | Strength of parameter modulation (0.0 to 1.0) |
| feature_threshold | FLOAT | 0.000β1 | Minimum feature value to trigger the effect (0.0 to 1.0) Only applies the effect when the feature value exceeds this threshold. Lower values make the effect more sensitive, higher values make it more selective. |
| feature_param | COMBO | Parameter to modulate based on the optional feature input | |
| feature_mode | COMBO | relative | Mode of parameter modulation ('relative' or 'absolute') |
| audio | AUDIO | Input audio to visualize | |
| frame_rate | FLOAT | 301β240 | Frame rate of the output visualization (1.0 to 240.0 fps) |
| screen_width | INT | 768100β1920 | Width of the output visualization (100 to 1920 pixels) |
| screen_height | INT | 464100β1080 | Height of the output visualization (100 to 1080 pixels) |
| position_x | FLOAT | 0.500β1 | Horizontal position of the visualization center (0.0 to 1.0) |
| position_y | FLOAT | 0.500β1 | Vertical position of the visualization center (0.0 to 1.0) |
| visualization_method | COMBO | bar | Visualization style ('bar' or 'line') |
| visualization_feature | COMBO | frequency | Data source for visualization ('frequency' or 'waveform') |
| smoothing | FLOAT | 0.500β1 | Amount of smoothing applied to the visualization (0.0 to 1.0) |
| rotation | FLOAT | 00β360 | Rotation angle in degrees (0.0 to 360.0) |
| num_points | INT | 3603β1000 | Number of points in circular visualization (3 to 1000) |
| fft_size | INT | 2048256β8192 | FFT window size for frequency analysis (256 to 8192) |
| min_frequency | FLOAT | 2020β20000 | Minimum frequency to visualize (20.0 to 20000.0 Hz) |
| max_frequency | FLOAT | 800020β20000 | Maximum frequency to visualize (20.0 to 20000.0 Hz) |
| radius | FLOAT | 20010β1000 | Radius of visualization (10.0 to 1000.0 pixels) |
| line_width | INT | 21β10 | Width of visualization lines (1 to 10 pixels) |
| amplitude_scale | FLOAT | 1001β1000 | Scaling factor for amplitude (1.0 to 1000.0) |
| base_radius | FLOAT | 20010β1000 | Base radius for visualization (10.0 to 1000.0 pixels) |
| opt_featureopt | FEATURE | Optional feature input for parameter modulation |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| IMAGE | IMAGE | β |
| MASK | MASK | β |