NOTATIONAL RUIN (2026)

(procedural score, then degradation)
Doc. ref: HK-NOTATIONAL-RUIN-2026
Category
Generative & Visual
Medium
C++20, AppKit, no third-party dependencies
Venue
gitlab.com/closestfriend/notational-ruin
State
complete
Tags
c++, generative, notation

Given a seed and a parameter set, the program generates an abstract graphic musical score as vector data, writes it as a clean SVG and a grayscale raster, then runs the raster through a fixed-order degradation pipeline and writes the result as PNG. A command-line tool and a native AppKit GUI are built on the same core library.

Score generation forks into a clean SVG and a raster that is then run through the fixed-order degradation chain.
Score generation forks into a clean SVG and a raster that is then run through the fixed-order degradation chain.

Score generation lays out a series of five-line staff systems, each line shaped by a sine term scaled by a chaos parameter plus per-line random drift, with an independent probability of breaking off early. Each staff carries a note cluster sized by a density parameter — triangular noteheads with stems, occasional articulation dots and connectors — plus annotation marks: rests, arcs, brackets, boxes, arrows, circles, rehearsal marks, numbers, durations, instructions. Text marks are not rendered as glyphs. They are drawn as runs of vertical tick strokes sized to the character count, standing in for typography rather than approximating it.

The degradation pipeline runs in a fixed order: nearest-neighbor downsample, box blur, per-pixel noise from a deterministic integer hash of coordinates and seed, threshold (flat, or spatially varying if threshold-variation is nonzero), erosion, dilation, then a loop of photocopy generations each re-applying blur, noise, and threshold, and finally a nearest-neighbor upscale back to full size, which is what produces the blocky stair-stepped edges. Blur precedes threshold deliberately: it turns gray edges into hard black or white regions, so nearby lines fuse, thin stems vanish, and noteheads merge into staffs.

There are no third-party dependencies, including for PNG output. The encoder is hand-written, emitting a valid zlib stream using stored uncompressed DEFLATE blocks with a correct Adler-32 checksum inside properly CRC’d chunks. Files are therefore essentially raw bitmap size. The SVG output is always the clean geometry; degradation applies only to the raster path.

Last updated: 2026.09.03 20:20:09 UTCHnshokrian@gmail.com