(SP) Limiter
The loudness safety net that uses your GPU
- audio_input
- audio
A limiter is the "never let it clip, ever" insurance policy at the end of a chain, and (SP) Limiter is this pack's version - with the unusual twist that it's genuinely GPU-accelerated. The README calls it "Gpu limiter - experimental," and it earns that label: instead of running the limiter as a Python loop on CPU, it compiles raw CUDA kernels at runtime (via CuPy/NVRTC) and runs the heavy lifting in parallel on your GPU. For long clips that's a real speedup, and it's the most technically interesting node in the pack.
There's a catch baked into that design: because the Limiter imports CuPy kernels at startup, and because nodes.py imports every node in the pack at load, a broken CuPy/CUDA setup takes down the entire pack, not just this node. The pinned dependency is cupy-cuda11x, and the author develops on CUDA 11.8 with an RTX 3090. If the pack won't load with a cupy-related error, this node is why - match your CUDA version to the wheel and everything comes back.
The inputs
- mode - four flavors:
downward-upward(compresses above and below the threshold - the most "mastering" choice),downward(only peaks above threshold get tamed),soft-clipperandhard-clipper(waveshaping curves that fold the tops off - fast, aggressive, and great for punch if you like the tone). Default isdownward. - threshold - 0–100, in percent, default 100. At 100 nothing gets touched; drop toward 80–90 and the loudest material starts getting caught. This is your main knob.
- slope - 0–100 percent, default 100, how hard the gain reduction kicks in above the threshold. High slope = aggressive catch.
- release_ms - 0–1000 ms, default 100, how fast the gain recovers after the loud part passes. Longer release = smoother but flatter; shorter = punchier but can pump.
One audio output, and as with every processor in the pack, the result is re-normalized to the input's LUFS so limiting won't silently drop your overall volume.
Where people get burned
- It's experimental. The CUDA kernel approach is clever and fast, but it means behavior can differ by GPU/driver, and the node assumes a working CUDA runtime. On a CPU-only machine or a mismatched CUDA version, this is the node that breaks the whole pack.
- The percent-based
threshold/slopearen't dB values. 100 = no-op, and everything meaningful happens in the top 10-20% of the range. - It's a limiter, not a compressor - you're catching peaks and preventing clipping, not sculpting dynamics. Pair it after (SP) Normalizer (lufs mode) and before export for the classic "loud, clean, never clips" finishing move.
Installing it
ComfyUI Manager → "Install Custom Nodes" → search ComfyUI Signal Processing, or:
cd ComfyUI/custom_nodes
git clone https://github.com/c0ffymachyne/ComfyUI_SignalProcessing
then restart ComfyUI. Dependencies from requirements.txt - critically cupy-cuda11x - are installed by Manager or with pip install -r requirements.txt. If you're on CUDA 12+, you may need to swap the CuPy wheel to your matching cupy-cuda12x in the pack's requirements.txt before it loads. That single edit is the fix for 90% of the pack's "won't load" reports.
Inputs (5)
| Name | Type | Default | Description |
|---|---|---|---|
| audio_input | AUDIO | — | |
| mode | COMBO | 4 options: downward-upward, downward, soft-clipper, hard-clipper | |
| threshold | FLOAT | 100.00–100 | — |
| slope | FLOAT | 100.00–100 | — |
| release_ms | FLOAT | 100.00–1000 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| audio | AUDIO | — |