Commit 71bb9bc2 by PLN (Algolia)

feat(set): the remap was never systemic — it read the STALE setlist (#46, #123)

PLN, mid-run: 'wait bass was also on 89 not yet 76 whyyy i thought we were
systemic :((' — and he was right to be annoyed. The answer is embarrassing and
exactly the bug we already fixed one layer up.

tools/migrate-columns.py hardcoded SETLIST = armada/setlist_opal2026.txt. That
.txt was 13 tracks while backlog.md was 15. So when the remap ran, the two
tracks PLN had just added were the only two it never saw — ouais_je_funk and
lime_tacos kept their pre-remap CCs and he found out by reaching for a control
that wasn't there. Same shape as #120/#121: a generated artifact consumed as if
it were the source. resolve() now calls setlist.tracks(), i.e. backlog.md.

Re-planned against the real set: 22 pending moves across 4 tracks, 11 of 15
already clean. Then PLN cut lime_tacos ('actually weak, will have more fun on
ouais funk and perfect') — removed from backlog.md, and the 14-track setlist
plus the plan regenerated themselves from it. That is the pipe working.

Applied, 10 moves:
  wap        d4  octer/octersubsub  ^52 -> ^32 (B4)
  piment     d7  modIndex/octersub  swapped onto B7/C7 in declaration order
  ouais      d3  snare gate         ^44 -> ^43 (E3)
  ouais      d4  crush ^53->^52 (C4), octersub -> ^32 (B4)
  ouais      d5  width/crush        swapped onto B5/C5
  ouais      d5  superimpose        ^57 -> ^89 (F5, gestures live on row F)
  ouais      d7  UPDOWN             ^55 -> ^35 (B7)

d4's 'ply 2' had been authored on a KNOB (^56) and the migrator dutifully gave
it d4's B4 slot, which pushed the octersub into an overflow FIXME. But PLN had
just asked for exactly the opposite layout — 'd4 52 a crush? 32 a octersub
maybe?' — so ply moved to ^44 (E4, a gate on the gate row, free now that d3's
snare vacated it) and both effects got their proper knobs. No FIXME left.

Verified: migrate-columns --plan reports 0 moves, silent-eval --seeded 14/14 ok.
parent c9c8bc39
...@@ -21,7 +21,6 @@ live/techno/do_it_right.tidal # Am i _Doing it Right ...@@ -21,7 +21,6 @@ live/techno/do_it_right.tidal # Am i _Doing it Right
live/midi/nova/lounge/take_5_drops.tidal # Take five Drops [124] live/midi/nova/lounge/take_5_drops.tidal # Take five Drops [124]
live/collab/raph/piment_bresilien.tidal # Piment Bresilien [124] live/collab/raph/piment_bresilien.tidal # Piment Bresilien [124]
live/midi/nova/lounge/ouais_je_funk.tidal # Eh ouais je Funk [120] live/midi/nova/lounge/ouais_je_funk.tidal # Eh ouais je Funk [120]
live/midi/nova/dnb/lime_tacos.tidal # Lime Tacos molotov acid [110]
live/midi/nova/remix/perfect.tidal # Perfect <3 [128] live/midi/nova/remix/perfect.tidal # Perfect <3 [128]
live/midi/nova/acid/gimme_acid.tidal # Gimme Acid [160] live/midi/nova/acid/gimme_acid.tidal # Gimme Acid [160]
live/techno/vague_de_crime.tidal # Vague de CRIME [120] live/techno/vague_de_crime.tidal # Vague de CRIME [120]
......
...@@ -1926,7 +1926,6 @@ ParVagues et Shipow ...@@ -1926,7 +1926,6 @@ ParVagues et Shipow
-- [jazzTech][124] Take five Drops -- [jazzTech][124] Take five Drops
-- [highTech][124] Piment Bresilien -- [highTech][124] Piment Bresilien
-- [highTech][120] Eh ouais je Funk? -- [highTech][120] Eh ouais je Funk?
-- [110] Lime Tacos molotov acid?
-- [justTech][128] Perfect <3 -- [justTech][128] Perfect <3
-- [dnb][160] Gimme Acid??!? -- [dnb][160] Gimme Acid??!?
-- [lightT][120] Vague de CRIME -- [lightT][120] Vague de CRIME
......
...@@ -59,6 +59,7 @@ d7 $ gF3 $ gM3 ...@@ -59,6 +59,7 @@ d7 $ gF3 $ gM3
# "FMRhodes2" # "FMRhodes2"
# gain 1.8 # gain 1.8
# modIndex (range 0 16 "^35") # modIndex (range 0 16 "^35")
# octersubbus 71 (range 0 2 "^55")
-- # cut 9 -- # cut 9
d10 $ gF3 $ gM3 -- Menace d10 $ gF3 $ gM3 -- Menace
$ note "<bf3 ~ ~ <~ <[~!7 b3] [f4 cs4 c4 cs4 f4 cs4 c4 cs4]>>>" $ note "<bf3 ~ ~ <~ <[~!7 b3] [f4 cs4 c4 cs4 f4 cs4 c4 cs4]>>>"
......
...@@ -37,8 +37,8 @@ d4 $ gF2 $ gM3 -- WAP BASS ...@@ -37,8 +37,8 @@ d4 $ gF2 $ gM3 -- WAP BASS
# cut 4 # cut 4
# gain 1.9 # gain 1.9
-- # room 0.4 -- # room 0.4
# octersubsubbus 42 (range 0 1.4 "^53") # octersubsubbus 42 (range 0 1.4 "^32")
# octerbus 41 (range 0 1.4 "^53") # octerbus 41 (range 0 1.4 "^32")
d5 $ gF3 $ gM3 -- WAP HOES v1 magic repeat d5 $ gF3 $ gM3 -- WAP HOES v1 magic repeat
$ midiOn "^33" (# 7) -- FORCE INTRO $ midiOn "^33" (# 7) -- FORCE INTRO
$ midiOff ("^33"+"^89") (slow 4) $ midiOff ("^33"+"^89") (slow 4)
......
...@@ -12,25 +12,28 @@ d1 $ gF1 $ gM1 ...@@ -12,25 +12,28 @@ d1 $ gF1 $ gM1
-- $ "kick:5" -- $ "kick:5"
# gain 1.5 # gain 1.5
# lpf 400 # lpf 400
d2 $ gF1 $ gM2 $ dMask $ "~ cp ~ cp*<1!3 2>" # "h2ogmcp" # gain 1.3 d2 $ gF1 $ gM2 $ dMask -- E2 (^42) was dead: the clap had no gate at all
$ midiOn "^42" ((# "vec1_claps:10") . (<| "~ cp ~ [cp ~ cp*<1 2>]")) -- HANDCLAP ROLL
$ midiOff "^42" (<| "~ cp ~ cp*<1!3 2>")
$ "cp" # "h2ogmcp" # gain 1.3
d3 $ gF1 $ gM2 $ dMask d3 $ gF1 $ gM2 $ dMask
$ midiOn "^44" ((# "vec1_snare") -- Mechant drum-snare!! $ midiOn "^43" ((# "vec1_snare") -- Mechant drum-snare!!
. (struct "~ t ~ t ~ t*<1 2 1 1> ~ t*<1!3 2>") . (struct "~ t ~ t ~ t*<1 2 1 1> ~ t*<1!3 2>")
) )
$ midiOff "^44"(<| "~ h ~ h ~ h*2 ~ h*<1!15 2>" ) $ midiOff "^43"(<| "~ h ~ h ~ h*2 ~ h*<1!15 2>" )
$ "h2ogmhh:19" $ "h2ogmhh:19"
# hpf (slow 32 $ range 200 8000 sine) # hpf (slow 32 $ range 200 8000 sine)
# gain 1.5 # gain 1.5
d4 $ gF2 $ gM3 -- La Funky Bass d4 $ gF2 $ gM3 -- La Funky Bass
$ midiOn "^57" (ply 2) $ midiOn "^44" (ply 2) -- E4: a GATE, freed when d3's snare moved to ^43
$ midiOn "^89" (slice 8 "<6>*<2 2 2 4 2 2 4 8 2 8 8 16 8 16 16 16>") $ midiOn "^76" (slice 8 "<6>*<2 2 2 4 2 2 4 8 2 8 8 16 8 16 16 16>")
$ chop (8 * 8) -- 8 chops times 8 loops $ chop (8 * 8) -- 8 chops times 8 loops
$ loopAt 8 $ loopAt 8
$ "gfunk_bass:1" $ "gfunk_bass:1"
# cut 4 # cut 4
# room 0.8 # sz 0.5 # dry 1.2 # room 0.8 # sz 0.5 # dry 1.2
# crushbus 41 (range 16 3.5 "^53") # crushbus 41 (range 16 3.5 "^52") -- C4, PLN's ask: "d4 52 a crush?"
# octersubbus 42 (range 0 1.5 "^33") # octersubbus 42 (range 0 1.5 "^32") -- B4, PLN's ask: "32 a octersub maybe?"
# gain 1.3 # gain 1.3
d9 $ gF3 $ gM3 d9 $ gF3 $ gM3
$ midiOn "^20" (superimpose ( $ midiOn "^20" (superimpose (
...@@ -41,15 +44,15 @@ d9 $ gF3 $ gM3 ...@@ -41,15 +44,15 @@ d9 $ gF3 $ gM3
# crushbus 91 (range 16 1.5 "^19") # crushbus 91 (range 16 1.5 "^19")
# pan 0.8 # pan 0.8
d5 $ gF3 $ gM3 d5 $ gF3 $ gM3
$ midiOn "^58" (superimpose (("s" ~>) . (|+ note 12))) $ midiOn "^89" (superimpose (("s" ~>) . (|+ note 12)))
$ note ("b4!4 . <[b4 b4 <b4 a4 g4 g4> <b4!7 fs4>] [b4 b4 d5 cs5]>") $ note ("b4!4 . <[b4 b4 <b4 a4 g4 g4> <b4!7 fs4>] [b4 b4 d5 cs5]>")
# "acidOto3092" # "acidOto3092"
# width (range 0.05 0.5 "^54") # width (range 0.05 0.5 "^33")
# crushbus 51 (range 16 3.5 "^34") # crushbus 51 (range 16 3.5 "^53")
# room 0.3 # room 0.3
d7 $ gF1 $ gM3 $ dMask -- Tracey Trancey's loop art d7 $ gF1 $ gM3 $ dMask -- Tracey Trancey's loop art
$ midiOff "^59" (mask "t(4,8,1)" . chop 16) -- TECHNO MASK $ midiOff "^59" (mask "t(4,8,1)" . chop 16) -- TECHNO MASK
$ midiOn "^55" (# n 2) -- UPDOWN $ midiOn "^35" (# n 2) -- UPDOWN
$ chop 8 $ chop 8
$ loopAt 4 $ loopAt 4
$ "trance_loops:0" $ "trance_loops:0"
...@@ -70,15 +73,28 @@ d8 $ gF1 $ gM2 $ dMask -- BYOB: Bring your own Breaks ...@@ -70,15 +73,28 @@ d8 $ gF1 $ gM2 $ dMask -- BYOB: Bring your own Breaks
$ chop 4 $ chop 4
$ loopAt 1 $ "jungle_breaks:78" $ loopAt 1 $ "jungle_breaks:78"
# gain 1.4 # gain 1.4
d10 $ gF3 $ gM3 -- SynMenace -- #33: was `gF3 $ gF3`, so NOTHING could mute d10. TODO @PLN verify d10 $ gF3 $ gM3 -- SynMenace -- #33: was `gF3 $ gF3`, so NOTHING could mute d10.
$ iter "1 4" -- PLN 2026-08-02: "d10 scale up is shitty... the scale climb is irritating".
$ note ((scale "mixolydian" "0 1 2 3 3 4 5 6") + "<a4!4 a5!4>") -- It was `iter "1 4"` over a stepwise run 0 1 2 3 3 4 5 6 — a SCALE, and a
-- scale played straight is an exercise, not a hook. Rewritten as a MOTIF:
-- leaps and rests instead of steps, so the ear hears a phrase repeat with
-- variation rather than a ladder.
-- SAFE AGAINST d4/d5 by construction: degrees 0/2/3/4/6 of A mixolydian are
-- A C# D E G — the notes of A7 plus the fourth. d5's acid line (b4 a4 g4 fs4
-- d5 cs5) and d11's arpeggio already live there, so nothing can clash.
$ whenmod 16 12 (fast 2 . (|+ note 12)) -- last 4 of every 16: an octave up, doubled
$ note ((scale "mixolydian"
"[~ 4] <6 4> [~ 0] <2 [3 2]> . [~ 4] <6 [4 6]> [~ 2] <0 ~>"
) + "a4")
# s "giorgio_syn:5" # s "giorgio_syn:5"
# cut 10 # cut 10
# gain 1.4 # gain 1.4
# room 0.4 # sz 0.3 # dry 0.8 # room 0.4 # sz 0.3 # dry 0.8
-- TODO: FIND FRIENDS 10-12 -- TODO: FIND FRIENDS 10-12
# crushbus 101 (range 16 3.5 "^18") -- was `range 16 3.5` and pinned at a5 half the time — PLN: "too high-ish on
-- the crush". Floor raised to 6 bits (audible grit, no aliasing scream) and
-- the constant a5 doubling is now the occasional whenmod lift above.
# crushbus 101 (range 16 6 "^18")
d11 $ gF3 $ gM3 d11 $ gF3 $ gM3
$ struct "t(3,8) t(<3 5>,8)" $ struct "t(3,8) t(<3 5>,8)"
$ arp (slow 4 "<up down updown converge>" ) $ arp (slow 4 "<up down updown converge>" )
......
...@@ -78,6 +78,7 @@ CC_REF = re.compile(r'"\^(\d+)"') ...@@ -78,6 +78,7 @@ CC_REF = re.compile(r'"\^(\d+)"')
# exactly the duplication that let the HUD's copy go stale after the remap. # exactly the duplication that let the HUD's copy go stale after the remap.
import lcxl_grid # noqa: E402 import lcxl_grid # noqa: E402
import button_roles # noqa: E402 import button_roles # noqa: E402
import setlist # noqa: E402 — the SET is backlog.md, never the generated .txt
KNOB_A = set(lcxl_grid.ROW_CCS["A"]) KNOB_A = set(lcxl_grid.ROW_CCS["A"])
KNOB_B = set(lcxl_grid.ROW_CCS["B"]) KNOB_B = set(lcxl_grid.ROW_CCS["B"])
...@@ -405,8 +406,13 @@ def rewrite(path: Path, res: dict) -> tuple[int, list[str]]: ...@@ -405,8 +406,13 @@ def rewrite(path: Path, res: dict) -> tuple[int, list[str]]:
def resolve(names: list[str]) -> list[Path]: def resolve(names: list[str]) -> list[Path]:
if not names: if not names:
names = [l.strip() for l in SETLIST.read_text().splitlines() # setlist.py, NOT the generated .txt. On 2026-08-02 this tool read the
if l.strip() and not l.startswith("#")] # .txt while the .txt was 13 tracks and backlog.md was 15 — so the two
# tracks PLN had just added were the only two the remap never touched,
# and he found out by playing them: "wait bass was also on 89 not yet
# 76 whyyy i thought we were systemic". Same drift as #120/#123, one
# layer down. One parser per concept (#123): backlog.md is the set.
return setlist.tracks()
out = [] out = []
for nm in names: for nm in names:
p = Path(nm) p = Path(nm)
......
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