SPIRAL
VISION-10

VIDEO ON CASSETTE. TOTALLY.

YO!!! Colour video, 10 frames a second, crammed into a plain stereo audio signal. Dub it to a chrome cassette. Rewind. Play. Watch it come back out of the tape deck as a NEON SPIRAL. Tracking error? THAT'S ART, DUDE.

DEMO TAPES

// drag the slider: ORIGINAL ◀ ▶ SPIRALVISION (after a worn-out cassette)

◀▶
ORIGINAL
SPIRALVISION

THE DECK

// the real encoder + decoder, running right here via WebAudio + WebAssembly

SIDE A: SOURCE
SIDE B: SPIRALVISION
STOPPED SPEED — 0.0 FPS FRAME 0

1.00
0.00
1.00

HOW IT WORKS

// 4,800 samples per frame. no pixels were harmed.

1

THE SPIRAL

Each frame is scanned by two interlaced spiral arms that morph from a circle to a 4:3 rectangle. Left channel rides arm A, right channel rides arm B.

2

FM LUMA

Brightness is pitch: black = 3 kHz, white = 12 kHz. FM laughs at tape hiss and level wobble.

3

AM CHROMA

Colour is loudness: U on the left, V on the right. A calibration chirp in every frame teaches the decoder your tape's treble loss.

4

1 kHz SYNC

A beep starts every frame. A flywheel clock keeps 10 fps steady even when the tape stretches, drops out or is pure noise.

SYNC
1 kHz
CHIRP
PICTURE · 2 × 4320 SAMPLES
  • 320 × 240, 10 fps, 48 kHz stereo
  • FM 3–12 kHz luma · AM 0.1–1.0 chroma
  • 2.5→13 kHz two-level calibration chirp
  • quadrature (Hilbert) demodulator
  • flywheel sync: locks through ±8% speed error
  • noise in → spiral noise out, same 10 fps

Full nerd spec: spec.md

GET IT ON EVERY DECK

// one Rust DSP core. every platform. side A and side B.

# headless on a Pi: camera → line out → cassette deck
spiralvision-cli encode -f v4l2 /dev/video0 default -F alsa
# tape deck → line in → decoded video file
spiralvision-cli decode -f alsa default rewind.mp4

Desktop + CLI use ffmpeg for cameras and video files. All builds: github.com/sloev/spiralvision/releases