---
log: 018
title: "Every track plays, every knob bites — and the instruments that had to be fixed first"
date: 2026-07-28
task: "#66 (with #65, #67, #62)"
tags: [tooling, gig, opal2026, measurement, livecoding]
shareable: true
---

## Cap (what & why)

OPAL is J-7. PLN left the laptop running and gave one mandate: *"ensure all tracks
from gig are playable. you can send fake midi events for each, thus test all
controls have impact on sound ;) even the crushes should change noticeably what you
see/'hear'"*. No ears in the room — every claim had to be instrumental, and every
failure reported as a failure.

## Manœuvre (how)

Two passes, both empirical. **Part A:** boot each of the 10 setlist tracks one at a
time, 20 s settle, then measure every declared orbit *over time* (`probe-chain -t`).
Pass = leaves −inf **and** classifies STEADY, because a DIED/DECAYING orbit means
the eval never took and what you hear is the xfade tail of the outgoing pattern.
**Part B:** drive each control's CC through the real path a physical knob takes
(`aseqsend` → SC `MIDIFunc.cc` → `/ctrl` → `sStateMV`), and assert the *right
measurement* moved.

The measurement design was most of the work, because two of my three instruments
were wrong on their first contact with real audio.

## Prise (findings / artifacts)

**All 10 tracks now play.** 10/10 tracks, every declared orbit alive and STEADY.
Two were broken when the day started:

- **`desire.tidal`: 0 of 9 orbits.** Total silence, master bus at −inf. Cause:
  `off 0.125 (|+ note 12 . (|* gain 0.6))` — `.` binds tighter than the section, so
  it composed a function into a ValueMap. One pair of parens fixed it; 9/9 STEADY
  after (`cfa56b6`).
- **`vague_de_crime.tidal`**: PLN's own `crackles` fix, saved. 9/9.

**Every control tested bites**, measured with the lens that suits it:

| control | measure | result |
|---|---|---|
| `gF1` DJ filter (^49) | centroid | 112 Hz → **3681 Hz**, band energy 72% sub → 75% above 2 k |
| `gF3` DJ filter (^51) | centroid | 384 Hz → **2765 Hz** (+529%) |
| `gMute2` (^74) | rms | −23.1 dB → **silence**, reverts clean |
| `crushbus` (^53) | centroid | 125 → **189 Hz** (+37%) |
| `ply` (^89) | onsets | 8.1 → **4.7/s**, reverts to 7.7 |
| `gMask` (^41) | onsets | **−42%** |
| `gMute1`+`gM1` | rms | silenced all four `gM1` orbits at once |

New tools: `tools/control-lens.py` (the control prover), `tools/check-tracks.sh`
(the pre-gig gate). Commits `cfa56b6`, `708c2ae`, `7b2e5b4`.

### The gate, run end-to-end at the close of the session

```
check-tracks: 10 track(s), one at a time
  bombe_dj: ok — 8/8        wap: ok — 8/8         piment_bresilien: ok — 8/8
  perfect: ok — 12/12       gimme_acid: ok — 10/10  vague_de_crime: ok — 9/9
  mafia_sans_serif: ok — 7/7  you_my_sunshine: ok — 9/9  desire: ok — 9/9
  the_revolution_will_be_sampled: ok — 11/11
check-tracks: OK — every declared orbit of every track made sound.
```

**91 orbits, zero silent, zero eaten by a fader.** The mixer count matters as much as
the track count: earlier in the day, orbits were dying at Ardour's faders on two
tracks. PLN raised the physical LCXL faders mid-session and the gate now records *no*
"Ardour eats it" verdict anywhere. (The saved session file still has four faders at
-inf, so it needs a save — a relaunch would restore the broken mix.)

And the rig is not fragile under load: **zero xruns across 60 s at maximum event
density**, scsynth ERR = 1 for the whole session.

## Sel (the shareable learning)

**The instrument was wrong more often than the rig.** Three fixes, and each one is
the same mistake in a different costume — *answering a question the measurement
cannot actually answer*:

1. **rms cannot see a filter.** A DJ filter and a bit-crusher move timbre at roughly
   constant loudness. Judging them in dBFS isn't a strict test, it's a meaningless
   one. `gMask` read "NO CHANGE, 0.5 dB" — correct arithmetic, wrong question; on
   the density lens it reads −42%.
2. **`ply` reported "+inf %, EFFECTIVE" off a division by zero.** The onset detector
   returned a flat 0.0/s on a sustained bass, so any change looked infinite. The
   tool invented an effect — the one thing it promises never to do. Spectral flux
   fixed the detector; a floor below which the answer is INCONCLUSIVE fixed the
   honesty.
3. **A decay crosses its own midpoint exactly once.** `probe-chain` called a healthy
   `mask "<t f!7>"` riser "DECAYING, almost certainly an xfade tail" — twice. Two
   quartile averages cannot answer a monotonicity question. Counting midpoint
   crossings can: one is a fade, two or more is a cycle, and a cycle is a part.
   Then a *third* false positive: `perfect`'s d4, steady for twelve bins, condemned
   on the strength of the thirteenth — the capture window had closed inside a gap
   between events. Fix: ask whether the verdict survives dropping the last bin.

Every one of those three came from answering a question about **shape** with a pair of
summary statistics, and every fix replaced a statistic with the structural question
that actually separates the cases. There is a general lesson in there about tooling:
the bug was never in the arithmetic.

4. **The observer was the effect.** Ardour's xrun counter climbed +816 in 25 s during
   the stress test — which reads exactly like "heavy patterns cause dropouts", days
   before a gig, and matched PLN's own report of crackles. Removing the probes and
   repeating the *same* musical load gave **zero** xruns. Every probe-chain run
   creates and destroys ~18 PipeWire capture nodes, and each graph renegotiation
   costs Ardour an xrun. The measurement was the whole finding. An instrument that
   perturbs the system will happily hand you the conclusion you went looking for.

And the discipline that makes all three survivable: **A-B-A**. On this rig the
patterns move by themselves — `d2` of `vague_de_crime` plays a different bar every
cycle — so re-measure the baseline at the *end* and treat any swing smaller than
twice the drift as inconclusive. Otherwise you cannot tell "the control did it" from
"the music did it".

## Hameçon (hook)

Three times in one week, "the rig has gone silent" turned out to mean "the code
never compiled" — and each time the damage was *total* rather than partial, because
a blank line is Tidal's block separator and these tracks have almost none.
`desire.tidal` has **zero** blank lines: nine orbits, one block, one misplaced dot,
total silence. The fix that found it wasn't a debugger. It was making the editor stop
deleting the word "error" from GHC's output.
