Session story · 2026-09-08
Session: 2026-09-08 → 2026-09-09 (transcript 330e8a64, two sittings, no hardware) · Created: docs/BACKLOG.md · Lesson born: absence of evidence
The instrument was not connected. The previous sitting had ended with stereo FFT verified, the closed-form amplitude live, and a Heathkit comparison queued. Ideas for future work were scattered across memory notes and a roadmap that was mostly finished history.
There was no single working belief going in. Over the evening one formed and then fell: APWIN never reads calibration from the instrument.
What would it take to run Cascade on other Audio Precision units, and what can be learned about that without the hardware?
A backlog. Chris started with a goal, not a task: "I would like to be able to use this software on other AP units. 2522, 322, etc." and asked for "an organized spot so we can go through the future dev and brainstorming ideas later". Claude created docs/BACKLOG.md with a fixed shape per entry, including a prominent "what's unknown" line, and marked cascade-roadmap.md as historical.
The blobs, measured. Chris said he saw the blob replay as temporary. "i have been thinking that the blob replay situation is probalby temporary - meant to get us to a certian functional setup, and then for that information to be hard coded into the setup." Claude measured apib_fft_full.bin: 122,703 packets, 44.8% reads whose responses replay discards, 35.6% register writes touching only 72 registers, 17.5% DSP stream. It estimated the information content at about 400 packets, roughly 300× smaller, and stated that as an upper bound. Two blobs captured a day apart shared 98.7% of their DSP payloads.
Model versus unit. Claude had written that the amplitude B constants were "likely one number to fit". Chris raised what that skipped: "different units even of the same model may have drift from each other in oscillator or analyzer performance. anothter 2522 may perform a bit differently from this one we have been using." Claude agreed it had conflated two things. The blob result answers the model-level question only. B was fitted from APWIN's writes, so it already embeds this unit's calibration, and this unit's measured performance cannot be used as pass/fail limits for another 2522.
More entries. A self-check built into Cascade, reading the unit's own calibration, and SINAD (queued by Chris: "one more thing i would like to explore - adding a SINAD test to the test suite."). Claude broke the backlog's markdown twice with regex inserts and fell back to renumbering by position.
Bandwidth. "we have been dealing only with 20Hz to 20kHz. for this reason, THD numbers really don't mean much with fundamentals over 5kHz. or over 3 really. how does APWIN handle this?" Claude found three answers in the reference: InputFormat selects 65,536, 131,072 or 262,144 Hz sampling; a separate harmonic analyzer with Sum1Harmonics/Sum2Harmonics; and FuncFilterLP, which Cascade never set. It also found the FFT read only to 20 kHz when Nyquist was 32,768 Hz. Chris put that on hold because he could not test it, and raised speed instead. Claude counted 2,501 bins × 7 transactions × 2 ms of enforced delay, about 35 seconds of pure delay per capture, and proposed an adaptive grid. Chris: "ok it's great to have a backlog, that way we can prioritize that backlog, and associate related changes with each other." Claude added clusters and ordering constraints.
APWIN never reads calibration. Chris said go ahead with the no-hardware research. Claude analysed docs/coldstart.pcapng: 22,152 responses, only 21 distinct registers ever read, all known status or measurement registers, and the undecoded opcodes 0x03, 0x83 and 0x82 returning nothing. It decoded a slot enumeration (82 <slot> / 02 <slot> E0 00) and concluded, firmly, that APWIN never reads calibration from the instrument.
The correction. "of note - we have been starting pcaps after starting APWIN, because early on, starting the PCAPs locked up the usb interface. there is a step in APWIN startup where the device is identified and I assume calibration files loaded. maybe it is possible to capture that" Claude went to check whether the capture could contain that phase. It first read ten GET_DESCRIPTOR(DEVICE) transfers as a live enumeration, after a search in the wrong field (ctrl_data instead of payload) had returned zero. Then it recognised them as USBPcap's inventory of devices already attached. The capture could not prove that nothing came earlier. The conclusion was downgraded to "strongly suggested, not proven", and Claude added that PC-side calibration files would produce no USB traffic at all. It saved feedback_absence_of_evidence with three instances from that day.
SINAD, with tests that point a direction. "With these analysis changes we should have unit tests of some kind to be sure we don't drift too far , or that when we do drift it's in the right direction" Claude added a SINAD tile labelled "20 Hz–20 kHz, unwtd" and six invariant tests: SINAD and THD+N are exact inverses, SINAD does not move when the whole spectrum shifts 40 dB, 3 dB more noise lowers it about 3 dB, and a 90 dB DC spike does not move it. 25 tests passed.
Watts on the x axis. The next evening Chris asked for an x-axis unit and load picker on THD vs Level, adding "i think the pieces are already there". Most were. One was missing. The sweep reported the commanded level, while Power & THD computes watts from the measured voltage. With a 40 dB amplifier those differ by four orders of magnitude. The sweep now reports measured level, and a point without a reading is dropped from a W plot rather than converted from the command.
| Believed | Then | What overturned it |
|---|---|---|
| the blobs size the multi-unit project | ~400 packets of content, 98.7% shared across sessions | opcode breakdown, two-blob diff |
amplitude B is roughly one structural number | it embeds this unit's calibration | Chris on unit-to-unit drift |
| our measured values can be self-check limits | they describe one instrument | same |
| APWIN never reads calibration | the capture started after APWIN launched | Chris on capture order; USBPcap device inventory |
| the capture began at enumeration | those descriptors were already-attached devices | reading the right field |
| THD vs Level x axis is display-only | the sweep threw away the measured level | reading runTHDSweep |
0x0B at 00/20/30/40, 0x06 at B0/C0, 0x0F empty.docs/BACKLOG.md (created), docs/cascade-roadmap.md (marked historical)docs/coldstart.pcapng; blob and coldstart analysis tools saved in this sitting (names not shown in the transcript summary)feedback_absence_of_evidenceThe backlog holds multi-unit support, unit calibration, SINAD, the self-check, bandwidth and speed, grouped by dependency. SINAD shipped with invariant tests. THD vs Level can plot Vrms and W from measured level. Open: a capture with USBPcap running before APWIN starts, the bandwidth changes, the speed experiments, and everything that needs the 2522.