The NTSC composite signal encodes luma (brightness) and chroma (color) together on the same waveform, then separates them again on the receiving end. ntsc-rs simulates this entire pipeline — from how the input image is split into fields, through luma and chroma filtering and modulation, all the way to the output lowpass that softens the decoded color signal. The parameters on this page control every stage of that luma/chroma path, and small changes to them produce dramatically different looks ranging from sharp broadcast quality to severely degraded off-air reception.Documentation Index
Fetch the complete documentation index at: https://mintlify.com/ntsc-rs/ntsc-rs/llms.txt
Use this file to discover all available pages before exploring further.
Field and filter selection
Determines which rows (“fields” in NTSC terminology) of the source image are processed each frame. NTSC video is interlaced — each frame contains two interleaved fields captured at slightly different times.
JSON key:
| Value | Variant | Behavior |
|---|---|---|
0 | Alternating | Alternate between skipping even and odd rows each frame. |
1 | Upper | Keep only the upper (even-numbered) rows; skip the lower ones. |
2 | Lower | Keep only the lower (odd-numbered) rows; skip the upper ones. |
3 | Both | Use all rows — no rows are skipped. |
4 | InterleavedUpper | Treat the source as interlaced; upper field is the earlier frame. (default) |
5 | InterleavedLower | Treat the source as interlaced; lower field is the earlier frame. |
"use_field"Selects the low-pass filter design used throughout the entire effect pipeline.
JSON key:
| Value | Variant | Behavior |
|---|---|---|
0 | ConstantK | Simple constant-k ladder filter. Produces a softer, blurrier result with a gradual rolloff. |
1 | Butterworth | Maximally flat Butterworth filter. Sharper cutoff with less blur, more characteristic of real broadcast equipment. (default) |
"filter_type"Input luma processing
Pre-filters the luminance signal before it is modulated onto the composite carrier. This step reduces “rainbow” color fringing artifacts that arise when fine luma detail bleeds into the chroma band.
JSON key:
| Value | Variant | Behavior |
|---|---|---|
0 | None | No filtering. Preserves all luma detail but introduces rainbow artifacts. |
1 | Box | Simple box (averaging) filter on the luma signal. Soft and artifact-free. |
2 | Notch | Notch filter centered on the color subcarrier frequency. Sharper than box, but may introduce mild ringing. (default) |
"input_luma_filter"Smears (low-pass filters) the luminance channel horizontally, simulating bandwidth limiting of the luma signal in lower-quality tape or transmission equipment. Higher values create a more pronounced horizontal blur on bright-to-dark transitions.
- Range:
0.0–1.0 - JSON key:
"luma_smear"
Input chroma processing
Applies a low-pass filter to the chrominance signal before it is encoded into the composite waveform. This limits the color bandwidth going into the simulated transmission, softening color edges.
JSON key:
| Value | Variant | Behavior |
|---|---|---|
0 | None | No chroma filtering on input. |
1 | Light | Mild low-pass — reduces color bandwidth slightly. |
2 | Full | Full-strength low-pass — strongly limits chroma bandwidth. (default) |
"chroma_lowpass_in"The filter used to separate the chrominance signal from the composite waveform during demodulation. Different filter types produce very different color fringing and cross-color patterns.
JSON key:
| Value | Variant | Behavior |
|---|---|---|
0 | Box | Simple horizontal box blur. Smooth color edges with some luma/chroma crosstalk. |
1 | Notch | Notch filter. Sharper separation, but may introduce ringing near color transitions. (default) |
2 | OneLineComb | Averages the current row with the previous row, phase-cancelling chroma. Requires video_scanline_phase_shift = 180°. |
3 | TwoLineComb | Averages the current row with the previous and next rows. Requires video_scanline_phase_shift = 180°. Best luma/chroma separation. |
"chroma_demodulation"Composite signal sharpening
Boosts high frequencies in the NTSC composite signal before demodulation, sharpening the image and making colors more vivid. Negative values soften the image; values above
1.0 produce an over-sharpened, “enhanced” broadcast look.- Range:
-1.0–2.0 - JSON key:
"composite_preemphasis"
Scanline phase shift
The phase offset applied to the chroma subcarrier on each successive scanline. In standard NTSC, this is 180° — each line’s color carrier is inverted relative to the line above it. This alternation is what allows comb filters to separate luma from chroma.
JSON key:
| Value | Variant |
|---|---|
0 | Degrees0 |
1 | Degrees90 |
2 | Degrees180 (default) |
3 | Degrees270 |
"video_scanline_phase_shift"OneLineComb and TwoLineComb demodulation filters only work correctly when this value is Degrees180 (2).Shifts the starting line for the scanline phase alternation pattern. Adjusting this can change which lines receive which phase, which affects the color pattern produced by comb filters.
- Range:
0–3 - JSON key:
"video_scanline_phase_shift_offset"
Chroma delay
Shifts the decoded chroma signal horizontally relative to luma, in pixels. Positive values move color to the right; negative values move it to the left. This simulates the color registration errors common in consumer VHS playback, where chroma and luma paths have slightly different delays.
- Range:
-40.0–40.0 - JSON key:
"chroma_delay_horizontal"
Shifts the decoded chroma signal vertically relative to luma, in scanlines. A vertical chroma offset becomes more pronounced with each generation of VHS dubbing.
- Range:
-20–20 - JSON key:
"chroma_delay_vertical"
Applies a static, constant phase error to the entire chroma signal. This rotates all colors in the image by a fixed hue offset, simulating a misaligned color burst reference on a TV or VCR. The value is a percentage of a full rotation (0.0 = no shift, 1.0 = 360°).
- Range:
0.0–1.0(percentage) - JSON key:
"chroma_phase_error"
Output chroma processing
When enabled, blends each scanline’s chroma signal with the scanline above it vertically. This emulates the chroma bandwidth limiting that occurs in VHS playback and cheap composite decoders, softening color transitions between lines. Automatically disabled in Easy Mode when VHS emulation is active.JSON key:
"vhs_chroma_vert_blend"Applies a low-pass filter to the chroma signal after all processing is complete, before the final YIQ-to-RGB conversion. This is the output-side counterpart to
JSON key:
chroma_lowpass_in.| Value | Variant | Behavior |
|---|---|---|
0 | None | No filtering. |
1 | Light | Light low-pass filter. |
2 | Full | Full-strength low-pass filter. (default) |
"chroma_lowpass_out"Scale settings
Thescale field is a SettingsBlock<ScaleSettings>. When disabled (the default), the effect uses the native pixel dimensions of the input. Enabling it allows you to scale the effect independently of the video resolution.
Enable or disable the scale block. When disabled, scaling factors are ignored.JSON key:
"scale_settings"Scales all horizontal frequency-domain operations by this factor. At
1.0 the effect is calibrated for 480p video. Increase this value when working with higher-resolution sources to maintain physically accurate-looking results.- Range:
0.125–8.0 - JSON key:
"bandwidth_scale"
Scales vertical frequency-domain operations by this factor. In most cases this should be left at
1.0.- Range:
0.125–8.8 - JSON key:
"vertical_scale"
When enabled, multiplies both scaling factors by the video’s height in pixels. This provides a rough approximation of resolution-independent scaling, but scaling the input to 480p first gives more accurate-looking results.JSON key:
"scale_with_video_size"