Commit b82215ff by PLN (Algolia)

Pre-compact cleanup: CHANGELOG + archive + memory

Sprint 2 (the board says what is playing), archive entry with the night's
learnings, and the backlog corrected where the fader feed was listed as unbuilt.
Records the one leg still unverified: Ardour's own echo has not been observed
arriving, only proven linked.
parent 3a91eba0
......@@ -4,6 +4,64 @@ Sprint entries, newest first. Player-facing: what changed about *playing*, not
about the code. Task IDs reference the L'Armada board; `n/a` where the work was
unplanned (which, on a gig night, is most of it).
## Sprint 2 — 2026-09-06 (night) · the board says what is playing
Sprint 1 got sound out of a new laptop. This one makes the surface and the
session tell the truth about it — and spent most of its effort correcting
things that were confidently wrong, including three of its own claims.
### Added
- **The rings breathe at the tempo when a control is engaged** (n/a). Motion on
the board used to mean only "a DJF sits at its zero mark". Now: fx knobs on
every orbit breathe when off zero; d9-d12 level knobs breathe when not off;
`midiOn` cells stay dark until 127 and breathe only at max. The breath's
CEILING is the value, so "lightness carries VALUE" still holds — a knob at
30% breathes dim.
- **`parse_kinds()`** (n/a) reads whether a control is a dial or a switch off
the track itself: `# effect (... "^NN" ...)` is continuous, `midiOn/midiOff`
is boolean. Tidal applies midiOn's function while the CC reads high, so a
ring fading up across a range the music ignores is a ring that lies.
- **The d9-12 level rings learn what Ardour holds** (n/a). Two complementary
sources: a forwarded CC is an observation (the driver translated it, so it
knows), and Ardour echoes changes it did NOT get from us (the GUI, a mouse,
automation, a session load). Neither alone is enough. The feedback leg gets
its OWN virtual port, so no control loop is possible by construction.
### Changed
- **`gig-up` restores the fader baseline on every launch** (n/a). The faders
are not state: measured at 9 of 12 drifted, all nine at -inf on the last
save. So the readiness gate's report was correct and useless. Restored in the
Ardour-closed window the source sweep already owns.
### Fixed
- **A scene resolves without its source present** (n/a). The header points at
where the image was authored (`~/Downloads`, `GLITCHWAVE/`) — correct, that
is the SSOT — but `resolve()` tried the absolute path and nothing else, and
the derived-twin lookup is only reached THROUGH a source that exists. So the
whole mechanism was conditional on being the machine that made the gif. 0 of
5 distinct scene targets resolved on the XPS24 before; 5 of 5 after.
(`pulsar-parvagues-hud` 78b1755.)
- **One absent sister repo made the parser ratchet guard nothing** (n/a).
`tools/analyze_samples.py` is a committed symlink into `../tidal-ears`, which
is not cloned here; `_offenders()` caught only SyntaxError, so the module
failed COLLECTION. The guard reported nothing instead of reporting a gap.
### Doctrine
- **Fetch before you quote a number.** "462 commits unpushed, one copy only"
came from a months-stale remote-tracking ref. The truth was 7 ahead, 1
behind. There was never a backup emergency.
- **A correction can need correcting.** "The refs work as designed, nothing to
rewrite" was true only on the box that authored the image. Two passes to get
one visuals entry right.
- **Ask the authoritative layer.** The JACK graph showed `ParVagues LCXL3` with
no connections and nearly earned a report that the faders were dead. ALSA
held the subscription (`131:0 -> 14:0 -> ardour:MIDI Control In`) the whole
time. Parse the graph, never eyeball its indentation.
- **A flag you set may already have been set.** The global `midi-feedback` was
0, but `<Protocol name="Generic MIDI" feedback="1" active="1">` had been on
all along; the reason no echo arrived is that Ardour does not tell a surface
what it just said.
## Sprint 1 — 2026-09-06 · rose_rouge plays on a new laptop
The portable-rig thesis met a real box for the first time. Five faults stood
......
......@@ -7,6 +7,48 @@ snapshot in `board-archive.md`. Newest first.
---
## n/a — the board says what is playing (and three corrections)
**Description.** Make the LCXL3 and the Ardour session report the truth about
what is audible: rings that breathe on engagement, level rings that know what
Ardour holds, and a session mix that starts from a known baseline. Plus finish
the visuals sync xps22 had been holding.
**Done.**
- Rings breathe at bar rate when engaged — fx on every orbit, d9-12 levels,
`midiOn` cells only at 127. Breath ceiling = the value.
- `parse_kinds()` classifies dial vs switch from the track; verified on
rose_rouge (d8's B8+C8 bool, the delay/squiz knobs cont).
- Ardour feedback feed: own virtual port, discovered-by-suffix JACK link,
re-asserted every reconcile tick, re-links in <5 s across a driver restart.
- `gig-up` restores the fader baseline every launch; 9 of 12 faders were
drifted, all nine at -inf.
- `visuals/scenes` synced (124 M with `-H`), and the resolver fixed so a scene
resolves without its authored source: 0 of 5 targets before, 5 of 5 after.
- Parser ratchet made robust to a dangling sister-repo symlink.
- Rebased onto origin (xps22 had pushed an archive entry), pushed clean.
**Learnings.**
- **Fetch before quoting a number.** "462 unpushed" was a stale remote ref;
the real divergence was 7/1. A measurement is not a fact.
- **A correction can itself be wrong.** "Refs work as designed" held only on
the authoring box. The derived-twin mechanism was silently conditional on
possessing the source it exists to avoid needing.
- **Ask the authoritative layer, and parse rather than eyeball.** The JACK view
showed the driver unconnected while ALSA held the subscription; reading
`jack_lsp -c` indentation by grep nearly produced a false "faders are dead".
- **The flag may already be set.** Generic MIDI feedback had been on all along;
no echo arrived because Ardour does not tell a surface what it just said —
which is why the driver's own forwarded value is the other half of the truth.
- **Buffering is not absence.** An "empty" log had simply not flushed; the run
it seemed to disprove had actually worked. `-u`, not `stdbuf`, for Python.
- **A guard that cannot run guards nothing** — and it fails silently, which is
the exact failure it was written to prevent.
**Deps.** None blocking. `perf-audio` + `parvagues-protect` remain sudo
installs; `../tidal-ears` and `GLITCHWAVE` are still uncloned on this box.
## n/a — rose_rouge on a new laptop: five green checks, five real faults
- **Description:** First real test of the portable-rig work on a fresh XPS24, mid
gig-setup. Asked to play `rose_rouge.tidal` with the full viz stack (LCXL3, Pulsar,
......
......@@ -2123,28 +2123,23 @@ the answer to "why was it in Downloads": authoring happens on xps22.
## Opened 2026-09-06 (second pass)
- **The Ardour fader FEED for the d9-12 level rings is designed, not built.**
PLN chose the live feed so those four rings glow by real audibility. Findings,
all verified on the running rig:
- Ardour has already LEARNED the right CCs: `<MIDIControllable>` bindings in
`~/.config/ardour8/config` map `0xd 0xe 0xf 0x10` (13-16, the d9-12 level
knobs) and `0x4d..0x54` (77-84, the d1-8 faders). All twelve levels bound.
- The only thing withholding the values is one global flag:
**`"midi-feedback" value="0"`**. Ardour writes its config on quit, so this
must be set with Ardour CLOSED (same window as the sweep and the fader
restore) or ticked in its GUI.
- `ardour:MIDI Control Out` exists and currently has NO connections.
- **The hazard**: the driver reaches Ardour via `131:0 -> 14:0 (Midi Through)
-> ardour:MIDI Control In`. Midi Through is a LOOPBACK, so pointing
feedback at it would echo the driver's own CCs back into itself. The
feedback leg therefore needs its own dedicated virtual input port
(`self.virt` is output-only), plus a reconcile leg to hold the link — the
same "bindings are re-asserted, never assumed" pattern as `reconcile()`.
- Driver side is already prepared: `self.ardour_seen` exists and
`ring_colour(value_known=...)` keeps those rings flat until it fills, so the
feed can land without touching the paint laws.
- Needs Ardour restartable to test, which is why it was not built blind: an
unverified detector is the one thing this rig's doctrine forbids.
- ~~**The Ardour fader FEED is designed, not built.**~~ **BUILT 2026-09-06
night** (`3a91eba`). Two complementary sources: a forwarded CC counts as an
observation (the driver translated it), and Ardour echoes changes it did NOT
get from us. Own virtual port (`ParVagues LCXL3 FB`), JACK link discovered by
suffix, re-asserted every reconcile tick, re-links in <5 s across a restart.
**One leg is still unverified end to end**: no Ardour-side (GUI/mouse) fader
move was observed arriving, because nobody clicked one — the link is proven
up and the ingest path is proven correct, but the echo itself has not been
seen. Next time Ardour is open, drag a Tidal fader with the mouse and check
`journalctl --user -u lcxl3-driver -f` for an `ardour -> v2 #NN` line (needs
the driver run with `--verbose`, which the unit does not pass). If it never
arrives, the physical-move source still covers everything PLN asked for.
Related: the GLOBAL `"midi-feedback"` in `~/.config/ardour8/config` was
flipped 0->1 that night, but `<Protocol name="Generic MIDI" feedback="1">`
was already on, so that flip may have been unnecessary. Backup:
`config.pre-midifeedback-20260906-212052.bak`. Worth settling before assuming
either flag matters.
- **`../tidal-ears/` is not cloned on this box.** `tools/analyze_samples.py` is a
committed symlink into it, so it dangles — which broke the whole
......@@ -2158,3 +2153,7 @@ the answer to "why was it in Downloads": authoring happens on xps22.
unit actually uses, and the one that HAS mido — cannot run pytest at all. The
rig's own hardware tests are therefore unrunnable where they matter. Same bug
class as the rig-doctor fix: asking the wrong interpreter.
- **`pulsar-parvagues-hud` 78b1755 is committed but NOT pushed** — that repo is
on `main`, which needs an explicit request. It carries the scene-resolver fix
without which no backdrop appears on this box.
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment