Nodes/GlitchNodes/TV Glitch | GlitchNodes
ComfyUI Node

TV Glitch | GlitchNodes

Actual analog TV signal emulation — and it's slow

By pxl-pshr·Created 2 years ago·Updated 3 months ago· 73
TV Glitch | GlitchNodes
  • image
  • image
subcarrier_amplitude40
video_noise100
video_chroma_noise100
video_chroma_phase_noise15
video_chroma_loss0.24
composite_preemphasis1.0
scanlines_scale1.5
seed0

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."

CategoryGlitchNodes

Inputs (9)

NameTypeDefaultDescription
imageIMAGE
subcarrier_amplitudeINT401–200
video_noiseINT1000–10000
video_chroma_noiseINT1000–10000
video_chroma_phase_noiseINT150–100
video_chroma_lossFLOAT0.240–1
composite_preemphasisFLOAT1.00–100
scanlines_scaleFLOAT1.51–5
seedINT00–18446744073709550000

Outputs (1)

NameTypeDescription
imageIMAGE