Waterhole Blog
drinkable extracts

A lithograph of Georg Nees' generative art "Schotter" ca. 1968-1970

Georg Nees' Schotter as an obligatory 'Hello World?'
May 2020

Over the last 50 years, computer programmers have ritualized printing “Hello, World!” as a first simple program. Printing some words is as basic as it gets. But “Hello, World!” is more than a test program. For beginners like me, it is a rite of passage - an announcement. It feels a little like a coming of age ceremony. So, how do generative artists initiate this “Hello World” with graphics instead of print?

First, here’s some background. For generative artists, the programed code produces images and graphics. An algorithm, a set of rules procedure, tells the computer to draw lines or color pixels. So, the most basic “Hello World” program for a generative artist must draw something and use an algorithm. Not any loop with a random variable will do. A poor example is a static noise generator.

A static generator meets the letter, but not the spirit of “Hello World”. “Hello, World? is anybody out there?” or “Hello World!, look at this!” The phrase “Hello World” has fungible meanings, deeper by fathoms than “Hi, this program works”, and can be punctuated more than 8 different ways:

Why Schotter

Reproducing Georg Nees’ classic “Schotter” (Gravel) work from the mid 1960s is the obligatory announcement - 'hey, this works.' While there are other classic generative works out there like ‘10 Print’. ‘10 Print’, with it's beautiful book, is more well-known and similarly easy to implement, but ‘10 Print’ doesn’t reach back far enough to the roots of generative art, and was often screen based, rather than pen-plotted as was the case with early generative work. 

Also, Georg Nees was a pioneer of computer art and helped coin the term "generative art". George Nees' work was showcased in a 1965 exhibition called “Generative Art” after all! Nees’ work was also paired with Max Bense’s essay considered to be the first manifesto of computer art: “The projects of generative aesthetics” in the avant-garde booklet rot. issue no 19.


the avant-garde booklet rot. in issue no 19.

Making Schotter


There are many, many reproductions, and many derivatives of Schotter because it is visually compelling, understandable, simple. The algorithm draws 12 columns and 22 rows of squares. Progressively by row, the amount of rotation and “jitter” or offset that is applied to the square increases. Below is a jargon-full description of the algorithm Nees used.


"Schotter is produced by invoking the SERIE procedure. The non-parametric procedure QUAD serves to generate the elementary figure which is reproduced multiple times in the composition process controlled by SERIE. QUAD is located in lines 4 through 15 of the generator. This procedure draws squares with sides of constant length but at random locations and different angles. From lines 9 and 10, it can be seen that the position of a single square is influenced by random generator J1, and the angle placement by J2. The successively increasing variation between the relative coordinates P and Q, and the angle position PSI of a given square, is controlled by the counter index I, which is invoked by each call from QUAD (see line 14)."


One interpretation of Schotter is that it shows “the relationship between order and disorder, and the effects of change.” And what makes the Schotter more than just a basic "Hello" it works is that Schotter practically demands the artist to experiment with balance of order and disorder. Because we do not explicitly know how much rotation and offset Nees' specified for Schotter, we get to decide. For example, compare the original (left) to a reproduction (right) from the web; the reproduction on the right increases the “disorder” more gradually at first than the original on the left.

Order/Disorder comparison -  original vs reproduction

Re-Making Schotter


For a more faithful approximation, I got out the ruler and protractor and measured the position change and rotation. It appears that the rotation and offset ranges increase linearly with I rows. Also, the rotation and offsets are not correlated, indicating Nees used three unique random values per square - rotation, x-offset, and y-offset.


Rotation range simply appears to multiply by 2 per row: For the x and y offsets, the max offset is proportional to the row index. It would be nice if this was simple. It looks like it really is simple, but I could be wandering lost; the offset random range appears to just scale with the Row index. Let’s try it and see, compared to the lithograph version above. "Hello World... I re-made something." Replication has value, ask a psychologist.


Here is a quick version from p5.js Web Editor to play with. The mouse controls offset and rotation (not mobile friendly).