π΅π Audio Visualizer
Turn an mp3 into frames you can actually feed a sampler
- audio
- image
- image_batch
- video
The Audio Visualizer (π΅π) is the weird one in the pack, and I mean that as a compliment. There's no checkpoint, no sampler, no VRAM budget. It reads a waveform and draws it - particles, bars, a circular waveform - into an image you can do whatever you want with. If you've ever wanted a music video where the visuals come from the track rather than being generated by another model, this is a cheap way to get there.
Worth knowing where it sits in 2026's audio world: the fancy route is a native audio+video model like LTX-2, which invents picture and sound in one pass. This node is the opposite philosophy - deterministic drawing driven by your actual audio, which means the output is exactly as long as your song and doesn't drift or hallucinate.
How it works
It's numpy and Pillow, not diffusion. The node takes the audio tensor and sample rate, computes total_frames = duration Γ framerate, then calls a visualizer script once per frame. Each script is a plain .py file in nodes/audio_visualizers/ that implements a visualize() function and gets the audio tensor as (batch, channels, samples).
Two things about that loop shape the whole node:
- The scripts are stateful. Particles and waveforms carry position between frames - that's what makes the motion look like motion. Loaded fresh, everything starts at frame zero. That's why
seedexists at all: the node isn't using it as a random seed, and setting it to 0 reloads every visualizer module, wiping the global state for a clean animation start. - Only one output is real per run. Set
output_typeand the matching output carries data; the other two return nothing.
Inputs that matter
output_type-image(one frame),image_batch(every frame as a batch), orvideo(a VIDEO object).visualizer_script- whatever.pyfiles are sitting in the visualizers folder. Out of the box you get bouncing bars, particles, umbrella, waveform circle and waveform line.scale- sensitivity. Crank it for quiet tracks; higher makes quiet passages move more.stereo_to_mono-mean,left, orright. If your track is stereo, it gets collapsed before drawing, so pick which side you actually want for a lopsided mix.seed- withoutput_type: imagethis is your frame selector: the node takesseed % total_framesand renders that frame. Set it to 0, switch Control After Generate toincrement, and set your batch count to the number of frames you want - you'll walk through the timeline one frame per queue.
framerate, width and height (steps of 64, up to 8192) round it out. Width and height are your render resolution, not a suggestion - a 4096-wide batch of a four-minute track is a lot of pixels.
Wiring the outputs
image goes into anything that takes an image: an img2img pass, a control image, a compositing node. image_batch is for video nodes - VHS Video Combine takes the frames and the audio, so check the framerate matches or your audio will slide out of sync. video is a VIDEO object for ComfyUI's native Save Video node, which is the least fiddly of the three.
Install
Search ComfyUI-mnemic-nodes in ComfyUI Manager, or:
cd ComfyUI/custom_nodes
git clone https://github.com/MNeMoNiCuZ/ComfyUI-mnemic-nodes
Restart. No models to download for this node. The pack's requirements.txt does pull imageio (used to encode the video output, mp4/libx264 by default), plus opencv-python, transformers, tiktoken and friends - that's the pack-wide install cost, not something this node specifically needs.
Where people get burned
The batch mode warning is not a joke. image_batch on a full track is thousands of images in one tensor. Output it to a Preview Image node and you'll watch ComfyUI chew through memory until it stutters or dies. Test with image_batch on a ten-second clip first, or use image mode and step frames.
Umbrella is much slower than the rest. That's straight from the author, and it holds - the circular bar drawing does far more work per frame than a waveform line.
Custom scripts fail silently-ish. A broken script throws inside the loop and the node substitutes a black frame rather than stopping, so you can render a whole video of black and only notice afterwards. Watch the console.
If you do write your own, the contract is simple:
def visualize(audio_data, frame_number, framerate, width, height, scale):
# return a float32 numpy array shaped (height, width, 3), values 0.0-1.0
Drop it in the audio_visualizers folder, restart, and it shows up in the dropdown.
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| output_type | COMBO | image | Choose the output type: 'image' for a single frame. Use this option with the INCREMENT seed type and set the Batch Count to the number of frames you want to generate. Use this option to process each frame one at a time. 'image_batch' for all frames as separate images. Use this option together with the VHS Video Combine node, or for whenever you want each frame output at the same time. The audio can be added to this output node. WARNING: If this is output to a Preview Image node, keep in mind the total number of frames you will be generating! It can make ComfyUI freeze or stutter. 'video' for an animated video file. Use this with the 'Save Video' native ComfyUI node to save as video. |
| visualizer_script | COMBO | Select the visualizer script to use for creating the audio visualization. Each script creates different visual patterns based on the audio waveform. You can also create your own visualizers and place them in /nodes/audio_visualizers/ | |
| scale | FLOAT | 1.0 | Scale factor that adjusts the visualizer's sensitivity to the audio amplitude. Higher values make the visualization more responsive to quieter sounds. |
| stereo_to_mono | COMBO | Convert stereo audio to mono by taking the mean of both channels, using only the left channel, or using only the right channel. | |
| framerate | INT | 301β240 | The framerate (frames per second) for video output. Higher values create smoother motion but increase processing time. |
| audio | AUDIO | The audio file to visualize. This contains the waveform and sample rate data. | |
| width | INT | 102464β8192 | The width of the output in pixels. Larger values provide higher resolution but use more memory. |
| height | INT | 102464β8192 | The height of the output in pixels. Larger values provide higher resolution but use more memory. |
| seed | INT | 00β18446744073709550000 | Set to 0 and use 'Control After Generate: Increment' to cycle through frames for the image output. This is not really used as a seed, but as a hack to get the incrementing node behavior and a starting frame. β οΈ IMPORTANT: Setting seed to 0 will automatically reset the visualizer's global state for a clean animation start. |
Outputs (3)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | Single frame image output. Set Seed to 0 and Control After Generate to Increment to cycle through frames. Connect to image processing nodes. |
| image_batch | IMAGE | Batch of all frames as separate images. Can be connected to the VHS Video Combine node for saving with audio. Make sure framerates match |
| video | VIDEO | Animated video output. Can be connected to Save Video node for saving as video file. |