Skip to content

Anod

The engine was never fluid at heart; it is symplectic — a coordinate field deformed by exact maps. Suminagashi was its first medium, not the engine itself: the composite that reads the field as ink phase on washi. Anod is the second reading of the same field. Switch between them in the settings (Medium: Sumi, Anod) — the medium guide has the player’s side; this page is the mathematics.

Strain, not bands. Every texel of the field stores where its material came from. Finite-differencing those coordinates between neighbours gives the Jacobian JJ of the accumulated map, and for an area-preserving map with singular values λ\lambda, 1/λ1/\lambda,

∥J∥F2−2=(λ−1λ)2=σ2,\|J\|_F^2 - 2 = \left(\lambda - \tfrac{1}{\lambda}\right)^2 = \sigma^2 ,

zero for the identity and for pure rotation, positive wherever the sheet has been strained. Charged material — the ink, re-read — glows by it, g=1−e−σ/sg = 1 - e^{-\sigma/s} over a base that makes a fresh strike visible as charge, like ionized gas over near-black glass. The charge phase bands each filament between the palette’s core and halo; the aux channel drifts the hue per event. Glow scale is ss, the strain a texel needs to glow: smaller is hotter, sooner.

The glow. The discharge blooms as a photograph of it would: the emission, blurred over a few octaves (Glow bloom, Glow reach), is added back to itself and the brightest filaments clip toward white — a wide cold halo, a neon mid, a white-hot core. The glass under it is black (Glass darkness), with a screen-locked speckle (Phosphor grain). Prints and exports bloom the same.

The far field is the grid. Water carries no charge and never glows by strain. It shows the field itself: the deformed grid, iso-lines of position plus a gain times the displacement, one family per axis, drawn wherever the water has moved by more than a texel and nowhere it rests. A drop’s displacement reaches far — it falls off as a2/2ra^2/2r — so its lines reach far too: one family converges on the note, the other bulges round it, the picture of a dipole’s field, and a burst’s lobes and a spark’s jagged shears draw their own. The pitch of the grid at rest is Grid lines (anod_pitch, lines per canvas height; zero turns the grid off and leaves the water glass). The picture was first seen by accident — a half-float staircase beating against a large window drew the iso-lines of the source coordinates — and then drawn on purpose, with the accident’s gains kept because they made the picture the author chose.

Switching is live. The field is medium-agnostic, so switching re-reads the same deformation history: a marbled sheet becomes a discharge record and back, bitwise. The dip stays a key away for a fresh sheet.

A session laid down under Anod from its first strike — two clusters struck as sparks on their charge, a burst, a vortex stir, a Chirikov throw: the charge glows by its strain as it forms, the water draws its deformed grid. Set M to 0 and the same script replays as suminagashi, the strikes as drops; g is the glow scale, P the grid's rest pitch, p one of the three electric built-ins. Every other scene on this site carries the same M.open full size ↗

Under Anod every MPE dimension left at Medium default follows the medium’s table; an explicit mode or a CC route overrides it, exactly as in Sumi:

DimensionSumi defaultAnod default
strike (note-on)the drop, radius ∝ √velocitythe spark on its charge: the blast, a burst of order burst_order along the note’s axis, the jagged shears
press (channel pressure)the ink feedtorsion spent around the note, as rate
per-note bendglide (a local tine)the Chladni stir — distance the rate, sign the sense; a vibrato stirs back and forth and comes home
slide (CC 74)huethe spark’s streamer frequency
swirl (poly pressure)the Lamb–Oseen swirltunes the torsion’s wavenumber from its rest upward (and the spark’s when the slide does not own it)
mod wheel (CC 1)the vortexthe Chirikov throw

The one-consumer rule holds inside the table as everywhere: a wavenumber the bend owns, the slide owns or a CC drives is left to its owner.

Electric blue, plasma orange and phosphor green under the same three ids the sumi palettes use; a user palette is read as a glow — the gradient sampled by strain. Palettes →

  • The Sumi composite is untouched: bitwise against the 1.0.0 print fixture with the Anod branch beside it.
  • A switch leaves the field bitwise; the composite is a read.
  • The charge’s glow tracks its strain: on the harness the charged texels’ luminance correlates with 0.22+0.78(1−e−σ)0.22 + 0.78(1 - e^{-\sigma}) read off the same field by the CPU.
  • Water at rest is glass, at 512² and at 1920×1080, where the half-float coordinates round: the rounding draws no line, and a small drop’s grid reaches as far as its displacement and no further; a grid pitch of 0 leaves all water glass with the charge unchanged.
  • Not in 2.0: a long-exposure buffer — strain accumulated over time rather than read from the field’s present state — is carried with its open question (whether a discharge should remember); the glow is the field’s, now.
  • The strike survives a lossy GPU. Six velocity-100 strikes on the Tab’s Adreno keep six charges, as on the desktop — the reason the charge is the classic spark’s size and not a thread.

midi-sink 2.0.0-rc.5 · AGPL-3.0 · source