Interruptions (2026): token metadata, presets and measurements
Read 2026-10-15 from harm.work/nft/interruptions, from the program at interruptions.harm.work (/api/programs, /api/preset-rules, and the compiled page script), and from the five token images. Wiki page: Interruptions.
Collection
| Field | Value |
|---|---|
| Title | Interruptions (symbol ∠) |
| Tokens | 5, unique, fully on-chain |
| Contract | 0x78f2805ffbd0722ec67136c46e475e7cc8998b8c (Ethereum mainnet) |
| Created | 2026-10-11 |
| Owner at reading | harmvandendorpel.eth (all five, not listed) |
| Viewer | https://interruptions.harm.work/[id], program version 2.01 |
| ID | Name | Image (harm.work API, 2000 × 2000 px) | Copy in wiki |
|---|---|---|---|
| 1 | Peer Pressure | https://harm.work/api/image/7284923db951e62f30aa1a8854f105256233ed50.png | /images/interruptions-peer-pressure.png |
| 2 | Interruptions | https://harm.work/api/image/54fb1221d4e0855e5de47b96dee26cea6aa0bd1a.png | /images/interruptions-interruptions.png |
| 3 | Monochrome | https://harm.work/api/image/b768bd6f6fee69bc15bb80bab25e8f16e8d8d78a.png | /images/interruptions-monochrome.png |
| 4 | Projection | https://harm.work/api/image/34377d88fde80f338076410777c126db249a0525.png | /images/interruptions-projection.png |
| 5 | Nocturne | https://harm.work/api/image/cfac06afde088ea85c5b092e800a0e62ef3b8b01.png | /images/interruptions-nocturne.png |
The same five files are served as https://interruptions.harm.work/meta/01.png … 05.png (identical checksums). The collection cover image is the Monochrome image.
Collection text (verbatim)
Five unique, fully on-chain NFTs.
The series builds on Vera Molnár's Interruptions (begun in the late 1960s): a field of short parallel line segments from which Molnár removed segments at random, opening voids in an otherwise regular grid. Here that field is handed to my "Stained Unravel" algorithm. Segments are compared against their neighbours rotation, touching segments merge into groups that share one colour, and a segment's colour shifts the longer it keeps its orientation.
The configuration moves between two registers: every cell reads as a stamped ornament, close to Truchet tiling or to a woven repeat. In the other the individual segments flow into their neighbours and the field organises into streams, fans, the way iron filings settle on a magnetic field or a fluid solver resolves into streamlines. A grid of discrete local rules, run fine enough, approximates what a differential equation describes.
Teaser: "Collection of 5 unique, fully on-chain NFTs, building upon the work "Interruptions" by Vera Molnár, paired with my Stained Unravel algorithm."
Token descriptions on harm.work (verbatim)
- Peer Pressure: "The successor to "Pression des pairs" (2024), a generative animation after Vera Molnár's "Quatre éléments distribués au hasard" (1959)."
- Interruptions: "Colour enters. Red, blue, green, magenta and orange segments sit on white, each colour marking how long a segment has kept its orientation. The merged groups are now legible as bands and whorls rather than as changes in density alone."
- Monochrome: "The inversion, black on white, with the density let out. Large voids open in the upper half and the field thins toward the corners. Of the five, this one stands closest to Molnár's own sheets."
- Projection: "White segments on black, packed so densely that the interruptions almost close. Where the orientation bends, the packing produces moiré. Especially suitable for projection."
- Nocturne: "The same palette on black. The field is sparser, so the long diagonals read as single strokes crossing the whole sheet, and the dense areas curl into fans. What was texture in the white works becomes drawing here."
Where the descriptions disagree with the presets and images
The descriptions read as if written for an earlier order or an earlier set of palettes. Against the presets and the measurements below:
- Interruptions: three of its four gradients have identical start and end colours, and the fourth moves from rgb(30,138,0) to rgb(9,133,0). Colour in this token marks group membership; it does not record how long a segment has kept its orientation. Magenta and orange do appear (9.4 % and 5.5 % of saturated pixels) but are not in the palette; see Measurements.
- Interruptions "Colour enters": token 1, Peer Pressure, is already in seven colours.
- Monochrome "The inversion": the preset it inverts is Projection, token 4, which comes after it.
- Nocturne "The same palette on black": no other token has Nocturne's palette.
- The image-level observations (voids in Monochrome's upper half, near-closed packing in Projection, long diagonals and fans in Nocturne) agree with the images and with the coverage figures below.
The five presets (verbatim from /api/programs)
{"name":"Peer Pressure","gradients":[[[206,215,137],[253,253,84]],[[232,232,232],[198,229,168]],[[250,0,229],[232,51,245]],[[36,0,0],[0,0,0]],[[240,244,255],[255,255,255]],[[255,0,0],[190,39,27]],[[0,85,255],[0,8,255]]],"background":[144,144,144],"settings":{"fps":90,"shapeMorphSpeed":0.005,"postSaturationBoost":1.2,"transitionSpeedDiv":25,"fadeSpeed":0.01,"colourEasing":100,"ageColourShift":600,"automatonChange":44,"columnsDivisor":12,"presetRandomRatio":0},"disabledRuleIndices":[]}
{"name":"Interruptions","gradients":[[[0,0,255],[0,0,255]],[[255,0,0],[255,0,0]],[[0,0,0],[0,0,0]],[[30,138,0],[9,133,0]]],"background":[255,255,255],"settings":{"fps":60,"shapeMorphSpeed":0.01,"postSaturationBoost":1,"transitionSpeedDiv":25,"fadeSpeed":0.01,"colourEasing":100,"ageColourShift":600,"automatonChange":10,"columnsDivisor":8,"presetRandomRatio":1},"disabledRuleIndices":[]}
{"name":"Monochrome","gradients":[[[0,0,0],[0,0,0]]],"background":[255,255,255],"settings":{"fps":30,"shapeMorphSpeed":0.01,"postSaturationBoost":1.5,"transitionSpeedDiv":25,"fadeSpeed":0.01,"colourEasing":100,"ageColourShift":600,"automatonChange":10,"columnsDivisor":7,"presetRandomRatio":0.5},"disabledRuleIndices":[]}
{"name":"Projection","gradients":[[[255,255,255],[255,255,255]]],"background":[0,0,0],"settings":{"fps":30,"shapeMorphSpeed":0.01,"postSaturationBoost":1.5,"transitionSpeedDiv":25,"fadeSpeed":0.01,"colourEasing":100,"ageColourShift":600,"automatonChange":10,"columnsDivisor":7,"presetRandomRatio":0.5},"disabledRuleIndices":[]}
{"name":"Nocturne","gradients":[[[175,82,0],[173,0,0]],[[255,255,85],[0,173,0]],[[0,0,173],[82,82,255]],[[255,82,255],[173,0,173]],[[255,255,255],[255,255,255]],[[173,173,173],[82,82,82]]],"background":[0,0,0],"settings":{"fps":45,"shapeMorphSpeed":0.01,"postSaturationBoost":1.5,"transitionSpeedDiv":25,"fadeSpeed":0.01,"colourEasing":100,"ageColourShift":600,"automatonChange":10,"columnsDivisor":12,"presetRandomRatio":0}}
No preset disables any of the 165 curated rule-sets.
Settings converted to a 60 Hz screen
fps is the rate the timing is written for. The program measures the real frame rate and scales every per-frame step by target ÷ measured, as in Stained Unravel (see sources/ingested/stained-unravel-blockade-token.md).
| Token | Ground | Gradients | Rule source (presetRandomRatio) | columnsDivisor | Automaton steps/s | New rule-set at least every | Quarter turn of a line | Rest time to end of gradient | Colour easing lag | Saturation boost |
|---|---|---|---|---|---|---|---|---|---|---|
| Peer Pressure | 144,144,144 | 7 | curated only (0) | 12 | 7.5 | 33 s | 0.87 s | 1.7 s | 1.1 s | 1.2 |
| Interruptions | 255,255,255 | 4 (3 flat) | random only (1) | 8 | 20 | 12.5 s | 0.65 s | 2.5 s | 1.7 s | 1 |
| Monochrome | 255,255,255 | 1 flat | half and half (0.5) | 7 | 10 | 25 s | 1.3 s | none | none | 1.5 |
| Projection | 0,0,0 | 1 flat | half and half (0.5) | 7 | 10 | 25 s | 1.3 s | none | none | 1.5 |
| Nocturne | 0,0,0 | 6 (1 flat) | curated only (0) | 12 | 15 | 17 s | 0.87 s | 3.3 s | 2.2 s | 1.5 |
How each column follows from the code:
- Steps/s: a counter grows by 4 × target ÷ measured per frame; an automaton step runs when it passes
automatonChange, and the counter resets. - Rule-sets are replaced after 250 steps, or earlier when fewer than 0.02 % of cells changed kind in a step.
- Rotation speed is 4 ×
shapeMorphSpeed×fpsradians per second (1.8, 2.4, 1.2, 1.2, 1.8). A freely spinning cell turns at half that rate. - The rest counter grows by the same 4 × target ÷ measured per frame and reaches the end of the gradient at
ageColourShift(600). - The displayed colour moves 1 ÷ (
colourEasing× target ÷ measured) of the remaining distance per frame. columnsDivisoris the cell width in CSS pixels; the number of columns is the screen width divided by it. Pression des pairs (2024) uses 24 or 32 columns regardless of screen size.transitionSpeedDivandfadeSpeedare set but not read in this build.
The cell, from the code
Each cell draws one straight band (a line segment) with a centre, an angle, a length and a colour. Line thickness is 0.2556 of the cell width. Angles are taken modulo 180°, since a line has no head or tail.
| Kind | Name in this file | Target |
|---|---|---|
| 0 | empty | length 0; the segment shrinks away |
| 1 | diagonal \ | 45°, length √2 + 0.2556 cell, so it overlaps its diagonal neighbour at the corner |
| 2 | diagonal / | 135°, same length |
| 3 | horizontal | 0°, length 1 cell, so it abuts its neighbours end to end |
| 4 | vertical | 90°, length 1 cell |
| 5 | spinning | rotates continuously in one direction at half the normal speed; direction kept from its last turn, or random |
| 6 | stuck | turns to a random angle between 0° and 180° and stays there |
| 7 | following | every frame, turns toward the mean orientation of its six neighbours |
| 8 | following and linking | as 7, and also links end to end with an aligned neighbour (see Grouping) |
Neighbour mean. The six neighbours are (0,−1), (0,1), (−1,0), (1,0), (−1,−1) and (1,1) as (column, row) offsets, rows counting downward: above, below, left, right, top-left and bottom-right. This is the six-cell neighbourhood of a hexagonal grid laid onto the square grid. Neighbours of length zero are skipped. Each neighbour angle θ is doubled, the vectors (cos 2θ, sin 2θ) are summed, and the target is half the angle of the sum. A cell's length follows its angle so that the segment fits the cell.
State changes. An automaton step proposes a kind for every cell from the active rule-set (first matching rule wins; otherwise the cell keeps its kind). A cell adopts a proposed kind only after the same kind has been proposed three steps in a row. At every step one randomly chosen cell is overwritten with a random kind.
Grouping. Touching segments are flood-filled into groups: a diagonal joins the same diagonal continuing along its line; \ and / join where their ends meet in a chevron; horizontals join horizontals left and right; verticals join verticals above and below. A kind-8 cell also looks along its own line, within 30°, at its eight neighbours, and links to one whose angle lies within 30° of its own (20° if the neighbour is kind 1–4). Each end takes at most one link, best-aligned first. Linked cells join one group.
Colour. A group's colour is the palette entry at the group's index modulo the palette length; the index is the position of the cell the flood fill started from. A cell commits to a new group colour only after the same colour has been proposed for three steps. While a cell is at rest (not turning or changing length), its displayed colour eases toward a point on its gradient set by how long it has rested. Kinds 5, 6 and 7 are exempt from this, and a moving cell's colour does not update. When the palette is a single gradient with equal ends, the program logs "Monochrome mode" and skips colour fading, the colour gate and the group flood fill.
Rendering. WebGL, drawn into a buffer at twice the device resolution and box-downsampled. A post pass stretches the luminance range of the cell colours (inset by 10 % at each end, eased over frames) to full range and multiplies saturation by postSaturationBoost.
The 165 curated rule-sets
Families by name in the code: P (5), n1, cloud, nucleate (5), self (11), weave (5), collide (9), stroke, erode (8), evolve (28), sym-… (19, symmetry: tr, my, r4, at, mx, om), avg (23), fuzz (24), avgfuzz (25). A rule-set has 1–19 rules (median 6); a rule has 0–5 conditions (median 2), each naming one neighbour offset (up to 5 cells away) and the kind it must have.
Share of all rule results, by kind: empty 13.4 %, \ 17.3 %, / 19.5 %, horizontal 14.5 %, vertical 13.5 %, spinning 1.1 %, stuck 0.8 %, following 8.6 %, following and linking 11.2 %.
84 rule-sets can produce a following cell (kind 7 or 8); 81 cannot. 14 can produce a spinning cell, 10 a stuck one. Following cells come almost entirely from three families:
| Family | Sets | Following (7, 8) | Empty | Diagonal | Horizontal/vertical | Spinning | Stuck |
|---|---|---|---|---|---|---|---|
| avgfuzz | 25 | 42.9 % | 11.8 % | 29.5 % | 14.6 % | 0.6 % | 0.6 % |
| avg | 23 | 22.7 % | 12.4 % | 36.6 % | 25.8 % | 1.0 % | 1.5 % |
| fuzz | 24 | 21.6 % | 16.7 % | 40.5 % | 20.7 % | 0.5 % | 0 |
| evolve | 28 | 1.9 % | 6.4 % | 42.9 % | 46.2 % | 1.9 % | 0.6 % |
| sym-… (all) | 19 | 0 | 22.9 % | 41.7 % | 35.4 % | 0 | 0 |
cloud, verbatim, makes every cell follow: {"name":"cloud","rules":[{"conditions":[],"result":7}]}
A random rule-set has 3–15 rules with 1–4 conditions each, offsets within two cells. Results are drawn as round(random × 8), so kinds 0 and 8 come up with probability 1/16 and kinds 1–7 with 1/8: following cells 18.75 % of results, spinning 12.5 %, stuck 12.5 %, empty 6.25 %.
Measurements of the token images
Run on the 2000 × 2000 px token images with throwaway scripts in tmp/ (sharp). The images are single frames of animations; another frame of the same token would measure differently.
Ink coverage (pixels differing from the ground colour by more than 60 summed RGB units): Peer Pressure 14.9 %, Interruptions 42.5 %, Monochrome 34.5 %, Projection 52.4 %, Nocturne 29.4 %.
Stroke orientation (gradient magnitude binned into four directions):
| Token | Horizontal | \ | Vertical | / |
|---|---|---|---|---|
| Peer Pressure | 8 % | 38 % | 7 % | 47 % |
| Interruptions | 23 % | 28 % | 23 % | 27 % |
| Monochrome | 10 % | 24 % | 35 % | 31 % |
| Projection | 22 % | 11 % | 8 % | 59 % |
| Nocturne | 21 % | 31 % | 34 % | 14 % |
Hue shares of saturated pixels (max − min channel > 0.5):
| Token | Red | Orange | Yellow | Green | Blue | Violet | Magenta |
|---|---|---|---|---|---|---|---|
| Peer Pressure | 36.1 % | 1.4 % | 19.3 % | 0 | 16.8 % | 1.1 % | 25.4 % |
| Interruptions | 24.7 % | 5.5 % | 1.3 % | 21.2 % | 31.8 % | 6.1 % | 9.4 % |
| Nocturne | 21.9 % | 1.1 % | 0.5 % | 20.8 % | 22.1 % | 7.7 % | 25.9 % |
Peer Pressure's pale green and khaki fall below the saturation threshold.
Off-palette segments in Interruptions. The most common rendered colours are white, rgb(0,0,255), rgb(255,0,0), black and a green binned at rgb(0–32,255,0); the stored green rgb(30,138,0) is lifted by the post-pass level stretch. Orange, violet and magenta are not in the palette. To test whether they are blended edges or whole segments, the share of each hue's pixels whose eight neighbours share the hue was counted: red 28.0 %, blue 27.7 %, green 26.2 %, magenta 23.6 %, orange 21.6 %, violet 20.6 %. Edge blends would score near zero. They are whole segments, consistent with segments easing from one group colour to another (red to blue passes through violet and magenta, red to green through orange) with the level stretch saturating the mixtures.
Predecessor: Pression des pairs (2024), Software Editions #80
Read 2026-10-15 from harm.work/nft/software-editions/80 and its animation at https://harm.work/pression-des-pairs/index.html.
| Field | Value |
|---|---|
| Token | #80, contract 0x7aac5d6bef76ec70c899f47753795d60029185f6, edition 1 / 3 + 1 AP |
| Created | April 2024 |
| Platform | DAM Gallery |
| Image | https://harm.work/api/image/adfe9a5d36ad749e02ceccb1e17c98a413dc1e5f.png, 1986 × 1982 px (same file as https://t.harm.work/images/pdp-01.png); copy at /images/pression-des-pairs-80.png |
Description (verbatim):
By Harm van den Dorpel, 2024 - Edition 1 / 3 + 1 AP
Generative animation inspired by the work "Quatre éléments distribués au hasard" by Vera Molnár from 1959.
"Pression des pairs" is french for "peer pressure". Each cell its rotation is based on the configurations of its neighbouring cells (its peers). This algorithm could be described as a combination of a cellular automata and a Markov chain.
The grid is reconfigured in intervals, and scans from top left to bottom right, referring to the process of weaving, or writing text. Each time rotation completes, connecting cells take on one similar colour, creating groups.
From the code:
- Grid of 24 columns, or 32 when the screen is wider than 1.2 : 1. Grey ground rgb(127,127,127). Line width about a quarter of the cell.
- Five kinds, all orientations, no empty state: kinds 0 and 4 horizontal (about 1.1 cells long), 2 vertical (same), 1 and 3 the two diagonals (about 1.6 cells).
- Each new kind is drawn by weighted chance from a rule matched against four cells already written: two to the left, one above, one above-right. Weights per outcome are 0, 1, 10 or 100. Rule tables are generated from a hashed random seed.
- The grid is rewritten two cells per frame in reading order. A cell's group colour is applied when its rotation completes. Groups are flood-filled through lines that continue one another (a diagonal along its diagonal, a vertical downward, a horizontal to the right) and where the two diagonals meet.
- Palette: two to seven colours drawn per load from a base of six: rgb(0,0,0), rgb(255,255,255), rgb(192,232,162), rgb(255,0,0), rgb(255,255,0), rgb(255,0,255).
- The neighbours set the odds of a cell's next orientation. No cell reads a neighbour's angle.