Design notes — Part XIII — v3.0, Phase 14: the new symplectic voices (steps 83–86: the Toda lattice soliton ring, the Boris–leapfrog magnetic gyroscope, the port-Hamiltonian Dirac network, the billiard — opened 2026-10-19 at step 83; folded 2026-10-25; formerly `DECISIONS_13.md`)
Opened 2026-10-19, the day Phase 13 was folded (Part XII); merged into DECISIONS.md as Part XIII at the phase’s fold. The spec is PROJECT_SPEC.md (v5) §13 with TO_PROJECT_SPEC.md §13.13–§13.14 as the phase’s draft (the proposals, corrected by each step as it ships). THE CORE IS FROZEN (step 78 to step 92): every step here is Voxo’s, libvoxo additive; a core change is a bug → regression test → fix. Every voice takes its place in the §13.1 class table with its red control, its profile and its orbit in the trace; the Poincaré strobe of step 75 is the instrument, and each voice’s strobe portrait is a gate of its own step. Numbered entries follow; DECISIONS_13 #n means this part.
#1 — Step 83: the Toda lattice soliton ring, voice_kind 10 (2026-10-19; Voxo 0.23.0, additive; evidence docs/evidence/step83)
Section titled “#1 — Step 83: the Toda lattice soliton ring, voice_kind 10 (2026-10-19; Voxo 0.23.0, additive; evidence docs/evidence/step83)”What the spec asked (ROADMAP_6.md step 83; TO_PROJECT_SPEC §13.13): N nodes on a ring under the exponential potential, symplectic Verlet at ×4 (step 78 the prerequisite), the press and CC 74 the nonlinearity, poly pressure a momentum IMPULSE (the ring conserves Σp — gate delta b), near-integrable not integrable (gate delta a: the shape gate replaces “never breaks into chaotic noise”); the gates: the soliton’s shape within 2 % over ten minutes at b_max, the lossless drift under 0.001 dB over ten minutes, no alias blow-up at full compression, the strobe portrait, the profile. What shipped is §13.13’s Toda paragraph as corrected. The decisions:
-
The state is double. The first ring, in float, held the shape but drifted 0.009 dB a minute lossless — the rounding of
q += pat 192 kHz, a random walk the gate’s 0.001 dB over ten minutes cannot absorb. In double the minute-mean H drifts 0.000017 dB over the ten minutes; the ring is 16–64 nodes, the cost 1.1 % of a core a voice at A2 (3.0 % at 64 nodes). Nothing else in Suzu is double; the ring’s smallness pays for it. -
The drift is the minute mean’s. The leapfrog conserves a modified H; the Toda H itself breathes ±0.06 dB at b_max (the soliton’s local frequency times the step) with no trend. The gate reads the mean over each minute against minute 1 (
drift), and prints the breathing beside it — the honest reading of “the lossless energy drift”. -
THE RESOLUTION RULE, found by the red control. A fortissimo C7 blew up under the stiffness bound (k·cap ≤ 0.9, the membrane’s kind of bound): measured on the ring alone, the leapfrog makes energy once a step’s displacement over the exponential’s length, √k·ĉ·b, passes ~0.5 uncapped and ~0.22 with the cap engaged — whatever the cap’s shape (hard or soft gave the same rows). So the ring’s rate follows the pulse: two to eight inner steps a 2× sub-step (
toda_m, the momenta rescaled exactly on a change, the pickup still read twice a sub-step at the ×4 rate), holding √k·ĉ·b under 0.15; and where eight cannot reach it, the nonlinearity is CAPPED FOR THE NOTE at the strike, with a 1.3× allowance for the self-focusing (the struck 0.76 becomes a 0.97 soliton). The first form of the limiter followed the live peak every block and PUMPED the pulse (the potential re-shaped under it; C7 at level 1 went +162 dB in a second under the rule) — a ceiling fixed at the strike, lowered only if the pulse outgrows the allowance, never raised. The inspection says what the rule did (k[6] m, k[7] b asked, k[8] the ceiling, k[1] b applied). -
The soft cap.
min(e^{−br}, cap)left a kink in the force the leapfrog fed on at the margin (m 4, A 3 at C7: +40 dB hard, +0.5 dB soft); the cap is now C¹ — E = e up to cap/2, cap − cap²/(4e) past it — with the potential’s integral inenergy(), and the stiffness bound stated for it (k·cap ≤ 0.9 → the knee’s stiffness 0.45). -
The pickup stands in the lab against the mean drift, in lattice coordinates. The spec’s impulse is inaudible to a pickup fixed to a node (a Galilean boost leaves every bond’s compression as it was). A fully Eulerian pickup (ξ + q(ξ) = x, Newton each step, the bonds interpolated) hears the boost but reads the density spike of a hard soliton — the lattice near-touching, 1 + r ≈ 0.04 — as −43 dB of top-octave content (linear) / −43 (cubic): the physics of a point probe, not an artifact, and not a sound to ship. The pickup’s lattice coordinate now runs back at Σp/N a step (the mean drift alone) and reads a Catmull–Rom cubic over the bonds: the Doppler is the Galilean one (+19.7 % at full poly pressure, J 0.25 of the sound speed), the top octave stays at the half-bands’ floor (−132 dB). A density pickup could be an option later.
-
The level is the strike’s strength.
A = level · vel_gainscales the strike’s strain and the output divides it back, so a louder patch presses the ring harder (more soliton) — the Duffing’s and the membrane’s rule, kept; the book says so. -
The headroom gate (54): sixteen rings C3–C7 at full press, the bar 30 % (18.6 % measured). The rule’s inner steps make the top notes dearer (C7: m 4 at 16 nodes, m 6 at 64); the storm and the tablets’ spikes below. The tablets’ tier caps the inner steps at four and the nodes at 32 (
SUZU_TODA_M_MAX4 and the clamp invoxo_set_suzu_paramsunderVOXO_MOBILE, with a log line — the plate’s kind of cap): the note’s ceiling on b takes what four cannot — the top notes a little tamer there. -
The exponential is the ring’s own. With libm’s
expthe Tab’s first spike read 756 XRuns and a render of 13.8 ms a burst (step 82’s run: 0 and 1.9 ms) — a double exponential per node per inner step, and bionic’s is slow.suzu::toda_exp(Cody–Waite range reduction, a degree-11 Taylor on |f| ≤ ln2/2, 10⁻¹⁴ relative, the 2^k through the exponent field) is plain arithmetic the compiler vectorizes across the nodes, the same bits on every platform (the force stays the exact gradient of a potential within 10⁻¹⁴ of Toda’s; the ten-minute drift re-measured 0.000004 dB); the Mac’s cost fell from 1.3 to 1.1 % a voice at A2 and from 18 to 9 % at C7 with 64 nodes; the Tab’s figures below.energy()keeps libm’sexpas the reference. -
Found at the step, in Voxo: the inspection’s H must be reported in one unit across inner-step changes (per-step units scale by m²) — k[2] is in the ×4 step’s units; the probes’ first drift figures compared different units. In the harness:
tools/make_patch_preset.cpp(the step-82 generator, generalised: a patch table entry through the preset writer, the file gate 28 pins). No core change. -
The tablets. The iPad: the spike on the Toda ring patch, 0 XRuns, the render at most 0.42 ms of the 2.67 ms burst. The Tab: 731 XRuns and a render of up to 13.9 ms a 4 ms burst — the same pattern as step 80’s note (XRuns at the 4 ms burst with the step-80 APK) and step 82’s unison pair, whose render there is 1.9 ms where the Mac’s is 0.05 ms: the Tab’s audio thread runs some forty times slower than the Mac’s core on any voice (a little core at a low clock, by the ratio), and the ring at four to seven voices costs the Mac 0.2–0.3 ms a burst — over that budget by itself. The bisect: the same signed release APK on the Pixel_10_Pro emulator, arm64 at the Mac’s speed, reads 0 XRuns and 3.6 ms of a 20 ms burst — the Android build of the engine is sound; the device’s thread placement is the limit. Carried, for the author (a shell item, not Voxo’s): the Tab’s audio thread wants a performance hint — Android’s ADPF (
APerformanceHint, API 31) or an affinity to the big cores from the AAudio callback — before any of the heavier voices (the membrane, the ring) can be judged there; until then the Tab’s spike on them is a record, not a gate.
Evidence (docs/evidence/step83/SUMMARY.md): the Release suite (229 green, gates 49–54), the Debug ctest (14/14), the web gate (−118 dB, 3.5 % of the quantum), the lab gate green, the storm (0 XRuns on the preset and on the voice, the render at most 0.63 ms), the profile, the strobe chart, the tablets and the emulator.
#2 — Step 84: the Boris–leapfrog magnetic gyroscope, voice_kind 11 (2026-10-21; Voxo 0.24.0, additive; evidence docs/evidence/step84)
Section titled “#2 — Step 84: the Boris–leapfrog magnetic gyroscope, voice_kind 11 (2026-10-21; Voxo 0.24.0, additive; evidence docs/evidence/step84)”What the spec asked (ROADMAP_6.md step 84; TO_PROJECT_SPEC §13.13): a particle on a 2D potential surface under a perpendicular field, the half kick → the exact Cayley rotation → the half kick; (x₁, x₂) straight to (L, R); the spirograph into trace/; poly pressure → B; its own drive clock for the strobe; gate delta a (volume-preserving, the energy bounded, not exact) and b (the spring and B both prewarped); the gates: the doublet within 0.1 cent across B ∈ [0, 50] up to 2 kHz, the red 1.2 cents at 2 kHz charted, the energy’s bounded oscillation over ten minutes, the spirograph verified in Kessho, the profile. What shipped is §13.13’s Boris paragraph as corrected. The decisions:
- The Cayley rotation is three shears, not a cos/sin matrix. A rotation matrix whose c² + s² misses 1 by a unit in the last place is a contraction or a gain of that amount applied every sub-step — e^{±1.7} over ten minutes at 96 kHz, a systematic drift no “bounded energy” gate survives. t = tan(θ/2), s = sin θ, t again is exactly [[cos θ, −sin θ], [sin θ, cos θ]] in exact arithmetic and a round-off walk in floating point, like every other shear in Suzu; the state is double besides (the ring’s precedent). Measured: ±0.031 dB of breathing from the kick’s splitting, the minute means drifting 0.000000 dB over ten minutes.
- The doublet is measured from the struct’s own map, not from a formula the engine also holds. The map on z = x₁ + i·x₂, w = y₁ + i·y₂ is complex-linear (the rotation rotates both components together, the kick and the drift are real scalings), so two basis steps give its 2×2 and the eigenvalues’ arguments are the two lines; gate 55 does that against ω_B/2 ± sqrt(ω₀² + ω_B²/4) over five notes and six fields, then checks the engine’s inspection reports the same lines, then gate 56 finds them in the rendered channel. The analysis (the angles θ/2 ± ψ with cos ψ = cos(θ/2)(1 − ε²/2); the residual (ω_B·dt/2)²/6) is in
suzu.hand the book. The two prewarps alone meet the gate with three orders of margin — no Newton fit of (ε, θ) to the doublet was needed, and none was added. - B is in hertz and the poly pressure’s, with a rest value. The roadmap’s “B ∈ [0, 50]” read as a cyclotron frequency in Hz is the musical range (the doublet’s split: a chorus at a few Hz, a tremolo-wide pair at fifty) and makes the 1.2-cent red at 2 kHz come out exactly as the roadmap says;
boris_bis the field at full poly pressure andboris_b_restthe field without it (the patch 2 and 24 Hz). The proposal’s “at B = 0 a mono planar string” is a patch with the rest field at 0; the default keeps a keyboard without poly pressure in stereo. The field is smoothed with the swirl and refitted every block, so a press sweeps the precession without a step. - The strike is a displacement along the cell’s position by the equal-power pan law (√(1−u), √u): the pluck position is the pan — 0.5 the diagonal with both channels THE SAME BITS (the mono planar string, gated bit for bit), 0 the left alone, 1 the right. The cell’s strike position from the play surfaces (
voxo_set_strike_pluck) therefore pans this voice. - The first stereo voice in
render_suzu_other: (x₁, x₂) to (L, R) with a second SVF for the right channel, the bus plate fed the mean of the two, the release’s amplitude √(2H). The strobe’s own clock (clock 2) is the cyclotron period — the section at each full turn of the field; with no field it falls back to the bass. - The spirograph in Kessho is the author’s viewing: the bench’s
--boris-demo <dir>traces four notes under a poly-pressure sweep into Kessho and into Anod’s spark reading (stills every half second,docs/evidence/step84/spirograph/). The trace’s pair is (x₁, x₂) as drawn, the aux pair the energy and the field. - Found at the step: nothing in the core and nothing in Voxo’s older voices. The harness:
tools/boris_chart.py(the doublet’s error over the keyboard, prewarped and raw) and the strobe chart’s Boris panel; the bench’s demo polls its last export out before the next pass (an export in flight refuses a new one — the Anod pass had produced no stills). - The cost and the tablets. The web gate reads the gyroscope 100 % bit-identical to the desktop reference (no libm in the step; the fit’s tan and sin once a block) at 0.24 % of the quantum; the storm 0 XRuns with the render at most 0.13 ms; the iPad’s spike 0 XRuns at 0.10 ms of the 2.67 ms burst; the Tab was unplugged at the step — the Pixel_10_Pro emulator stands in (
android-emulator-stands-in-for-tab): 0 XRuns, 1.1 ms of a 20 ms burst. The profile is flat to a hundredth of a dB across the keyboard (a linear voice at a fixed strike).
Evidence (docs/evidence/step84/SUMMARY.md): the Release suite (239 green, gates 55–58, gate 28 on nineteen), the Debug ctest (14/14), the web gate, the lab gate, the storm, the profile, the doublet chart, the strobe chart, the spirograph stills in Kessho and Anod’s spark reading, the iPad and the emulator.
#3 — Step 85: the port-Hamiltonian Dirac network (voice_kind 12) and the billiard (voice_kind 13) (2026-10-21; Voxo 0.25.0, additive; evidence docs/evidence/step85)
Section titled “#3 — Step 85: the port-Hamiltonian Dirac network (voice_kind 12) and the billiard (voice_kind 13) (2026-10-21; Voxo 0.25.0, additive; evidence docs/evidence/step85)”What the spec asked (ROADMAP_6.md step 85; TO_PROJECT_SPEC §13.13): the Dirac network ẋ = (J − R)∇H stepped by the Cayley / implicit-midpoint transform, Q-orthogonal not orthogonal (gate delta b), a prepared-network patch routing a reed or bow exciter, a string, a rattle stop and a modal bridge or the plate with no feedback runaway; the billiard in 4D (q, v) under a harmonic potential inside a stadium with exact specular reflection, det J = +1 (gate delta a), the circle integrable and the stadium ergodic, each collision at a sub-sample time at ×4; the gates: the passivity probe ≤ 1.000 in the Q-norm across arbitrary skew J, the billiard’s aliasing ≤ −60 dB above Nyquist/2, the KAM-to-ergodic sweep over L charted and its strobe from a ring to dust, the profiles. What shipped is §13.13’s two paragraphs as corrected. The decisions:
- The network’s states are the springs’ extensions and the masses’ momenta, not positions: H is then diagonal (Q the stiffnesses and the inverse masses) and J the chain’s incidence matrix — the port-Hamiltonian form of a mass–spring chain, built as a sparse skew structure the Cayley transform turns into one dense 19×19 step. The bridge is two more states on the chain’s last spring; its velocity is the voice.
- The passivity probe is the Q-norm gain of the step itself, computed at every build by power iteration on the Gram matrix of Q^½MQ^−½ and reported in the inspection: 1 to 2·10⁻¹⁶ with R = 0 over twelve random skew J of six to sixteen states at a step fifty times the engine’s, under 1 with R ≻ 0 — ”≤ 1.000 across arbitrary skew J” as the roadmap asked, with the shipped network’s own figure beside it. The state and M are double (the gyroscope’s and the ring’s precedent: a float matrix is a bias every step).
- The chain is tuned with the bridge’s loading counted: inverse iteration on the chain-and-bridge stiffness (Thomas on the tridiagonal, the Rayleigh quotient) inside a six-step secant on k, the target prewarped for the midpoint rule — −0.20 cent at A3. The fixed–fixed formula alone was several cents off with a bridge of half a mass.
- The exciter is the stick-slip bow as a port (the roadmap’s “reed or bow”: the bow is the port-shaped one — a force on a velocity; the reed wants an acoustic pressure the network has not). Its force scale is the network’s own: the chain’s
SUZU_BOW_KF_CHAIN6 (3·v_b at the patch’s 0.5) threw the mass to the bow’s speed every sub-step and the tone went two hundred cents sharp with a work of 3·10⁴;SUZU_DIRAC_KF0.18 (measured over a decade of forces) holds the Helmholtz tone on the note. The ledger: H + the stop’s losses − the bow’s gain at the synchronised velocity = H₀ to 10⁻⁶ of H — the inspection reports the gain (k[1]) and the work (k[8]) apart, the gain never above the work. - The rattle stop is a unilateral wall under the bridge’s displacement, in units of the pluck’s static deflection (the level’s velocity over the bridge’s ω): the bridge clamped at the wall, its momentum reflected with the declared loss, the clamp’s and the reflection’s energy both in the ledger. The default 2 rattles under the bow (632 hits in four seconds) — the patch’s character.
- The billiard’s flight is the oscillator’s exact rotation, three shears a plane (the gyroscope’s), at ×4; the collision’s fraction of the step by sixteen bisections on the angle, the reflection on the stadium’s normal, the rest of the rotation; the energy across 66 393 collisions holds to 2·10⁻¹² dB. The fold raises the bounce: a radial orbit kicked v past the wall bounces at (π/2)/asin(1/v) times the note (measured within 0.01 %) — a ball bounces faster in a bowl with walls, and the note returns as the orbit decays under the wall. The proposal’s “wavefolded harmonics” at the note would need the spring retuned to the kick, which sags an octave as the note decays; the default drive 1.4 puts the wall at mezzo-forte with the fold above it, and the book says what the fold does to the pitch.
- The kink is BLAMPed. A reflection jumps the velocity and the sampled positions carry a slope discontinuity; the two-point polyBLAMP of each collision’s slope jump at its fraction, through a one-sample output delay, holds the off-grid residual of the circle’s periodic orbit at −80.5 dB over A3..A5 (the roadmap’s −60), 7–37 dB under the un-BLAMPed path at A4 and A5 (measured on the struct alone; the sign checked: flipped it is worse). The red control (
bill_exact0) fails in kind, not in aliasing: the reflection at the step’s end quantises the bounce to whole ring steps — the period 3.8 % off the geometry against the exact path’s 0.009 % — and a sample-periodic orbit aliases onto its own grid, so its residual reads clean; gate 61 reads the pitch error as the red. - The strobe from a line to dust (gate 62): the circle’s radial orbit at the bass 24 of 576 grid cells — a line along the kick, not the roadmap’s closed ring: a kick from the centre carries no angular momentum, and the strike is a kick (the cell’s position its pan), so the circle’s section is a segment; a ring would want a displacement strike away from the centre, a knob a later step may add — the stadium’s 153; L and R the same bits on the circle’s diagonal orbit, apart in the stadium; the wheel pulls the walls 0.3 → 2.0 under the hand. The sweep is charted by the bench (
billiard_sweep, the wheel over 24 s). - The network’s pickup is the force on the bridge, its kick scaled with the note; its bridge stays in the range. The first profile (the bridge’s velocity, a flat kick, the bridge at 700 Hz) read a 39 dB spread over the keyboard: the chain’s impedance rises with the note and a bridge below its mode is stiffness-controlled, so its velocity tilts six decibels an octave; the pluck’s kick and the bow’s reference now scale as 220/f, the voice is the last spring’s force (a saddle pickup — 25 dB), the bridge takes its own loss (
dirac_bridge_decay, the radiation, 0.5 s: shorter drains the high notes through it — 10 ms left C8 at −99 dBFS — and does not flatten the dip), and the bridge at 700 Hz dips the keyboard ten decibels between A2 and D4 where the string’s partials meet its loaded mode (14 dB plucked); at 2500 Hz, above the playing range, 9.4 dB — but there the bow does not sing (the tone ±30–70 cents, the gain negative, no rattle: the stiff end reflects the string’s waves into another regime), and the bow is this patch’s excitation. The body stays at 700; the knob is the patch’s. - Found at the step: the alias gate’s first form took the maximum of negative decibels from zero (a harness slip, caught by the figure); the roadmap’s red for the billiard does not alias — see 7; the web gate drops the network’s bow as it dropped the bowed lattice (the stick-slip branch flips under a last bit — the plucked network with the rattle is bit-identical). Nothing in the core.
Evidence (docs/evidence/step85/SUMMARY.md): the Release suite (251 green, gates 59–62, gate 28 on twenty-one), the Debug ctest (14/14), the web gate (both voices bit-identical; the network plucked), the lab gate, the storm (0 XRuns, the network’s render at most 0.57 ms with sixteen voices, the billiard’s 0.22), the two profiles, the sweep chart, the strobe chart, the iPad (0 XRuns: the network 1.27 ms of the 2.67 ms burst, the billiard 0.13) and the emulator standing in for the unplugged Tab.
#4 — Step 86: the per-voice chaotic modulator and the four-slot mod matrix (2026-10-25; Voxo 0.26.0, additive; evidence docs/evidence/step86)
Section titled “#4 — Step 86: the per-voice chaotic modulator and the four-slot mod matrix (2026-10-25; Voxo 0.26.0, additive; evidence docs/evidence/step86)”What the spec asked (ROADMAP_6.md step 86; TO_PROJECT_SPEC §13.14): the projected double pendulum promoted from one per patch to per voice; mod_target grown to a four-slot matrix of source × target × depth in the params and the preset schema; no change from the proposal; the gates: the suite’s modulator gates per voice, the storm at fifteen voices with the matrix full, presets round-trip. What shipped is §13.14 as written there. The decisions:
- The pendulum lives in
SuzuVoice, kicked at the voice’s own strike and stepped in the voice’s block only when a slot reads it; the instance’s pendulum and its bus step are gone. The cost is the same per voice as it was per patch (sixty-four RK4 sub-steps a block at most). - The sources are the voice’s MPE values and the channel’s wheel and breath, besides the pendulum; the velocity is a fixed source for a per-note offset. The slide is centred (−1..1) so a slot can pull either way; the press, the swirl, the wheel and the breath are 0..1. The depths are signed.
- The targets keep the step-58 scalings and gain two universal ones: the level (the output ramp × (1 + m), floored at silence) and the pitch (the block’s frequency and its glide step × 2^{m/12}: ±1 semitone at ±1, so a slide-to-pitch slot is a bend any voice obeys). The cutoff and the coupling targets ROUTE FOR THE FIRST TIME: step 58 declared four targets and wired two —
modreached the rotor’s K and the Duffing’s drive, nothing else (found by the gate that asked the press to darken the bell). - The legacy pair is slot 0 when slot 0 is empty, folded at
voxo_set_suzu_paramsso every patch and file from before routes as it did (gate 64: the rotor under the legacy pair and under the explicit slot render the same bits); the desktop folds it into its slot rows and clears the pair, so the settings file carries the matrix from the first save. - The preset schema’s slots are three arrays of four, the integer ones written as numbers (the schema’s one array reader,
r_farray, serves all three); a file from before has no slot. The INI carries three comma lists. The web engine exposes the twelve scalars by name (mod_src0…); the generator takes--slot i src dst amtto write a preset with the matrix filled —presets/chaos_matrix.json, the bell under all four slots, the storm’s. - Found in Voxo, since step 56: a cutoff under the ceiling at zero resonance blew every voice.
svf_f_forcompensates the SVF’s ringing frequency; an overdamped filter (q 2 — resonance 0 — at 4 kHz and 96 kHz) has no ring and the solve ran past stability (f 3.6 against the plain 0.26), the SVF went non-finite and the breaker cut the voice silent. No gate ever ran the filter at zero resonance; the desktop’s default cutoff is the ceiling, so the filter was bypassed. The solver now returns the plain coefficient outside the ringing regime (|cos θ| < 1 with fq < 1, f < 1.9); gate 64 checks the bell sounds under a 4 kHz cutoff at zero resonance and that f stays under 1.9 across the keyboard at q 2, 1.5 and 1. The lab’s cutoff pages ran at resonance and never saw it. - Found with it, since step 57: the SVF’s cutoff ceiling was unstable at low resonance. The classic Chamberlin form’s Jury bound is f² + 2qf < 4 — at q 2 (resonance 0) f < 0.83, a cutoff of 0.13 of its rate — and the fixed fs/6 ceiling (f 0.96 at the ×2 rate) sat past it: the storm’s cutoff slot, pulled from the ceiling by the press, tripped the breaker 44 times in ten seconds on the bell. THE CEILING FOLLOWS q now (0.95 of the bound, the fs/6 kept above it); gate 64 plays the bell under a 15 kHz cutoff at zero resonance and under the press pulling the cutoff from the ceiling, and reads the SVF’s eigenvalues at the ceiling under 1 over five dampings and both rates. Together with 6: the filter at zero resonance had never worked below the ceiling; no gate or lab page ran it there.
Evidence (docs/evidence/step86/SUMMARY.md): the Release suite (256 green, gates 63–64), the Debug ctest (14/14, the preset test round-tripping the slots), the web gate (the matrix section on the Duffing within its tolerance; every other section as before), the lab gate, the storm with the matrix full (0 XRuns, the render at most 0.30 ms, eleven voices at the end), the iPad and the emulator (the Tab unplugged) clean on the bell and the ring.
Phase close — 2026-10-25
Section titled “Phase close — 2026-10-25”Steps 83–86 shipped (#1–#4), each libvoxo additive (0.23.0 → 0.26.0) and the core frozen throughout; TO_PROJECT_SPEC.md §13.13–§13.14 stand as shipped (their fold into PROJECT_SPEC.md is the release’s). The evidence folders of the four steps left the tree at this fold (git show <commit>:docs/evidence/step83…86 keeps them). Carried out of the phase, in the entries: the Tab’s audio-thread placement — its thread some forty times the Mac’s cost on any voice, over its 4 ms burst by the Toda ring alone, the emulator at the Mac’s speed clean (#1, a shell item: ADPF, affinity); the Tab unplugged since step 84, the emulator standing in for it (#2–#4); the billiard’s off-centre strike for a ring section (#3); the cells chapter’s glide figure against the suite’s printout (noted at the lessons’ adaptation, 2026-10-25); and the lessons themselves — the six modules of site/drafts/lessons/, their review’s checks, links and fixes (REVIEW_modules_02-06.md, module 1’s ADAPTATION_NOTES.md) — go to step 92 with the operator and lesson drafts’ fold into the book (the author, 2026-10-25). The tag v3.0.0-alpha.4 is the author’s to cut. Phase 15 (Voxo DS 2.0, steps 87–91) opens DECISIONS_14.md (Part XIV) at step 87.
midi-sink 2.0.0 · AGPL-3.0 · source
