Greta Monach (geb. Vermeulen, 1928–2018) war Flötistin, Programmiererin und Pionierin der Computerpoesie in den Niederlanden. Am Institut für Sonologie der Universität Utrecht, wo sie von 1966 bis 1986 arbeitete, entwickelte sie auf einer ELECTROLOGICA X-8 ihre „Automaterga" — computergestützte Gedichte, deren Name aus griechisch AYTOMATOΣ (selbstbewegend) und EPΓON (Werk) zusammengesetzt ist.
Das AUTOMATERGON 72-20S verwendet einsilbige, desemantisierte Wörter, die nach Vokal in vier Kategorien geordnet sind (AAL/EEL/OOL/UIL-Reihen mit variierenden Anfangskonsonanten). Das Programm platziert Wortketten auf einem rechteckigen Raster: Für jede Kette wird eine Kategorie, eine Startposition und eine von acht Richtungen zufällig gewählt. Jeder Kategorie ist eine Farbe zugeordnet (Rot, Grün, Blau, Schwarz). Das Ergebnis ist eine visuelle Klangpoesie, bei der Semantik zugunsten von Laut und Form zurücktritt.
Monach veröffentlichte das Verfahren 1973 in ihrer Schrift „Compoëzie" (aus computer + poëzie). Ihr Nachlass befindet sich im Stedelijk Museum Amsterdam.
import random
# AUTOMATERGON 72-20S nach Greta Monach
# Kategorien nach Vokal, einsilbige Wörter mit gleichem Endkonsonant
CATEGORIES = {
1: ['AAL','BAAL','BRAAL','DAAL','DRAAL','DWAAL','GAAL',
'GNAAL','GRAAL','HAAL','KRAAL','KWAAL','PAAL',
'PRAAL','SAAL','SCHAAL','SMAAL','SNAAL','SPAAL'],
2: ['EEL','BEEL','BREEL','DEEL','DREEL','DWEEL','GEEL',
'GNEEL','GREEL','HEEL','KREEL','KWEEL','PEEL',
'PREEL','SEEL','SCHEEL','SMEEL','SNEEL','SPEEL'],
3: ['OOL','BOOL','BROOL','DOOL','DROOL','DWOOL','GOOL',
'GNOOL','GROOL','HOOL','KROOL','KWOOL','POOL',
'PROOL','SOOL','SCHOOL','SMOOL','SNOOL','SPOOL'],
4: ['UIL','BUIL','BRUIL','DUIL','DRUIL','DWUIL','GUIL',
'GNUIL','GRUIL','HUIL','KRUIL','KWUIL','PUIL',
'PRUIL','SUIL','SCHUIL','SMUIL','SNUIL','SPUIL'],
}
COLORS = {1: 'RED', 2: 'GREEN', 3: 'BLUE', 4: 'BLACK'}
# 8 Richtungen: N, NE, E, SE, S, SW, W, NW
DIRECTIONS = [(-1,0),(-1,1),(0,1),(1,1),(1,0),(1,-1),(0,-1),(-1,-1)]
COLS, ROWS = 49, 14
FILL_MIN, FILL_MAX = 0.10, 0.20
CHAIN_MIN, CHAIN_MAX = 1, 8
def generate():
grid = [[None]*COLS for _ in range(ROWS)]
total = COLS * ROWS
target = random.randint(int(total*FILL_MIN), int(total*FILL_MAX))
placed = 0
while placed < target:
cat = random.choice(list(CATEGORIES.keys()))
r, c = random.randint(0, ROWS-1), random.randint(0, COLS-1)
if grid[r][c] is not None:
continue
dr, dc = random.choice(DIRECTIONS)
chain_len = random.randint(CHAIN_MIN, CHAIN_MAX)
for _ in range(chain_len):
if 0 <= r < ROWS and 0 <= c < COLS and grid[r][c] is None:
word = random.choice(CATEGORIES[cat])
grid[r][c] = (word, COLORS[cat])
placed += 1
r, c = r + dr, c + dc
else:
break
if placed >= target:
break
for row in grid:
line = []
for cell in row:
if cell:
line.append(f"{cell[0]:>8}")
else:
line.append(' ' * 8)
print(''.join(line))
generate()
const CATEGORIES = [
['AAL','BAAL','BRAAL','DAAL','DRAAL','DWAAL','GAAL',
'GNAAL','GRAAL','HAAL','KRAAL','KWAAL','PAAL',
'PRAAL','SAAL','SCHAAL','SMAAL','SNAAL','SPAAL'],
['EEL','BEEL','BREEL','DEEL','DREEL','DWEEL','GEEL',
'GNEEL','GREEL','HEEL','KREEL','KWEEL','PEEL',
'PREEL','SEEL','SCHEEL','SMEEL','SNEEL','SPEEL'],
['OOL','BOOL','BROOL','DOOL','DROOL','DWOOL','GOOL',
'GNOOL','GROOL','HOOL','KROOL','KWOOL','POOL',
'PROOL','SOOL','SCHOOL','SMOOL','SNOOL','SPOOL'],
['UIL','BUIL','BRUIL','DUIL','DRUIL','DWUIL','GUIL',
'GNUIL','GRUIL','HUIL','KRUIL','KWUIL','PUIL',
'PRUIL','SUIL','SCHUIL','SMUIL','SNUIL','SPUIL'],
];
const COLORS = ['#c0392b', '#27ae60', '#2980b9', '#c8c8c8'];
// 8 directions: N, NE, E, SE, S, SW, W, NW
const DIRS = [[-1,0],[-1,1],[0,1],[1,1],[1,0],[1,-1],[0,-1],[-1,-1]];
const COLS = 49, ROWS = 14;
const FILL_MIN = 0.10, FILL_MAX = 0.20;
const CHAIN_MIN = 1, CHAIN_MAX = 8;
function pick(arr) {
return arr[Math.floor(Math.random() * arr.length)];
}
function generate() {
const grid = Array.from({ length: ROWS }, () =>
Array.from({ length: COLS }, () => null)
);
const total = COLS * ROWS;
const target = Math.floor(
FILL_MIN * total + Math.random() * (FILL_MAX - FILL_MIN) * total
);
let placed = 0;
while (placed < target) {
const cat = Math.floor(Math.random() * CATEGORIES.length);
let r = Math.floor(Math.random() * ROWS);
let c = Math.floor(Math.random() * COLS);
if (grid[r][c] !== null) continue;
const [dr, dc] = pick(DIRS);
const chainLen = CHAIN_MIN +
Math.floor(Math.random() * (CHAIN_MAX - CHAIN_MIN + 1));
for (let i = 0; i < chainLen; i++) {
if (r < 0 || r >= ROWS || c < 0 || c >= COLS) break;
if (grid[r][c] !== null) break;
grid[r][c] = { word: pick(CATEGORIES[cat]), color: COLORS[cat] };
placed++;
r += dr;
c += dc;
}
if (placed >= target) break;
}
return grid;
}