H

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

FieldValue
TitleInterruptions (symbol ∠)
Tokens5, unique, fully on-chain
Contract0x78f2805ffbd0722ec67136c46e475e7cc8998b8c (Ethereum mainnet)
Created2026-10-11
Owner at readingharmvandendorpel.eth (all five, not listed)
Viewerhttps://interruptions.harm.work/[id], program version 2.01
IDNameImage (harm.work API, 2000 × 2000 px)Copy in wiki
1Peer Pressurehttps://harm.work/api/image/7284923db951e62f30aa1a8854f105256233ed50.png/images/interruptions-peer-pressure.png
2Interruptionshttps://harm.work/api/image/54fb1221d4e0855e5de47b96dee26cea6aa0bd1a.png/images/interruptions-interruptions.png
3Monochromehttps://harm.work/api/image/b768bd6f6fee69bc15bb80bab25e8f16e8d8d78a.png/images/interruptions-monochrome.png
4Projectionhttps://harm.work/api/image/34377d88fde80f338076410777c126db249a0525.png/images/interruptions-projection.png
5Nocturnehttps://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)

  1. 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)."
  2. 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."
  3. 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."
  4. 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."
  5. 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:

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).

TokenGroundGradientsRule source (presetRandomRatio)columnsDivisorAutomaton steps/sNew rule-set at least everyQuarter turn of a lineRest time to end of gradientColour easing lagSaturation boost
Peer Pressure144,144,1447curated only (0)127.533 s0.87 s1.7 s1.1 s1.2
Interruptions255,255,2554 (3 flat)random only (1)82012.5 s0.65 s2.5 s1.7 s1
Monochrome255,255,2551 flathalf and half (0.5)71025 s1.3 snonenone1.5
Projection0,0,01 flathalf and half (0.5)71025 s1.3 snonenone1.5
Nocturne0,0,06 (1 flat)curated only (0)121517 s0.87 s3.3 s2.2 s1.5

How each column follows from the code:

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.

KindName in this fileTarget
0emptylength 0; the segment shrinks away
1diagonal \45°, length √2 + 0.2556 cell, so it overlaps its diagonal neighbour at the corner
2diagonal /135°, same length
3horizontal0°, length 1 cell, so it abuts its neighbours end to end
4vertical90°, length 1 cell
5spinningrotates continuously in one direction at half the normal speed; direction kept from its last turn, or random
6stuckturns to a random angle between 0° and 180° and stays there
7followingevery frame, turns toward the mean orientation of its six neighbours
8following and linkingas 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:

FamilySetsFollowing (7, 8)EmptyDiagonalHorizontal/verticalSpinningStuck
avgfuzz2542.9 %11.8 %29.5 %14.6 %0.6 %0.6 %
avg2322.7 %12.4 %36.6 %25.8 %1.0 %1.5 %
fuzz2421.6 %16.7 %40.5 %20.7 %0.5 %0
evolve281.9 %6.4 %42.9 %46.2 %1.9 %0.6 %
sym-… (all)19022.9 %41.7 %35.4 %00

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):

TokenHorizontal\Vertical/
Peer Pressure8 %38 %7 %47 %
Interruptions23 %28 %23 %27 %
Monochrome10 %24 %35 %31 %
Projection22 %11 %8 %59 %
Nocturne21 %31 %34 %14 %

Hue shares of saturated pixels (max − min channel > 0.5):

TokenRedOrangeYellowGreenBlueVioletMagenta
Peer Pressure36.1 %1.4 %19.3 %016.8 %1.1 %25.4 %
Interruptions24.7 %5.5 %1.3 %21.2 %31.8 %6.1 %9.4 %
Nocturne21.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.

FieldValue
Token#80, contract 0x7aac5d6bef76ec70c899f47753795d60029185f6, edition 1 / 3 + 1 AP
CreatedApril 2024
PlatformDAM Gallery
Imagehttps://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: