Drop
A drop of radius falls at centre . Everything already on the water is pushed outward so that the area it occupies is conserved: a ring at distance from the centre moves to . The inverse lookup the shader evaluates, for points outside the new drop, is
and for the pass writes the new ink phase and the local radial coordinate directly — the fresh ink, not a lookup.
Invariants
Section titled “Invariants”- Exact and area-preserving. The map is a closed form; there is no step size and nothing to sub-step. The area displaced outward is exactly , which is what makes concentric drops read as rings of equal area, thinner as they go out — the suminagashi look.
- Strike → radius ∝ √velocity. Perceptual scaling: ink area tracks velocity, so a doubled velocity doubles the splash, not the diameter.
- Ink phase in parity form. The texel stores , water = 0. Any two field values interpolate across at most one band threshold, so half-float filtering never speckles a seam however many drops fall. The hue selector rides in the fourth channel from the drop counter, which re-bases on every paper dip.
Ownership
Section titled “Ownership”-
Strike (Note On) on every layout — the drop at the note’s position, or at all three echo rows on Jankó.
-
Pressure feed (channel pressure with
press_mode = 0, the default): while pressure > 0 the voice’s drop keeps growing. Because a centre expansion of radius moves an existing boundary only to , fixed steps would visibly stall; the voice tracks its nominal boundary and converts the wanted growth into the emitted pass radius . Same operator, physically meaningful growth rate, deliberately unbounded — sustained pressure can flood the sheet, which is the Osmose behaviour.Same operator, two behaviours. Top-left: a note re-struck five times — separate drops, rings. Bottom-right: one note held under channel pressure — one band whose boundary keeps growing, no new ring.open full size ↗ The difference is the whole point of the feed: a re-struck note lays a new ring each time (new parity, new hue), while a held note grows the ring it already owns — the expansion is emitted at the voice’s own centre with the boundary-growth radius, so the band widens instead of multiplying.
-
Breath (wind mode) uses the same conversion but relaxes toward a breath-proportional width: a twenty-second legato line stays a line.
-
Marble mode: a tap or a click. And, since v0.6, the pressure gesture: a long press (Shift + right drag with a mouse) lays a drop and then feeds it — hold or push up and the band widens by the same boundary growth; the pass is
sumi_add_dropwith the FEED layer, whose interior inherits the band already under the centre instead of laying a new ring.
In the scene
Section titled “In the scene”r is the drop radius in canvas heights; n is how many drops fall on each
cluster in turn. In the feed scene v is the strike velocity (the initial
radius), p the channel-pressure value held, t how many frames it is held.
Every scene has ⏱, the frames between steps — set it to 0 for the result
alone, raise it to watch the mathematics work.
midi-sink 2.0.0-rc.5 · AGPL-3.0 · source
