Skip to content

Spark

A discharge is three things at once: a blast, a pinch, and a jag. The spark strike composes them from operators the engine already trusts. The blast is the drop — radial outflow is divergence itself, no stream function produces it, and the oldest operator here expands a disk exactly while conserving the area around it. The pinch is the viscous multipole burst, its ejection lobes along the note’s axis. The jag is this page’s operator: the spark shear.

Shears invert for any profile. In the frame of the strike, one step of the shear slides every row by an amount that depends only on the row, then every column by an amount that depends only on the column:

x1=x+A w(y) f(y),y1=y+B w(x1) f(x1).x_1 = x + A\,w(y)\,f(y),\qquad y_1 = y + B\,w(x_1)\,f(x_1).

Whatever ff is — a triangle wave, a sawtooth, noise — x′=x+g(y)x' = x + g(y) inverts as x=x′−g(y)x = x' - g(y), so each stage is exact and the kinks of ff become creases in the ink, legally. That is the dielectric aesthetic, at no cost in area. The profile is a stack of triangle waves at kk, 2k2k, 4k4k with halving weights (the depth is a parameter), or piecewise-linear noise from an integer hash; ww is a window across each shear, twice the strike radius wide, so the streamers run along and across the axis. The step’s exact inverse is the second stage undone first: reversed order and negated — a sign flip alone is not, because crossed shears do not commute.

The kick decays. A strike spends its shear as A,B∝e−t/τA, B \propto e^{-t/\tau} over four time constants, dealt out in kick-drift steps whenever the pending kick reaches the field’s own quantum. Each step is exact, the composition is exact, and the figure it draws depends on how it was dealt — that is the operator’s texture, bounded below by the quantum and above by the frame. The wavenumber is a control: a thick channel at one end, fine streamers at the other, and under Anod the slide (CC 74) drives it.

Two clusters, then two strikes: A shows the composition up to the chosen stage — the drop, then with the burst, then the whole spark — and B the whole spark a quarter turn on. r is the strike radius, D the burst's lobe displacement, A the shear kick (both of r), k the streamer frequency, τ the decay, n the octaves, f the profile, θ₀ the axis.open full size ↗

Under the Anod medium every note-on is this composition, with one number deciding its size: the charge. A Sumi drop at the same velocity has the radius rsr_s; the Anod strike’s charge is r=rs⋅r = r_s \cdot Strike charge (anod_drop, 0.1–1, default 0.57), and the whole spark is cut to it — the drop of radius rr, a burst of core 0.3 r0.3\,r with the order from Order (burst_order), and the shear episode with the charge as its band and kick base. The default 0.57 is the Z-key spark’s 0.05 at the velocity-100 drop. It was measured, not chosen: a composition on thin threads at a third of the Sumi radius vanished on a lossy mobile GPU (the Adreno’s shader arithmetic erodes what a half-float field holds near a quantum), while the classic spark on its charge survives on every device the project runs on — six strikes stay six charges on the Tab and on the desktop alike. The streamers are thicker and shorter for it; Strike charge and Shear are the player’s to retune.

  • The shear is exact, for any profile. On the desktop harness a step of fifteen-texel kicks moves the interior pre-image seven texels; the step then its inverse leaves a fifth of a texel (the resampler’s, at the kinks) for the triangle stack and a hundredth for the noise profile; the same-order sign flip leaves six texels and is not an inverse. A single stage moves no row in yy and slides each row rigidly.
  • The composition is sub-stepped by inheritance. The drop and the shears are exact; the burst is area-preserving to first order, so the spark takes the strictest member’s class and gates under the burst’s numbers. Its pre-image Jacobian, read outside the drop’s rim, stays first-order.
  • The episodes end. The shear’s kick sums to A(1−e−4)A(1 - e^{-4}) exactly and the episode is over at 4τ4\tau; the burst’s age envelope is its own page’s.
  • The ingress rule applies to every stage, as to the ripple.
  • A charge smaller than the Sumi drop. The headless gesture test reads the Anod tap’s charge at 1126 texels against the Sumi drop’s 2966 at the default 0.57.
  • sumi_add_spark(x, y, r, D, θ₀, layer) — the strike: the drop (ink or clear water, as sumi_add_drop), the burst of core rr and lobe displacement DD along θ0\theta_0, the shear episode along and across it. The Marble-mode tap and the mapper’s note-on strike both call it under Anod.
  • sumi_add_spark_shear(x, y, band, A, B, k, φ, θ₀) — one step of the shear alone; a zero amplitude skips its stage, so the inverse of (A,B)(A, B) is the call (0,−B)(0, -B) then the call (−A,0)(-A, 0).
  • The knobs: Shear (spark_shear, the kick as a fraction of the radius), Decay (spark_tau), Octaves (spark_stack), the profile (triangle or noise), Frequency (k) (CC 108 on the desktop; the slide CC 74 under Slide → Spark frequency, the Anod default), and Strike charge (anod_drop).

The shear is the ripple’s family with a jagged profile — the tine and the ripple were the engine’s first exact shears, and the Chladni lattice its first kick-drift pair; the observation that a shear needs no smoothness to invert is what lets the creases in. The blast is Jaffer’s √-form drop; the lobes are the multipole burst, Jaffer’s method extended; the composition is the medium’s own idea of a strike.

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