ntsc-rs exposes every aspect of its analog video simulation through a single, unified settings structure. Whether you interact with the effect through the desktop GUI, a host-plugin (After Effects, OpenFX), or the command-line tool, every knob and switch maps directly to a field of theDocumentation 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.
NtscEffect Rust struct. Understanding this structure lets you craft precise JSON presets, automate parameter sweeps, and understand exactly what each control is doing under the hood.
The NtscEffect struct
Every parameter is a public field onNtscEffect. The struct is defined in ntscrs::settings::standard and implements Default, so omitted fields always fall back to sensible starting values.
SettingsBlock<T>
Several parameters are wrapped inSettingsBlock<T>. This type acts like a typed Option<T>: it pairs an enabled: bool flag with a settings: T value. When enabled is false the entire sub-section is skipped at render time, but the inner settings are preserved so that toggling it back on restores your previous values.
enabled flag is written as the group’s own key (a boolean), and each child setting is a sibling key at the top level of the object.
JSON preset format
Presets are flat JSON objects. Every setting — including those nested insideSettingsBlock groups — is serialized as a top-level key. Enum variants are stored as their integer discriminant. The object must contain "version": 1.
Keys use the internal serialization name (shown in the
setting_id! macros), which may differ slightly from the Rust field name. For example, composite_sharpening serializes as "composite_preemphasis" and scale.settings.horizontal_scale serializes as "bandwidth_scale". The correct key names are documented on each sub-page.Enum integer mappings
All enum parameters are stored as unsigned integers in JSON. The tables below list the discriminant for each variant.| Enum | Variant | Integer |
|---|---|---|
UseField | Alternating | 0 |
UseField | Upper | 1 |
UseField | Lower | 2 |
UseField | Both | 3 |
UseField | InterleavedUpper | 4 |
UseField | InterleavedLower | 5 |
FilterType | ConstantK | 0 |
FilterType | Butterworth | 1 |
LumaLowpass | None | 0 |
LumaLowpass | Box | 1 |
LumaLowpass | Notch | 2 |
ChromaLowpass | None | 0 |
ChromaLowpass | Light | 1 |
ChromaLowpass | Full | 2 |
ChromaDemodulationFilter | Box | 0 |
ChromaDemodulationFilter | Notch | 1 |
ChromaDemodulationFilter | OneLineComb | 2 |
ChromaDemodulationFilter | TwoLineComb | 3 |
PhaseShift | Degrees0 | 0 |
PhaseShift | Degrees90 | 1 |
PhaseShift | Degrees180 | 2 |
PhaseShift | Degrees270 | 3 |
VHSTapeSpeed | NONE | 0 |
VHSTapeSpeed | SP | 1 |
VHSTapeSpeed | LP | 2 |
VHSTapeSpeed | EP | 3 |
GUI modes: Easy vs. Standard
The ntsc-rs GUI offers two configuration modes that trade completeness for simplicity. Easy Mode presents a condensed set of sliders that map to anEasyMode struct. Under the hood, each easy-mode value is converted to a full NtscEffect via a fixed mapping — for example, a single “VHS Head Switching” slider drives height, offset, and horiz_shift simultaneously. Easy Mode is ideal for quick experimentation. Its JSON keys are prefixed with ez_.
Standard Mode (the default for presets) exposes every field of NtscEffect directly. This is what the sub-pages below document.
JSON presets saved from Easy Mode are not compatible with Standard Mode and vice versa. Use the matching import button in the GUI.
Parameter reference pages
Luma & Chroma
Input filters, demodulation, smearing, sharpening, phase shift, and color delay.
VHS
Tape speed quality, chroma loss, edge wave distortion, and high-frequency sharpening.
Noise
Composite, luma, and chroma FBM noise; snow intensity and anisotropy; chroma phase noise.
Artifacts
Head-switching glitches, ringing, tracking noise bands, and the global random seed.