Visual essay / September 2026
The frame that remembered.
In 1998, Ryan Geiss made music leave trails by turning each image into the next. We tried that idea with a full-screen visualizer and found that a filled picture behaves differently from a single line.
Draw. Sound makes a new line.
Move. The saved picture shifts and fades.
Draw again. A new line joins the old one.
What changes? The left side redraws the scene from its current state. On the right, an experimental Geiss-inspired effect mixes the fresh scene with warped earlier pictures. This is image feedback: the picture itself becomes part of the next picture.1
01 / A different kind of image
The picture has a past.
A waveform is a line drawn from the changing audio signal. In Geiss, each new line enters a picture that still holds lines from earlier moments.
Ryan Geiss describes the original loop in two actions: draw the waveform into an image, then warp that image.1 Warping shifts the old picture instead of starting with a blank frame. The line may be small, but the whole image moves. Older marks curl, stretch, and fade while new sound keeps entering.
An animation can remember without saving pixels. It can keep the positions of shapes or measurements of sound, then draw a new image from those values every frame. Image feedback keeps the previous picture itself. These are two different ways to give motion continuity.
Evolving state · positions and sound measurements carry forward.
Image feedback · earlier pixels remain visible as they move.
Movement gives each mark a path; fading decides how long it remains. A brief sound can leave a shape for later sounds to cross. Even silence can have motion while those older marks disappear.
A small experiment
Remove a step and feel the difference.
This browser sketch uses a simple canvas transform to explain the loop. It is an original diagram, not footage or a faithful Geiss renderer. Stop the new mark and watch the old one fade as it moves. Draw again, then hold movement still. Finally, change the trail length to see how many moments can overlap.
A low resolution teaching sketch · synthetic signal · no microphone or file access
With no new mark, the existing image is all the system has.
Movement turns a line into a path through time.
Longer persistence lets more moments overlap.
The dark space around the line gives old marks room to accumulate. What happens if the new input already fills the picture? Adding that full image to its own history each frame would wash out the result. Our browser experiment below starts there.
02 / The original craft
A visual idea shaped by a machine.
In 1998, moving every pixel was expensive. Geiss made the motion practical by calculating much of it ahead of time.
Each pixel in the new picture asked where its color should come from in the old one. That location often fell between pixels, so nearby colors had to be blended. Geiss calculated a lookup map of source positions and blending weights ahead of time, then applied it with a fast assembly-language loop. While one map drove the picture, another was prepared row by row. A beat could switch between them.1
One small arithmetic choice also shaped the look. Rounding pixel colors left fractional values behind. Geiss carried those leftovers into the next pixel, preserving more of the image and giving it a fine texture.1
Geiss began as a smoke experiment called FX. The earliest binary Geiss says he still has dates to March 1998. Audio waveforms and the screensaver and Winamp versions came later that year. He credits Cthugha as one influence on the waveform seed and acknowledges earlier work in that chain.1
A thin waveform becomes a composition as the image carries it forward.
03 / The WebGL experiment
A waveform has room. A scene needs restraint.
Psychodeli+ is a browser music visualizer: it draws a full-screen field of color and pattern that can change with sound. In September 2026, we added optional image feedback to an experimental version. We first fed it a thin waveform, with darkness around it for trails to grow. Feeding it the complete picture changed the problem: the old and new images occupied the same space.2
Waveform · one thin mark, much of the image open.
Full scene · new pixels already cover the frame.
Adding that full scene to its own history each frame would fill the picture with light. The hybrid prototype instead mixes warped history with the fresh image. At the default 0.38 history mix, the old image can move without taking over the whole frame.2
The graphics processor keeps two images. It reads the previous one, writes the next one, then swaps their roles. This lets the effect use the visualizer's existing sound response and color scheme. Resizing the window or switching to a different saved scene clears the history; changing the colors can leave old colors to fade beside new ones. The original pattern still renders each frame, so feedback adds work rather than replacing it.2
With history mix at zero, an automated check found the output identical to the ordinary view, pixel for pixel. That checks the effect's off switch. It does not tell us whether a song feels better with feedback, or how comfortably phones and TVs run it.2
Our graphics-processor version also has a different grain from Geiss's integer arithmetic. It adapts selected motions but does not reproduce his precomputed maps, error diffusion, or full set of motions. The adapted code carries the original BSD license notice.2
The implemented effect / live
Now move the real picture.
This is the browser visualizer running our optional feedback effect. Compare the untouched picture, trails made from the full scene, and a sparse waveform. Try Swirl or Vortex to change how old images move. The separate Duplex layering effect stays off. Sound input is off here, so Waveform uses a repeating idle line.
0% shows the fresh scene; 100% shows its warped history.
Scene trails · Vortex · 38% history. The app's audio stays off in this embed.
Open this mode in the full app ↗04 / What stays with us
Choose what the picture keeps.
Geiss showed how a small audio mark can unfold into a longer visual gesture when the image carries it forward.
Our experiment found a practical limit: when the fresh picture already fills the screen, its moving history needs a smaller share of the mix. Trail length, the movement of old pixels, and the amount of fresh image become choices that shape the result. The field can still respond immediately while earlier images linger.

The renderer remains optional and experimental. Automated rendering and integration checks passed. Longer listening sessions and tests on physical phones and TVs are still needed to judge its feel and performance.
Sources / further reading
Where the details came from.
- Ryan Geiss, “How Geiss Worked” (updated 2022), with the original two-step description, optimization details, and historical account. See also the Geiss source repository.
- Psychodeli+ experimental branch
codex/geiss-feedback, commitsbccf0b22and504a7131; implementation notes indocs/GEISS_EXPERIMENT.md. The opt-in renderer is also present in this essay's local checkout. These are prototype results, not a released feature. - Ryan Geiss, Geiss HDR, the official page for his March 2026 browser rewrite.