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.

FRAME 01

Draw. Sound makes a new line.

FRAME 02

Move. The saved picture shifts and fades.

FRAME 03

Draw again. A new line joins the old one.

A frame is one complete picture in a moving sequence. This three-frame teaching diagram shows the feedback loop; it is not Geiss footage.
Before · unmodifiedAfter · feedback
Feedback view: softer, overlapping pink and copper vortex trails Unmodified view: sharper pink and copper radial pattern
Drag the divider or use the arrow keys.Psychodeli+ is our browser music visualizer. Both sides use the same held-still scene. Only the image-feedback effect changes: off on the left, scene-fed vortex feedback on the right. Duplex is off in both.

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.

next = fade × move(last) + markA shorthand for the idea, not an equation copied from Geiss's program.

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

Previous image · four nearby pixels
New image · one blended pixel
Map Aon screen
Map Bbuilt row by row
Conceptual sampling diagram. Geiss stored the source positions and interpolation weights ahead of time; a completed second map could take over on a beat.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

1
· · · →fraction left
2
· · →carry forward
3
· →carry forward
4
·fine texture
A conceptual illustration of error diffusion, not a reconstruction of Geiss's pixel values. The renderer's arithmetic could become part of its aesthetic.

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

1998 · FXA smoke experiment establishes the image feedback idea.
1998 · GeissWaveforms give the moving image a musical mark.
2026 · Geiss HDRRyan Geiss revisits the work in a browser with higher-precision feedback.
Geiss has his own contemporary continuation, Geiss HDR.3 The browser experiment below is ours, separate from Geiss HDR.

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

fresh scene · 62%warped history · 38%
The mix is a compositing proportion, not a measured share of what the eye sees.

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

Aread last frame
Bwrite next frame
swapB becomes history
The roles reverse every frame. Resizing or choosing a new saved scene starts a new visual memory.

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.

Input
Motion

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.

A later frame of the pink and copper field bent into vortex trails
A later frame with scene-fed vortex feedback at 38% history. The opening slider lets you compare this experimental mode with the unmodified scene.

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.

  1. Ryan Geiss, “How Geiss Worked” (updated 2022), with the original two-step description, optimization details, and historical account. See also the Geiss source repository.
  2. Psychodeli+ experimental branch codex/geiss-feedback, commits bccf0b22 and 504a7131; implementation notes in docs/GEISS_EXPERIMENT.md. The opt-in renderer is also present in this essay's local checkout. These are prototype results, not a released feature.
  3. Ryan Geiss, Geiss HDR, the official page for his March 2026 browser rewrite.