Last Updated: Dec 20, 2022
From a graphics perspective, Geiss - both the screensaver and the Winamp plug-in version - worked by essentially a fast repetition of 2 simple steps:
To do such a warp, for each pixel in the new frame, you have to sample (read) a pixel in the old frame. But you don't want to just sample one pixel - that would make things look very super blocky. So instead you sample 2x2 pixels, computing a weighted average of the 4 pixel values, where the weights are determined by the ideal (sub-pixel) coordinates. (The technique is well-known and is called bilinear interpolation.) In Geiss, the weights summed to 256, and then a right-shift by 8 bits was used (to divide by 256 in a single clock cycle -- whereas "real" division is normally super slow).
Computing the warp coordinates and weights on the fly was too slow back then though. So the trick that Geiss used (admittedly inspired by many a demo from the incredible "demo scene" in Europe) was to precompute all of this. It would generate a big "warp map" with six bytes of information per pixel (IIRC): 2 bytes for the address (relative to the previous pixel's source sampling address) of the upper-left pixel in the source 2x2 pixel cluster we want, and 4 bytes containing the 4 weights.
Then, to perform the warp, for each destination pixel, you just read in the 6 bytes; update your source (read) pixel coordinate; sample the 4 pixels; multiply them by the weights; add them together; divide by 256 (using shift-right); and then write the new pixel value to the new frame (image) you want to show.
A few things made it really fast.
There was one more cool trick that I should share, though. When I shifted right, I didn't just throw away those lowest 8 bits -- I carried them to the next pixel (adding them to its sum). This helped avoid rounding error, and helped preserve “mass”, locally, in the image, more accurately over time. And visually, it introduced a cheap but effective kind of error-diffusion dithering that looked really nice - it kind of added a subtle texture or grain to the movement. I think this lent a higher quality to the look of the rendering in Geiss; in similar plugins, I never saw others use this trick.
I originally came up with the 'warping' part of Geiss in early 1998. I was trying to make a smoke effect, but I got lucky and it turned into something cooler.
The original version was just called "FX" (a placeholder name) and the earliest snapshot I have of it is a binary from March 6, 1998. If interested, you can check out the original FX source code or windows binary. There was no audio tie-in yet, and I think the only resolution supported was 320x240.
After that, I thought it would be really cool to add audio waveforms as the 'seed' for the effect. This wasn't exactly my original idea, though -- I had seen a program called Cthugha a few years prior which did something similar, and there were probably programs before Cthugha that did it, too. But I think Geiss did add a lot to this chain of progressively improving visualizers - in particular, high resolutions and framerates, and some nice new artistic elements.
Anyway, later that year I turned it into a screensaver and added audio input (drawing the waveform into the image). Around the same time, Winamp was just starting to turn into a big thing, and they had just opened up their visualization plug-in API, so I also modified the code to produce a Winamp plug-in version.
At some point, I was hanging out with my good friend Evan List, and lamenting the crappy name choice of "FX", andi told him I was struggling to come up with a better name for it. I then vividly remember him saying: "Dude... you should just call it Geiss! That's such a cool name!" So I renamed it. (And I do agree, I think it's a cool name).
At the time, I even remember thinking how cool it would be if someday, just one person recognized my name and asked me if I wrote this program. What I didn't know yet was that it would go viral, and that it would be a little embarrassing for me that I named it after myself. :P
[ return to the geiss main page ]