---
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`.

## 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.

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.
