Nodes/ComfyUI-mnemic-nodes/πŸŽ΅πŸ“Š Audio Visualizer
ComfyUI Node

πŸŽ΅πŸ“Š Audio Visualizer

Turn an mp3 into frames you can actually feed a sampler

By MNeMoNiCuZΒ·Created 3 years agoΒ·Updated a day agoΒ· 105
πŸŽ΅πŸ“Š Audio Visualizer
  • audio
  • image
  • image_batch
  • video
β—„output_typeimageβ–Ί
β—„visualizer_scriptβ–Ύβ–Ί
β—„scale1.0β–Ί
β—„stereo_to_monoβ–Ύβ–Ί
β—„framerate30β–Ί
β—„width1024β–Ί
β—„height1024β–Ί
β—„seed0β–Ί

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 seed exists 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_type and 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), or video (a VIDEO object).
  • visualizer_script - whatever .py files 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, or right. If your track is stereo, it gets collapsed before drawing, so pick which side you actually want for a lopsided mix.
  • seed - with output_type: image this is your frame selector: the node takes seed % total_frames and renders that frame. Set it to 0, switch Control After Generate to increment, 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.

Category⚑ MNeMiC Nodes

Inputs (9)

NameTypeDefaultDescription
output_typeCOMBOimageChoose 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_scriptCOMBOSelect 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/
scaleFLOAT1.0Scale factor that adjusts the visualizer's sensitivity to the audio amplitude. Higher values make the visualization more responsive to quieter sounds.
stereo_to_monoCOMBOConvert stereo audio to mono by taking the mean of both channels, using only the left channel, or using only the right channel.
framerateINT301–240The framerate (frames per second) for video output. Higher values create smoother motion but increase processing time.
audioAUDIOThe audio file to visualize. This contains the waveform and sample rate data.
widthINT102464–8192The width of the output in pixels. Larger values provide higher resolution but use more memory.
heightINT102464–8192The height of the output in pixels. Larger values provide higher resolution but use more memory.
seedINT00–18446744073709550000Set 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)

NameTypeDescription
imageIMAGESingle frame image output. Set Seed to 0 and Control After Generate to Increment to cycle through frames. Connect to image processing nodes.
image_batchIMAGEBatch of all frames as separate images. Can be connected to the VHS Video Combine node for saving with audio. Make sure framerates match
videoVIDEOAnimated video output. Can be connected to Save Video node for saving as video file.