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.
// drag the slider: ORIGINAL ◀ ▶ SPIRALVISION (after a worn-out cassette)
// the real encoder + decoder, running right here via WebAudio + WebAssembly
// 4,800 samples per frame. no pixels were harmed.
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.
Brightness is pitch: black = 3 kHz, white = 12 kHz. FM laughs at tape hiss and level wobble.
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.
A beep starts every frame. A flywheel clock keeps 10 fps steady even when the tape stretches, drops out or is pure noise.
Full nerd spec: spec.md
// 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