Audio Saturate
Audio Saturate — the character knob for your sterile-sounding mixes
- audio
- video
- audio
- fx_spec
Generated music is clean. Sometimes too clean - it can sit in a mix like it's wearing a lab coat. Audio Saturate is the stage that adds the dirt: it shapes the waveform's peaks to add harmonics and grit the way tape, tube preamps, and bit-crushed game audio do. Five modes, each a real FFmpeg filter, none of it AI:
- softclip - the tape/preamp character box.
asoftclipwith asc_type(hard, tanh, atan, cubic, exp, and more) and asc_threshold(0.01–1). tanh is the warm one; hard is the harsher one. - psyclip - adaptive lookahead soft-clipping (
apsyclip) that rides peaks,py_clipfor the ceiling andpy_adaptivefor how much it adjusts. This is the "loud but not crunchy" glue. - crush - bit-crusher (
acrusher):cr_bits(1–64, default 8) drops the resolution,cr_mixblends dry/wet,cr_modelinear vs log. The instant "retro game console" button; 8-bit at full mix is very much a taste. - exciter - harmonic exciter (
aexciter) that adds sparkle aboveex_freq(default 7.5 kHz) via amount/drive/blend. The "make it pop in the highs without turning up the volume" trick. - crystalizer -
crystalizerwith a singlecz_iintensity. Adds a shimmering high-end presence, the kind of thing you hear on modern vocal chains.
Input is audio or video; outputs are audio and an fx_spec for stacking into an FX Chain. Same hidden-input plumbing as every ComfyTV AudioFX stage - ignore force_run_token, project_id, parent_output_id.
Where people get burned: saturation is additive, so the output gets louder and peakier as you push it. A softclip at full threshold is fine; an exciter at ex_amount 64 with ex_drive 10 will turn your gentle piano into a distorted wall before you hear it coming. The classic mistake is applying it per-track when you only wanted it on the bus - do that and every element fights for the same harmonic space. Start at the defaults, A/B against bypass, and mix the effects stage in subtly.
There's a lovely irony here that's worth knowing: this is also where you manufacture the damage the Repair stage fixes. Bit-crush something and then try to de-click it, and you'll understand why audio people say "print it right the first time."
Install is the pack-wide story: ComfyUI Manager search "ComfyTV", or git clone https://github.com/jtydhr88/ComfyTV into custom_nodes/ and fully restart the backend. On Desktop/macOS with multiple ComfyUI installs, clone by absolute path into the running instance or the pack never registers. Zero extra pip dependencies - these are stock PyAV/FFmpeg filters, CPU-only, no model downloads.
Inputs (18)
| Name | Type | Default | Description |
|---|---|---|---|
| force_run_token | INT | 00–2147483647 | Internal — bumped on Run to invalidate ComfyUI's input cache. |
| project_id | STRING | Internal — populated by the projectStore on the frontend. | |
| parent_output_id | INT | 00–2147483647 | Internal — lineage parent set by spawn handlers on the frontend. |
| mode | COMBO | softclip | 5 options: softclip, psyclip, crush, exciter, crystalizer |
| sc_type | COMBO | hard | 9 options: hard, tanh, atan, cubic, exp, alg, +3 |
| sc_threshold | FLOAT | 1.000.01–1 | — |
| py_clip | FLOAT | 1.000.015625–1 | — |
| py_adaptive | FLOAT | 0.500–1 | — |
| cr_bits | FLOAT | 8.001–64 | — |
| cr_mix | FLOAT | 0.500–1 | — |
| cr_mode | COMBO | lin | 2 options: lin, log |
| ex_amount | FLOAT | 1.000–64 | — |
| ex_drive | FLOAT | 8.500.1–10 | — |
| ex_blend | FLOAT | 0.00-10–10 | — |
| ex_freq | FLOAT | 75002000–12000 | — |
| cz_i | FLOAT | 2.00-10–10 | — |
| audioopt | COMFYTV_AUDIO | — | |
| videoopt | COMFYTV_VIDEO | — |
Outputs (2)
| Name | Type | Description |
|---|---|---|
| audio | COMFYTV_AUDIO | — |
| fx_spec | COMFYTV_FXSPEC | — |