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 ...@@ -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 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). 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 ## 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 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. ...@@ -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 ## 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 - **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, 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. ...@@ -2123,28 +2123,23 @@ the answer to "why was it in Downloads": authoring happens on xps22.
## Opened 2026-09-06 (second pass) ## Opened 2026-09-06 (second pass)
- **The Ardour fader FEED for the d9-12 level rings is designed, not built.** - ~~**The Ardour fader FEED is designed, not built.**~~ **BUILT 2026-09-06
PLN chose the live feed so those four rings glow by real audibility. Findings, night** (`3a91eba`). Two complementary sources: a forwarded CC counts as an
all verified on the running rig: observation (the driver translated it), and Ardour echoes changes it did NOT
- Ardour has already LEARNED the right CCs: `<MIDIControllable>` bindings in get from us. Own virtual port (`ParVagues LCXL3 FB`), JACK link discovered by
`~/.config/ardour8/config` map `0xd 0xe 0xf 0x10` (13-16, the d9-12 level suffix, re-asserted every reconcile tick, re-links in <5 s across a restart.
knobs) and `0x4d..0x54` (77-84, the d1-8 faders). All twelve levels bound. **One leg is still unverified end to end**: no Ardour-side (GUI/mouse) fader
- The only thing withholding the values is one global flag: move was observed arriving, because nobody clicked one — the link is proven
**`"midi-feedback" value="0"`**. Ardour writes its config on quit, so this up and the ingest path is proven correct, but the echo itself has not been
must be set with Ardour CLOSED (same window as the sweep and the fader seen. Next time Ardour is open, drag a Tidal fader with the mouse and check
restore) or ticked in its GUI. `journalctl --user -u lcxl3-driver -f` for an `ardour -> v2 #NN` line (needs
- `ardour:MIDI Control Out` exists and currently has NO connections. the driver run with `--verbose`, which the unit does not pass). If it never
- **The hazard**: the driver reaches Ardour via `131:0 -> 14:0 (Midi Through) arrives, the physical-move source still covers everything PLN asked for.
-> ardour:MIDI Control In`. Midi Through is a LOOPBACK, so pointing Related: the GLOBAL `"midi-feedback"` in `~/.config/ardour8/config` was
feedback at it would echo the driver's own CCs back into itself. The flipped 0->1 that night, but `<Protocol name="Generic MIDI" feedback="1">`
feedback leg therefore needs its own dedicated virtual input port was already on, so that flip may have been unnecessary. Backup:
(`self.virt` is output-only), plus a reconcile leg to hold the link — the `config.pre-midifeedback-20260906-212052.bak`. Worth settling before assuming
same "bindings are re-asserted, never assumed" pattern as `reconcile()`. either flag matters.
- 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.
- **`../tidal-ears/` is not cloned on this box.** `tools/analyze_samples.py` is a - **`../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 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. ...@@ -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 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 rig's own hardware tests are therefore unrunnable where they matter. Same bug
class as the rig-doctor fix: asking the wrong interpreter. 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