b3ntb0x
b3ntb0x · outputA circuit-level NTSC/composite video destroyer. Where the original BENTBOX does one symbolic RGB/YIQ pass, B3NTB0X runs a real four-stage analog pipeline: it ENCODES the incoming picture into a per-column composite VOLTAGE on a 3.58 MHz subcarrier (with sync tip, blanking, colour burst, and active video), runs that voltage through an analog BEND CIRCUIT (AC/DC coupling, gain, bias, soft-clip + diode clamp, plus four circuit-bend taps), DECODES it back to RGB with a quadrature demodulator and recovered sync, then renders it on a curved CRT (beam blur, phosphor grille, scanlines/interlace, bloom, persistence, overscan, barrel). Sync crush, dot-crawl, rainbow swim and rolling all EMERGE from the signal path — they are not cosmetic filters. Patch a video source into IN and it is the chainable, CRT-rendered OUT. Crank Sync Crush + Bias to tear and roll the picture, starve the Burst to kill colour and bring on herringbone, push Drift for swimming rainbow, and use Bend A–D for wavefold/comb/crush/bleed mangling. The preview is a resizable CRT screen (drag the bottom-right handle; default 540x540, min 360x540) that letterboxes at the live engine aspect with the 4:3 active area, overscan and barrel applied inside the shader; right-click for fullscreen / full-frame / present-on-second-display, and a "reduced precision" badge appears if the GPU cannot allocate the float buffers the composite voltage needs.
the faceplate
inputs
| id | cable | what it does |
|---|---|---|
in | video | Video input — the upstream RGB picture that becomes the active-video region of the synthesized NTSC line. With nothing patched the encoder feeds black (a clean blanked raster you can still bend). RGB video stream |
enhance_cv | cv | Modulates Enhance (HF peaking / edge over-ring in the bend circuit). control voltage (CV); modulates enhance (additive offset — ±1 CV sweeps the full range, centered on the knob) |
bias_cv | cv | Modulates Bias (the DC offset added before the soft-clip/diode-clamp; drives sync crush and tearing). control voltage (CV); modulates bias (additive offset — ±1 CV sweeps the full range, centered on the knob) |
ac_dc_cv | cv | Modulates AC/DC (input-coupling blend, DC passthrough to leaky AC-coupled so flat areas droop toward grey). control voltage (CV); modulates ac_dc (additive offset — ±1 CV sweeps the full range, centered on the knob) |
sync_crush_cv | cv | Modulates Sync Crush (master transistor gain into the clip; high gain drags the sync tip through the clamp so the decoder loses lock). control voltage (CV); modulates sync_crush (additive offset — ±1 CV sweeps the full range, centered on the knob) |
burst_starve_cv | cv | Modulates Burst Starve (attenuates the colour-burst reference: desaturation toward mono plus subcarrier dot-crawl into luma). control voltage (CV); modulates burst_starve (additive offset — ±1 CV sweeps the full range, centered on the knob) |
chroma_leak_cv | cv | Modulates Chroma Leak (how much chroma energy bleeds into luma in the decoder, i.e. dot-crawl amount). control voltage (CV); modulates chroma_leak (additive offset — ±1 CV sweeps the full range, centered on the knob) |
luma_peak_cv | cv | Modulates Luma Peak (decode-side unsharp sharpening on the recovered luma). control voltage (CV); modulates luma_peak (additive offset — ±1 CV sweeps the full range, centered on the knob) |
bend_a_cv | cv | Modulates Bend A (WAVEFOLD — reflect the composite voltage past a shrinking threshold for solarised creases). control voltage (CV); modulates bend_a (additive offset — ±1 CV sweeps the full range, centered on the knob) |
bend_b_cv | cv | Modulates Bend B (COMB RIPPLE — mix a horizontally-delayed copy back in for ringing/ghost edges). control voltage (CV); modulates bend_b (additive offset — ±1 CV sweeps the full range, centered on the knob) |
bend_c_cv | cv | Modulates Bend C (CRUSH — quantise/posterise the picture into hard contour bands). control voltage (CV); modulates bend_c (additive offset — ±1 CV sweeps the full range, centered on the knob) |
bend_d_cv | cv | Modulates Bend D (CHROMA→SYNC BLEED — cross-couple HF ripple onto the DC path for luma buzz/rolling). control voltage (CV); modulates bend_d (additive offset — ±1 CV sweeps the full range, centered on the knob) |
feedback_cv | cv | Modulates Feedback (CRT phosphor persistence / motion-trail amount). control voltage (CV); modulates feedback (additive offset — ±1 CV sweeps the full range, centered on the knob) |
tbc_cv | cv | Modulates TBC/Lock (time-base correction; 1 is rock-steady, 0 lets sync offset + timebase wobble shimmy the lines). control voltage (CV); modulates tbc (additive offset — ±1 CV sweeps the full range, centered on the knob) |
tube_bloom_cv | cv | Modulates Tube Bloom (highlight halation/glow spilling into neighbours). control voltage (CV); modulates tube_bloom (additive offset — ±1 CV sweeps the full range, centered on the knob) |
overscan_cv | cv | Modulates Overscan (how far the image is pushed past the visible CRT edge). control voltage (CV); modulates overscan (additive offset — ±1 CV sweeps the full range, centered on the knob) |
barrel_cv | cv | Modulates Barrel (CRT glass bulge / barrel distortion and corner vignette). control voltage (CV); modulates barrel (additive offset — ±1 CV sweeps the full range, centered on the knob) |
mirror_x_gate | cv | Gate input on the CV cable (edge-detected): a RISING edge TOGGLES the Mirror X kaleidoscope fold — it fires on the rising edge, not on the held level. Feeds the mirrorXGate param. control voltage (CV); modulates mirrorXGate (summed directly (the destination DSP scales it)) |
mirror_y_gate | cv | Gate input on the CV cable (edge-detected): a RISING edge TOGGLES the Mirror Y kaleidoscope fold — it fires on the rising edge, not on the held level. Feeds the mirrorYGate param. control voltage (CV); modulates mirrorYGate (summed directly (the destination DSP scales it)) |
outputs
| id | cable | what it does |
|---|---|---|
out | video | Video output — the final CRT-rendered frame (decoded RGB after the full encode→bend→decode→CRT chain, with overscan, barrel, scanlines, phosphor and persistence baked in). Chainable into any video input. RGB video stream |
params
| id | label | range | default | curve |
|---|---|---|---|---|
enhance | Enhance | 0..1 | — | linear |
bias | Bias | -1..1 | — | linear |
ac_dc | AC/DC | 0..1 | — | linear |
sync_crush | Sync Crush | 0..2 | — | linear |
burst_starve | Burst Starve | 0..1 | — | linear |
chroma_leak | Chroma Leak | 0..1 | — | linear |
luma_peak | Luma Peak | 0..1 | — | linear |
bend_a | Bend A | -1..1 | — | linear |
bend_b | Bend B | -1..1 | — | linear |
bend_c | Bend C | -1..1 | — | linear |
bend_d | Bend D | -1..1 | — | linear |
feedback | Feedback | 0..1 | — | linear |
tbc | TBC/Lock | 0..1 | — | linear |
tube_bloom | Tube Bloom | 0..1 | — | linear |
overscan | Overscan | 0..1 | — | linear |
barrel | Barrel | 0..1 | — | linear |
hue | Hue | -1..1 | — | linear |
sub_drift | Drift | 0..1 | — | linear |
mirrorX | Mirror X | 0..1 | — | discrete |
mirrorY | Mirror Y | 0..1 | — | discrete |
mirrorXGate | Mir X Gate | 0..1 | — | linear |
mirrorYGate | Mir Y Gate | 0..1 | — | linear |
freeze | Freeze | 0..1 | — | linear |
controls
| control | what it does |
|---|---|
| AC/DC | AC/DC (0–1): input-coupling blend. 0 = DC passthrough; 1 = leaky AC coupling that loses the DC pedestal so big flat bright/dark areas droop back toward mid-grey. |
| Barrel | Barrel (0–1, default 0.25): CRT glass barrel distortion (outward bulge about center) plus the matching corner vignette. |
| Bend A | Bend A — Wavefold (-1–1): reflects the composite voltage back on itself past a shrinking threshold for solarised banding/creases. Identity at 0; sign picks fold polarity. |
| Bend B | Bend B — Comb Ripple (-1–1): mixes a horizontally-delayed copy of the voltage back in (one-tap comb) for ringing, ghost edges and colour beating. Identity at 0. |
| Bend C | Bend C — Crush (-1–1): quantises/posterises the picture into a few hard steps (bit-crush banding); the visible crush is applied on the recovered RGB, stepping from ~256 levels down toward 3 as magnitude approaches 1. Identity at 0. |
| Bend D | Bend D — Chroma→Sync Bleed (-1–1): cross-couples the HF/chroma ripple onto the DC/baseline path, so the picture modulates the baseline as luma buzz / rolling contamination. Identity at 0. |
| Bias | Bias (-1–1): DC offset added before the nonlinear clip. Pushes the signal asymmetrically into the soft-clip/diode-clamp; with Sync Crush it drags the sync tip up and crushes it (tearing/rolling). |
| Burst Starve | Burst Starve (0–1): starves the colour-burst phase reference. Desaturates the picture toward monochrome (colour killer) AND leaks raw subcarrier energy into luma as dot-crawl/herringbone. |
| Chroma Leak | Chroma Leak (0–1, default 0.15): amount of under-filtered chroma energy that bleeds into the recovered luma in the decoder — visible dot-crawl on the picture. |
| Enhance | Enhance (0–1): high-frequency peaking on the composite voltage; sharpens edges and adds over-ringing. 0 is flat. |
| Feedback | Feedback (0–1): CRT phosphor persistence; blends a decayed copy of the previous frame for motion trails. 0 is no trails. |
| Freeze | Freeze (0/1, default 0): a hidden determinism toggle with NO control anywhere — not on the card, not on the faceplate, not on the patch surface. At 0.5 or above the draw step is a no-op, so every surface holds its last frame instead of going black. It exists because this module animates by construction: the subcarrier phase and the sync wobble both advance with elapsed time, and the CRT persistence path feeds the previous frame back on top of that, so two captures of the same settings are never the same pixels. The visual-regression harness writes it before comparing a screenshot; nothing else ever does. |
| Hue | Hue (-1–1): receiver TINT — rotates the synchronous-demodulator reference axis (the recovered I/Q chroma vector) up to ±0.9π. Shifts colour angle while preserving saturation. 0 is no shift. |
| Luma Peak | Luma Peak (0–1): decode-side unsharp masking on the recovered luma; sharpens detail using the bent neighbours. 0 is off. |
| Mirror X | Mirror X (0/1): kaleidoscope toggle that folds the left half over the right. Driven by the card's MIRROR X button and by a rising edge on the Mir X Gate input. |
| Mir X Gate | Mir X Gate (0–1): the synthetic gate level fed by the mirror_x_gate input; a rising edge on it toggles Mirror X. Read for edge detection, not as a continuous control. |
| Mirror Y | Mirror Y (0/1): kaleidoscope toggle that folds the top half over the bottom. Driven by the card's MIRROR Y button and by a rising edge on the Mir Y Gate input. |
| Mir Y Gate | Mir Y Gate (0–1): the synthetic gate level fed by the mirror_y_gate input; a rising edge on it toggles Mirror Y. Read for edge detection, not as a continuous control. |
| Overscan | Overscan (0–1, default 0.2): scales the image slightly past the visible CRT edge so borders fall outside the active area, like a real TV. |
| Drift | Drift (0–1): subcarrier instability. Injects an uncorrected carrier phase error that grows across each line and wanders in time, so chroma swims as a rainbow over the picture. 0 is stable. |
| Sync Crush | Sync Crush (0–2, default 1): master transistor gain into the clip. At 1 it is unity; above 1 it overdrives and can crush the sync tip so the decoder fails to lock; below 1 it underdrives. |
| TBC/Lock | TBC/Lock (0–1, default 1): time-base correction. 1 corrects the recovered sync offset and analog timebase wobble to rock-steady; 0 lets both through so lines shimmy left/right and the picture breathes. |
| Tube Bloom | Tube Bloom (0–1, default 0.35): highlight halation — bright phosphors spill warm glow into neighbours and blow out toward white. 0 is off. |
source
b3ntb0x.ts on GitHub.