Nodes/ComfyTV/Audio Convolve (IR)
ComfyUI Node

Audio Convolve (IR)

Feed it any audio as an impulse response

By jtydhr88·Created 3 months ago·Updated about 15 hours ago· 725
Audio Convolve (IR)
  • audio
  • ir
  • video
  • audio
force_run_token0
project_id
parent_output_id0
wet1.00
dry0.00
normalizetrue

Most "reverb" in lightweight tools is a fake - a handful of synthetic echoes tuned to sound plausible. Audio Convolve (IR) is the real thing: it convolves your audio with an impulse response, so the result genuinely sounds like it was played in whatever space that IR captured. Feed it a recording of a cathedral, a spring reverb tank, a guitar cabinet, or the sound of your own room, and your dry track gets placed in that space.

This is one of the pack's two impulse-response stages, and they're designed to work as a pair. Deconvolve captures a room's IR from a sine-sweep recording; Convolve is the stage that applies an IR you already have. If you have a collection of IR files - the internet is full of free ones from hardware reverbs and famous rooms - this stage is where they become usable inside ComfyUI. It's also the "aha" node for anyone who's ever wondered what convolution actually does in an audio tool: it's not magic, it's literally a fftconvolve over your samples with the IR as the kernel.

How it works

The ir input (COMFYTV_AUDIO) is the impulse response, and audio (COMFYTV_AUDIO) is the dry signal - or you can pass video and it'll use that clip's soundtrack. The source shows the math: both are decoded to sample arrays and convolved with scipy.signal.fftconvolve, one channel pair at a time. Then the three knobs shape the result:

  • wet (0–2, default 1) - how much of the convolved reverb is in the output.
  • dry (0–2, default 0) - how much of the original signal is blended back in. A classic reverb send is wet ~1, dry ~0.2–0.5.
  • normalize (default on) - rescales the result so the convolution doesn't blow your levels through the roof. Leave it on unless you know what you're doing.

Output is audio (COMFYTV_AUDIO), ready for the rest of the chain. Internal inputs (force_run_token, project_id, parent_output_id) are ComfyTV frontend plumbing - don't wire them.

Installing ComfyTV

cd ComfyUI/custom_nodes
git clone https://github.com/jtydhr88/ComfyTV

Full backend restart, then ComfyTV → AudioFX; ComfyUI Manager finds "ComfyTV". Zero extra Python deps - the DSP is numpy + scipy's fftconvolve, both of which ComfyUI already installs. No models; you supply the IR file.

The usual install trap: on macOS / ComfyUI Desktop / multi-install machines, the relative cd can clone into the wrong instance (clone succeeds, nodes never appear). Find the running instance's path in the startup log, clone by absolute path into that instance's custom_nodes (quote paths with spaces/parentheses), verify ComfyTV/__init__.py is top-level, and restart the backend - not just the browser tab.

Common issues

  • The output is quiet or swamped in mud. That's the normalize interplay: a long, loud IR convolved with a busy track gets dense fast. Lower wet, add some dry, and shorten the IR if you can.
  • It sounds like a flanger, not reverb. Your IR is too short - under ~0.1s an IR stops being "space" and starts being a comb filter. Use a longer IR, or capture one properly with the Deconvolve stage.
  • Nothing comes out. The ir socket is empty. Every convolve needs a real impulse response on that input.
  • The result is longer than the source. Expected - convolution output is input + IR − 1 samples. If that bothers you, trim the tail with the Audio Trim stage.

Convolution reverb is one of those things people assume needs a dedicated plugin. It doesn't anymore. This stage plus a decent IR library is a full reverb section.

CategoryComfyTV/AudioFX

Inputs (9)

NameTypeDefaultDescription
force_run_tokenINT00–2147483647Internal — bumped on Run to invalidate ComfyUI's input cache.
project_idSTRINGInternal — populated by the projectStore on the frontend.
parent_output_idINT00–2147483647Internal — lineage parent set by spawn handlers on the frontend.
wetFLOAT1.000–2
dryFLOAT0.000–2
normalizeBOOLEANtrue
audiooptCOMFYTV_AUDIO
iroptCOMFYTV_AUDIO
videooptCOMFYTV_VIDEO

Outputs (1)

NameTypeDescription
audioCOMFYTV_AUDIO