Stoatworks Labs

Slowscan

Slow-scan TV over a fading HF path, for Resolume

Betav0.1.0Plugin & ModuleC++ / GLSL
Slowscan — Slow-scan TV over a fading HF path, for Resolume
Slowscan

What it does

An FFGL effect for Resolume Arena and Avenue. Slow-scan television sends a still picture down a voice radio channel as audio. Each pixel is a tone, from 1500 Hz for black to 2300 Hz for white, sent a line at a time with a 1200 Hz pulse between lines, and a Martin M1 picture takes nearly two minutes. At the other end an FM discriminator turns the tones back into brightness, and the decoder paints each line as it comes in.

So Slowscan builds the whole chain (source, tones, HF channel, discriminator, line timing, picture) and runs it on the CPU at 11,025 samples a second, with Martin M1, Scottie S1 and Robot 36 timed from J. L. Barber's SSTV mode specifications. The clip is read back at the mode's resolution and sent, either latched when a picture starts, the way a station sends a stored image, or live, line by line. What reaches the screen is whatever the receiver made of it, the new picture writing over the old one from the top under a cursor.

The receiver times its lines from its own sound-card clock, so a clock a few ppm out leans a vertical edge by e × T_line / T_pixel pixels a line, which is 0.29 at 300 ppm in Martin M1. Martin sends green, blue and red in turn, so the same slant drags the end of one colour scan into the start of the next and fringes the edge. Slant Correct subtracts a set ppm, as decoders do, and Line Sync re-anchors every line on its 1200 Hz pulse so the lean goes away.

Below the FM threshold, around 3 dB SNR in 3 kHz, the discriminator starts throwing clicks and the picture turns to streaks. Rx Bandwidth is the discriminator's lowpass, and narrowing it smears edges to the right. A seeded Clarke fading model drags the SNR down in a fade, and because it's FM the picture doesn't dim, whole bands of lines just go noisy. A second path makes ghosts, and a carrier on frequency beats with the picture tones into vertical stripes. Resolume hands an effect 64 FFT bins rather than a waveform, so the audio you route in goes on air as noise shaped by those bins, and the music turns up in the picture wherever its spectrum overlaps the SSTV band.

Speed squeezes the two-minute picture into as little as a second, and all it changes is how many samples a video frame is worth. Every process is defined per sample, so a noisy, fading picture comes out bit-identical at 1x and at 120x. Auto VIS cycles the three modes and decodes each one from its header.

  • The whole chain, tones to HF channel to discriminator to picture, at 11,025 samples a second
  • Martin M1, Scottie S1 and Robot 36, and Auto VIS, which decodes each from its header
  • Slant from the receiver's clock error, with Slant Correct and Line Sync to take it out
  • Progressive arrival under a cursor, from a picture latched at the start or sent live
  • SNR, Rayleigh fading, multipath and a QRM carrier, with the FM threshold's noise streaks below the knee
  • The audio routed in goes on air as interference, shaped by the host's spectrum
  • Speed from 1x to 120x, which changes nothing per sample
  • Universal macOS bundle and a Windows x64 DLL

Where it stands

v0.1.0, and early days. It hasn't been loaded into Resolume on macOS yet. On Windows it has: a build loads, registers and renders in Resolume Arena 7.27.1 on software rendering (no GPU), with every parameter as declared; its three audio-driven controls couldn't be tried there, because the box has no sound device. An offline harness driving the real plugin and its signal chain checks the radio: every line, segment and pixel boundary of all three modes lands on its constant to the sample, the slant matches e × T_line / T_pixel at ±100, ±150 and ±300 ppm, flat black, grey and white come back to the exact 8-bit value, the lowpass smear and the noise above the FM threshold match their closed forms, the threshold knee sits at 3.70 dB SNR against Rice's 3.11 (tolerance 2.78), the VIS header decodes to the mode it was sent in, Line Sync holds an edge within 0.24 px where free-running would drift 75 px, and a noisy, fading, multipath picture is bit-identical at 1x and 120x. It catches fourteen models that are wrong on purpose and a one-character sabotage of its own shader, and all 20 swept controls change the picture. On macOS it costs about 1 ms a frame at the default 40x at 720p, 1080p and 4K alike, nearly all of it the CPU signal chain on the host's render thread, and it rises with Speed to 2.58 ms at 120x (1080p). Nobody has measured how Resolume lays out its 64 FFT bins, so Bin Spacing is an assumption and the bins are read as magnitudes. The fading is flat, the channel has at most two paths, and the receiver is one decoder design, not MMSSTV's or QSSTV's. There's a user guide and a browser demo (a port, not the plugin), but no presets and no OpenFX port. The macOS builds are signed and notarised. Try it in your own rig before you trust it in a show.

Watch it running

Slowscan video thumbnail

Nothing loads from YouTube until you press play.Watch it there instead