Skip to content

Ripple

The traditional waved comb displaces each line of the bath sideways by a sine of its position. In the ripple frame (rotatable by ripple_angle):

xsrc=x−A sin⁡(k y+φ),ysrc=y.x_{src} = x - A\,\sin(k\,y + \varphi),\qquad y_{src} = y .
A = amount (CC 102), ramped in so the shear is seen growing; k = wavelength (CC 103), φ = the frame angle; b switches live shimmer (0) to a baked pass (1).open full size ↗
  • A pure shear. Each horizontal line translates rigidly; the Jacobian is 1 identically at any amplitude, so the map never folds and is never sub-stepped.
  • A commutative group at fixed (k,φ)(k, \varphi). Applying ΔA\Delta A per frame composes additively, so an LFO that breathes AA up and back to zero leaves the field bitwise unchanged. Changing kk or φ\varphi between passes breaks commutativity and bakes residue in — and that residue is marbling, the waved-comb feathering. The boundary is deliberate and documented.
  • Two insertion points, one switch (ripple_bake). Live (0): the ripple displaces the ink sampling coordinate at composite time — a view effect; nothing accumulates, the water shimmers and stills. Bake (1): a real deformation pass, delta-driven like the pinch. The washi grain never ripples (paper is screen-locked) and the paper dip always samples the un-rippled field — the print is what touches the water; the shimmer is surface motion.
The same ramp with b = 1, baked: each step is a real deformation pass, delta-driven, and the comb stays in the ink — drag A back to 0 and the live shimmer above would still; this one keeps what it laid down.open full size ↗
  • Per-note pitch bend with bend_mode = 1. The intent is subtle vibrato: a note’s bend wobble shimmers the water instead of wiggling its drop. The drop holds; one consumer owns the note bend, and the switch is clean both ways (the glide target is untouched in mode 1, so switching back never emits a stale-delta tine). The master bend keeps its shear tine in both modes.
  • The amount is the bend’s distance from centre: A=∣semitones∣/6A = |\text{semitones}| / 6, clamped — a ±0.5-semitone vibrato breathes about 8 %; last-writer-wins across voices, smoothed like every global control. So the water stills itself: bend re-centres → amount 0; the last note releases → amount 0; a 1→0 mode flip zeroes the residual.
  • Bend-driven bake is permanent by design. The emitted pass phase drifts with activity (φ+=∣ΔA∣/Amax⋅1.5\varphi \mathrel{+}= |\Delta A| / A_{max} \cdot 1.5 rad, wrapped), so an excursion never retraces exactly: each vibrato cycle lays a slightly shifted comb, a feathered record that accumulates like glide tines, while the dynamic still stills. CC-driven bake keeps φ\varphi fixed — the pure composing-back property, preserved for the regression gate.
  • CC 102 / CC 103 — an external amount handle (sharing the slot, last-writer-wins) and the wavelength, a flavour control resting mid-range; the strip’s assignable wheels and the desktop’s settings window take them. On the tablets the Ripple toggle selects bend_mode = 1 and ripple_bake = 1 together; desktop keeps a manual live/bake override.

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