TV Glitch | GlitchNodes
Actual analog TV signal emulation — and it's slow
- image
- image
TvGlitch is the pack's most ambitious node and its slowest. Instead of faking static with noise, it emulates the actual analog TV pipeline: it converts your image to the YIQ color space, modulates chroma onto a subcarrier, smears it through composite-video low-pass filtering, adds luma/chroma/phase noise, and converts back. That's why the README labels it "WIP Extremely Long Processing" - this is a real signal-processing simulation, and it costs real time.
The mechanism reads like a broadcast-engineering spec sheet. In YIQ, I and Q are the color-difference signals and Y is luma, and the node literally does chroma_into_luma - mixing the color subcarrier into the brightness signal like a real composite encoder, then composite_lowpass to blur color resolution the way a TV decoder would, plus apply_preemphasis to boost high-frequency components. Noise is generated per-scanline: video_noise hits luma, video_chroma_noise hits color, and video_chroma_phase_noise wobbles the color phase for that classic "color bleed" look. video_chroma_loss (default 0.24) is a per-scanline dropout probability - it kills the color signal on random lines, which is exactly the flickering-color artifact you see on dying sets.
The inputs that matter
- subcarrier_amplitude (1–200, default 40) - color subcarrier strength. Higher = more color bleeding into luma, that "chroma leaks into the picture" look.
- video_noise (0–10000) and video_chroma_noise (0–10000) - luma and color noise. Defaults are 100; this is where the "snow" comes from.
- video_chroma_phase_noise (0–100, default 15) - color wobble. Crank it and hues start swimming.
- video_chroma_loss (0–1, default 0.24) - probability a scanline loses its color signal. The signature analog artifact.
- composite_preemphasis (0–100, default 1) - high-frequency boost; adds that edge-ringing "ringy" analog look.
- scanlines_scale (1–5, default 1.5) - CRT scanline intensity.
- seed - required for reproducible noise.
Input is image (IMAGE) and output is image (IMAGE) → PreviewImage/SaveImage.
Installing it
Part of GlitchNodes:
cd ComfyUI/custom_nodes
git clone https://github.com/pxl-pshr/GlitchNodes
# restart ComfyUI
or ComfyUI Manager → Install Custom Nodes → search "GlitchNodes". Deps: numpy, torch, Pillow, opencv-python, scipy. The node uses scipy.signal.lfilter for the IIR filtering (with a graceful fallback if scipy is missing), so make sure scipy actually installed - Manager handles it. No model downloads.
Gotchas
The word "extremely" in "WIP Extremely Long Processing" is not decoration. This node is slow enough that you want to test on a single frame at reduced size before running a sequence - it's the one node where I'd strongly consider downscaling input first and upscaling after. Also, because it's a real YIQ/composite simulation, its personality is heavily noise-driven: at default noise values on a clean image you may see "too much"; dial video_noise and video_chroma_noise toward 0–20 for the clean-but-bleeding look. And it's WIP - expect errors on unusual frame shapes, and remember the pack disclaimer: "highly experimental and may break or even error."
Inputs (9)
| Name | Type | Default | Description |
|---|---|---|---|
| image | IMAGE | — | |
| subcarrier_amplitude | INT | 401–200 | — |
| video_noise | INT | 1000–10000 | — |
| video_chroma_noise | INT | 1000–10000 | — |
| video_chroma_phase_noise | INT | 150–100 | — |
| video_chroma_loss | FLOAT | 0.240–1 | — |
| composite_preemphasis | FLOAT | 1.00–100 | — |
| scanlines_scale | FLOAT | 1.51–5 | — |
| seed | INT | 00–18446744073709550000 | — |
Outputs (1)
| Name | Type | Description |
|---|---|---|
| image | IMAGE | — |