Commit 9ec69a35 by PLN (Algolia)

docs(morning): rewrite the review checklist โ€” last night's version was stale

The existing MORNING.md led with a warning about ctrl+enter fading to silence over
4 bars (#79) โ€” fixed and confirmed by ear hours ago ("no sample goes oblivion!! ๐Ÿ‘").
Leading with a solved problem buries what actually needs review tonight.

Replaced with five things worth his eyes/ears, ordered by urgency: the desire
compile break (#108, a real gig blocker), the corrected take-94 mix (v2, the trim
threshold fix), silent-eval now covering all 13 setlist tracks, the slop renderer's
first real output (not yet good enough to send, flagged as such), and the four
desire bass-rhythm alternatives to A/B. Everything else from the session is
mechanical and needs no listening, so it's kept to one short list at the bottom
rather than mixed in with what actually needs his judgment.
parent f2467db7
# โ˜• Morning, 2026-07-29 โ€” OPAL Day-6 # โ˜• Morning, 2026-07-30 โ€” OPAL Day-5
**Everything is running. Nothing needs starting. Go play.** **Everything from last night is superseded โ€” that warning about ctrl+enter fading to
silence is FIXED and you confirmed it by ear ("no sample goes oblivion!! ๐Ÿ‘"). This file
replaces it.**
The night's work is on branch `claude/preload-eager-banks`, 5 commits, **435 tests green**. Branch `claude/preload-eager-banks`, nothing pushed. Built while you were on the practice
recording and listening to the mix. Five things to check with your ears/eyes; everything
else is done and verified mechanically.
--- ---
## Just play โ€” the three things to know ## 1. GIG BLOCKER โ€” desire does not compile (5-second fix, but do it in Pulsar)
**1. Your run-through is being recorded (numerically) already.** `live/collab/raph/desire.tidal:46` has `# pan 0.42plz /se` โ€” committed, not a stray edit.
`gig-log` has been sampling at exactly 1.000 Hz since 00:57 โ€” temps, CPU freq, throttle `plz` isn't a Tidal function. desire has **no blank lines**, so it's one do-block: this one
counts, xruns, per-gear %CPU + RSS, and every LCXL control move. It's a systemd unit, it typo silences **every orbit**, d1 through d9. It's on the OPAL setlist.
starts with your session, and it costs **0.4% of one core**. Wall-clock stamped, so it
lines up with your Ardour take.
```bash **Fix in the editor, not on disk** โ€” desire is in your dirty working tree and Pulsar saves
tools/gig-log.py mark "gimme acid drop" # annotate mid-set, any time the buffer, so if your open tab already has the correction, a disk edit gets silently
tools/gig-log.py report # read it back afterwards reverted on your next save; if it doesn't, save after fixing. Change is one character:
```
- # pan 0.42plz /se
+ # pan 0.42
``` ```
When you finish, run `report` and we'll review the run together. Verify: `python3 tools/silent-eval.py --seeded live/collab/raph/desire.tidal` โ†’ should
print `desire: ok`.
---
**2. The LCXL looks different โ€” on purpose.** Both things you spotted are fixed: ## 2. Your practice take is packed, archived, and the mix is validated
| | before | now | You heard `mix/take94/take94_trimmed.wav` and called it clean but flagged the ~18min gap as
|---|---|---| "not normal, a bad transition โ€” cut it proper and fade". You were right and the tool was
| DJ filters (row C) | wash of oranges, 7 steps | **red** = cutting highs ยท **bright yellow** = bypass (centre) ยท **green** = cutting lows | wrong: three gaps (17s/18s/11s) all sat *just under* the trim threshold. Fixed โ€” threshold
| knobs (rows A/B) | dim / not-dim only | your six-step ramp, wired in at last: dim red โ†’ red โ†’ dim amber โ†’ amber โ†’ dim green โ†’ green | dropped to 10s, silences are now clamped to a 2s breath instead of removed whole, and every
| mutes 73/74/75 | `R R G` ๐Ÿคจ | all three identical | cut fades (250ms) instead of butt-joining. Re-rendered: `mix/take94/take94_trimmed_v2.wav`
| panic armed (`^93`) | invisible | **all four chord buttons flash red** | (18.75 min, all 5 gaps addressed including the one you named). **Give this one a listen โ€”
it's the one that matters, not the v1 you already heard.**
Rows A/B will be uniform dim red at rest โ€” that's "nothing brought in yet", and things Also done, no listening needed:
climb toward green as you bring them up. - `tools/take-lens.py pack 94 --compress` โ€” the take's MIDI (29862 events), track state,
and gear info now live next to the audio at
`~/Work/Sound/Ardour/Tidal Live/takes/take94/`, safe from the gig-log prune timer.
Archived with wavpack: **5.84 GB โ†’ 1.25 GB, every file verified lossless**, .wav sources
untouched (deleting them is a separate step, your call, after you've heard v2).
- Found and fixed: xrun count in the sidecar was reading a *running total* as if it were a
per-tick delta, reporting 58 million xruns for a 21-minute take. Real number: **230**.
**3. Right-click the tray โ†’ `Gear โ–ธ 3/6 up`.** It now says what's *already running* Same command works on your next take: `tools/take-lens.py pack <N> --compress`.
(โ— running / โ—‹ stopped / โœ— missing) instead of only offering to launch.
--- ---
## One thing worth 5 minutes before you play ## 3. silent-eval now covers all 13 setlist tracks (was 9)
**Your set leaves ghosts at 8 of 12 transitions.** That's the crimewave synth you heard Two of the tool's own bugs were making it diverge from how ghci actually runs your code โ€”
under bombe_dj โ€” `dN` replaces orbit N and says nothing about the others, so any orbit the fixed by matching ghci's defaults exactly (ExtendedDefaultRules, and hiding boot names from
outgoing track declares and the incoming one doesn't just keeps playing. the Context import so `let cutoff = ...` shadows the same way live). `perfect` and
`mafia_sans_serif` now build clean. That's how desire's real bug (#1 above) got found โ€” the
tool used to lump it in with "harness limit, ignore this," which was actively hiding a gig
blocker. It now says `THE TRACK DOES NOT COMPILE` when it means that.
```bash ```bash
tools/orphan-orbits.py # the whole set, transition by transition python3 tools/silent-eval.py --seeded # whole setlist, should be 13/13 ok after #1
tools/orphan-orbits.py --matrix # which orderings are cheap
``` ```
- Under pressure: **`hush` between tracks.** Safe, costs the tail.
- **Perfect <3 declares all 12 orbits** โ†’ it's a free *reset point*. Anything can follow
anything into it. Useful ordering lever for #12.
- Worst offenders: after REVOLUTION (4 orphans), after Gimme Acid (3).
Set list is now data: `armada/setlist_opal2026.txt`. Reorder it and re-run to re-answer.
--- ---
## Also: the pre-gig gate can actually run now ## 4. The slop renderer exists โ€” first clip rendered, not yet good enough to send
`tools/check-tracks.sh` boots every track in the set and proves each declared orbit makes `visuals/slop/render_slop_clip.mjs` takes a planned cut or any audio window and renders a
sound โ€” which is also the only compile check a `.tidal` file can have. It read a setlist vertical reel with Slopmotion reacting to the real audio (not a synthetic pump). It ran
from the repo root that **never existed**, so it has been unrunnable since it was written. start to finish on 8s of take 94. **Frame rate is the open problem** โ€” 7fps at 1080x1920,
Now it reads the same `armada/setlist_opal2026.txt` as the ghost report. which is the GL backend + the machine, not the pipeline (measured, details in
`visuals/slop/FEEDBACK.md`; needs re-measuring on a quiet machine, not tonight while the
rig was up). Not something to review yet โ€” flagging so you know it's real now, not vapor.
```bash ```bash
tools/check-tracks.sh # ~45s per track by design; needs audio node visuals/slop/render_slop_clip.mjs --idea wap # from the OPAL plan
tools/check-tracks.sh --help node visuals/slop/render_slop_clip.mjs --audio mix/take94/take94_trimmed_v2.wav \
--start 300 --dur 30 --playset liquid-metal --name probe
``` ```
(needs `cd ~/Work/Sound/hydra-live-hexa && . ~/.nvm/nvm.sh && nvm use 22 && npm run dev` running first)
Worth running once with sound up before OPAL โ€” three times this week "the rig is silent"
turned out to be "the code did not compile".
---
## Waiting on your ears / hands (not on work)
1. **`pv-at --track` โ€” run it with sound up.** It probes every control on a track and says
MOVED / NO_IMPACT / INCONCLUSIVE. Built and unit-tested; the audio half has never run
because the house was quiet. Start with `python3 tools/at --track live/midi/nova/acid/gimme_acid.tidal --seconds 4` (~8 min, 22 controls).
Any **NO_IMPACT is a real find** โ€” a mapped control that does nothing.
2. **#46 the surface remap** โ€” needs you to re-learn Ardour's 12 gains by hand, and to move
`piment_bresilien.tidal:77`'s crush off `^14`. Verify faderโ†’orbit *by behaviour*; the
saved session disagrees with the live mixer (#62).
3. **#8 thermals under load** โ€” needs monitors + a heavy track for 10 min. gig-log now
captures exactly what's needed. (Baseline so far tonight: **0 xruns, 0 throttle events.**)
4. **#70** you_my_sunshine d5/d11 cut-group clash, **#12** set order, **#13** transitions.
--- ---
## Found while working, worth knowing ## 5. desire bass rhythm โ€” four things to A/B, not a decision made for you
- The tray was wired to open **"Tidal Multi"** โ€” the *archive* session โ€” not "Tidal Live". You said: *"i gotta solve desire bassline is not great rythmics, could be cooler, more
Fixed. It also could never have launched Ardour at all (looked for `ardour8`, you have ete_a_mauerpark or insouciance or haunted_house."* Read all three. The diagnosis is
`ardour9`), and its running-check matched any shell that merely mentioned the word mechanical: desire's d4 is four equal groups of the same repeated note, on the beat, never
"ardour", so it could report Ardour up while it was down. resting โ€” a metronome with a stutter, not a riff. The three references share six things it
- `lens.py` couldn't see `gF1/gF2/gF3` **at all** โ€” they live in `BootTidal.hs`, not in the has none of (uneven note durations, pitch=rhythm, eighth-note displacement against the
tracks โ€” so the acceptance test was blind to the three DJ filters and every mute. It now kick, accent following the rhythm, rests, a phrase longer than one bar).
parses BootTidal. gimme_acid went 18 โ†’ 22 controls.
- Two of your three mutes were being measured with the wrong lens (`mask "f*16"` read as a
density gate rather than a mute), so two working mutes would have reported as dead.
- `perf._read(None)` crashed instead of returning a default โ€” the Bridge shares that path.
Full narrative is in the commit messages (they're written to be mined for the blog). `study/desire_bass_rhythm.tidal` has four alternatives, each isolating different mechanisms
so you can tell what you're reacting to โ€” A (weight), B (gesture, biggest change), C
**Nothing I touched needs a reload or a restart. `check-boot.sh` passes. Have fun. ๐Ÿค˜** (space, safest/smallest change), D (all six combined โ€” and deliberately *busier* than
today's line, to prove the fix isn't "fewer notes"). All four verified to compile and play.
Paste one `d4` over desire's real one and listen; pitch/key is unchanged in all four.
--- ---
## โš ๏ธ Added after your first playthrough โ€” read this one ## Everything else from tonight โ€” mechanical, no listening needed
**The "drifts to silence over 4 bars" thing is not a drift.** `BootTidal.hs:100,126`:
```haskell
xfade i = transition tidal True (Sound.Tidal.Transition.xfadeIn 4) i
d1 = xfade 1 . (|< orbit 0)
```
Every `dN` is a **4-cycle crossfade** โ€” your "over 4 bars" is that exact number. So the
sound you hear after ctrl+enter is the **previous** pattern fading out; the **new** one is
already silent. The crossfade is working fine and has been *masking* a silent-eval bug by
giving it a graceful exit.
**The sound right after ctrl+enter is not evidence the eval worked** โ€” it's evidence the
last one did.
Discriminator, 10 seconds: **eval the same track twice.** Silent from bar 1 the second - LED daemon (`lcxl-leds-watch.service`) was silently mute in the journal โ€” Python's stdout
time = confirmed. Then it's the usual silent-eval suspects โ€” an unset `^NN` (which yields buffering under systemd, plus its own `-q` flag suppressing the one line that mattered
*no events*, not 0), or a block that didn't compile. `tools/check-tracks.sh` answers that (track changes). Fixed both; verified live, restart not needed (already applied).
for all 13 tracks at once and is runnable again. - `take-lens.py selftest` added โ€” exercises the trim/fade rules on synthetic input, since
two of them (the silence-bridge, the fade shape) never fire on real material and were
otherwise unverifiable. All pass.
Tracked as **#79**, and it blocks #77 (silence-guard), #74 (the control AT โ€” its 8s settle Nothing here needs a reload or restart. Go play. ๐Ÿค˜
lands inside your fade) and #13 (transitions). Everything else can wait; this one can't.
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