Commit d8effb67 by PLN (Algolia)

fix(surface): finish the column remap on the tracks actually in play

The #94 remap was run against a setlist, not the catalog, so conformance was
never a property of a track — it was a property of having been on that list.
Two days of desk edits then pushed listed tracks back out: swapping jeudrill's
d9 and d10 bodies moved the orbits but not their knobs, so d4's effect was
sitting in d5's column again.

Migrated, one simultaneous permutation per file, 24 moves across six tracks:

  jeudrill        6   the d9/d10 swap's knobs follow their orbits
  liquid_nite     4   the four PLN had not reached by hand
  rose_rouge      3
  techno_orage    9
  cyber_hump      1
  siberie_samuel  1

liquid_nite is the one that prompted this — PLN saw it in the catalog, wanted
it in the set, and found it half-migrated: he had walked the buttons down a
column by hand (^42 -> ^41, ^43 -> ^42) and stopped. The knobs are now on
their own columns too, and it evaluates clean.

VERIFIED, not assumed: re-plan reports 0 moves on all six; silent-eval
--seeded is OK on five. techno_orage still FAILS, on the same d2 that was
already silent before this commit — unchanged, and still PLN's call to fix or
cut. pvlint: 0 errors, 21 warnings, all pre-existing shapes (PV013 missing
family mutes, PV005 double declarations). One is worth reading: PV008 says
techno_orage's ^58 drives d5 AND d6, which is the overflow the tool annotated
rather than commented — a $-step cannot be commented out without breaking the
block's arity, so that button really does fire across two columns until gSel
folds it.

AND THE TOOL NO LONGER TALKS TO ITSELF. Every run stacked another
byte-identical FIXME paragraph above the same line: cafe_glace carried the
same note three times, and 90 files in the corpus carry 114 duplicate lines
between them. An overflow is a standing condition, not an event, so it earns
one note. The comment-out still runs on a repeat pass — if a line came back to
life it is firing across columns again whatever the note says — only the note
is deduplicated. Proven by applying twice and diffing: 15/13 both times.

Corpus-wide, 154 files still want 709 moves with zero clashes. Not tonight.
parent 0399c2d3
...@@ -68,11 +68,11 @@ d4 $ gF2 $ gM3 -- Bassline aqualgorithmique ...@@ -68,11 +68,11 @@ d4 $ gF2 $ gM3 -- Bassline aqualgorithmique
# pan 0.3 # pan 0.3
# room 0.4 # room 0.4
# octersubsub 0 # octersubsub 0
# crushbus 41 (range 16 3.5 "^53") # crushbus 41 (range 16 3.5 "^32")
# octersubsubbus 42 (range 0 2 "^33") # octersubsubbus 42 (range 0 2 "^52")
# gain 1.7 # gain 1.7
d5 $ gM3 $ gF3 -- Marimba fondamental d5 $ gM3 $ gF3 -- Marimba fondamental
$ midiOff "^58" (mask "t(<4 <2 4>>,4) t(<3!7 5>,8)") $ midiOff "^57" (mask "t(<4 <2 4>>,4) t(<3!7 5>,8)")
$ juxBy 0.4 rev $ juxBy 0.4 rev
$ note ("<[b4 [~ d5]. [fs5@3 fs5]] [e5 fs5 e5 fs5. [d5@3 fs5]]>") $ note ("<[b4 [~ d5]. [fs5@3 fs5]] [e5 fs5 e5 fs5. [d5@3 fs5]]>")
# "marimba1" # "marimba1"
...@@ -100,12 +100,11 @@ d9 $ gF3 $ gM3 -- Menace ...@@ -100,12 +100,11 @@ d9 $ gF3 $ gM3 -- Menace
# legato 2 # legato 2
# octersub 1 # octersub 1
# cut 9 # cut 9
d7 $ gM3 $ gF2 d7 $ gM3 $ gF2
-- $ ply 2 -- $ ply 2
$ midiOn "^59" (# speed "-0.25") $ midiOn "^91" (# speed "-0.25")
$ midiOn "^91" (struct "t*<8!3 [8 4]>") $ midiOn "^59" (struct "t*<8!3 [8 4]>")
$ someCyclesBy "^19" (slice 4 "<<0 <1 2>>!8 <3 3 3*2 3*<4 8>>!8>") $ someCyclesBy "^35" (slice 4 "<<0 <1 2>>!8 <3 3 3*2 3*<4 8>>!8>")
$ chop 16 $ chop 16
$ loopAt 4 $ "meth_bass:18" # cut 7 # gain 0.6 $ loopAt 4 $ "meth_bass:18" # cut 7 # gain 0.6
-- # octersubsubbus 73 (range 0 8 "^19") -- # octersubsubbus 73 (range 0 8 "^19")
......
...@@ -5,7 +5,7 @@ d1 $ "kick ~ ~ ~" # "jazz" ...@@ -5,7 +5,7 @@ d1 $ "kick ~ ~ ~" # "jazz"
d2 $ "~ ~ snare ~" # "snare:30" d2 $ "~ ~ snare ~" # "snare:30"
d3 $ "h*8" # "highhats" # "h2ogmhh" d3 $ "h*8" # "highhats" # "h2ogmhh"
d8 $ gF1 $ gM1 d8 $ gF1 $ gM1
$ midiOff "^44" (mask "t(4,8,1)" . chop 8) $ midiOff "^60" (mask "t(4,8,1)" . chop 8)
$ midiOn "^92" (ply "2") $ midiOn "^92" (ply "2")
$ loopAt 2 $ chop 8 $ loopAt 2 $ chop 8
$ "jungle_breaks:87" $ "jungle_breaks:87"
...@@ -24,7 +24,7 @@ d3 $ gF1 $ gM2 ...@@ -24,7 +24,7 @@ d3 $ gF1 $ gM2
# "h2ogmhh:2" # "h2ogmhh:2"
# gain 1.7 # gain 1.7
-- # att 0.03 # rel 0.9 -- # att 0.03 # rel 0.9
# legato (range 0.05 0.9 "^32") # legato (range 0.05 0.9 "^31")
-- d4 $ gF2 $ gM3 -- d4 $ gF2 $ gM3
-- $ note ("0(3,8) . 0(3,8)" + "f bs c . f bs c") -- $ note ("0(3,8) . 0(3,8)" + "f bs c . f bs c")
-- -- # "moog:1" -- -- # "moog:1"
...@@ -39,7 +39,7 @@ d5 $ gF3 $ gM3 -- Phone line ...@@ -39,7 +39,7 @@ d5 $ gF3 $ gM3 -- Phone line
$ "nujazz_keys125" # n "<21!16 22!6 21 21 23!8>" $ "nujazz_keys125" # n "<21!16 22!6 21 21 23!8>"
# cut 5 # cut 5
# gain 1.8 # gain 1.8
# crushbus 51 (range 16 3.5 "^54") # crushbus 51 (range 16 3.5 "^33")
# pan 0.9 # pan 0.9
# room 0.3 # room 0.3
d7 $ gF3 $ gM3 -- Laser!!! d7 $ gF3 $ gM3 -- Laser!!!
...@@ -50,13 +50,13 @@ d7 $ gF3 $ gM3 -- Laser!!! ...@@ -50,13 +50,13 @@ d7 $ gF3 $ gM3 -- Laser!!!
$ "nujazz_keys125:10" $ "nujazz_keys125:10"
# cut 7 # cut 7
# gain 1.8 # gain 1.8
# crushbus 71 (range 16 2.7 "^55") # crushbus 71 (range 16 2.7 "^35")
# pan 0.9 # pan 0.9
# room 0.3 # room 0.3
d8 $ gF1 $ gM2 d8 $ gF1 $ gM2
$ midiOff "^60" (mask "t(4,8,1)") -- Techno drum mask $ midiOff "^60" (mask "t(4,8,1)") -- Techno drum mask
$ midiOn "^36 " (loopAt 4 . (# "jungle_breaks:22")) -- Raise COMEON! $ midiOn "^36 " (loopAt 4 . (# "jungle_breaks:22")) -- Raise COMEON!
$ midiOn "^56" (loopAt 4 . (# "jungle_breaks:23")) -- Raise COMEON! $ midiOn "^36" (loopAt 4 . (# "jungle_breaks:23")) -- Raise COMEON!
$ midiOn "^92" ( -- Bouton Nassim <3 $ midiOn "^92" ( -- Bouton Nassim <3
slice 16 "[0 .. 7] . <[0 .. 7]!3 [0 1 . [2 3]]>" slice 16 "[0 .. 7] . <[0 .. 7]!3 [0 1 . [2 3]]>"
. loopAt 1 . (# "breaks165") . loopAt 1 . (# "breaks165")
......
...@@ -45,9 +45,9 @@ d4 $ gF2 $ gM3 -- THE BASSLINE GETS US TOGETHER ...@@ -45,9 +45,9 @@ d4 $ gF2 $ gM3 -- THE BASSLINE GETS US TOGETHER
# legato 2 # legato 2
# gain 1.4 # gain 1.4
# room 0.4 # cut 4 # room 0.4 # cut 4
# crushbus 41 (range 16 2.5 "^52") # crushbus 41 (range 16 2.5 "^32")
# octerbus 42 (range 0 0.95 "^32") # octerbus 42 (range 0 0.95 "^52")
# octersubbus 43 (range 0 1.5 "^32") # octersubbus 43 (range 0 1.5 "^52")
d5 $ gF3 $ gM3 -- Ton son est rose d5 $ gF3 $ gM3 -- Ton son est rose
$ midiOn "^89" (ply "4 4 4 <4 8>") $ midiOn "^89" (ply "4 4 4 <4 8>")
$ slow 2 $ slow 2
...@@ -62,8 +62,8 @@ d5 $ gF3 $ gM3 -- Ton son est rose ...@@ -62,8 +62,8 @@ d5 $ gF3 $ gM3 -- Ton son est rose
# pan 0.3 # pan 0.3
d6 $ gF3 $ gM3 -- Jorja too, she wants _you_ d6 $ gF3 $ gM3 -- Jorja too, she wants _you_
$ midiOff "^58" (mask "<f f f t>") $ midiOff "^58" (mask "<f f f t>")
$ midiOn "^54" (>| n "<40 41>") $ midiOn "^34" (>| n "<40 41>")
$ midiOff "^54" (>| n (slow 2 $ ply 2 $ "<40 40 40 41 42 43 43 44 45 ~ 45 ~>")) $ midiOff "^34" (>| n (slow 2 $ ply 2 $ "<40 40 40 41 42 43 43 44 45 ~ 45 ~>"))
$ "rose" $ "rose"
# room 0.4 # room 0.4
# cut 6 # gain 1.4 # cut 6 # gain 1.4
......
...@@ -7,7 +7,7 @@ d4 $ gF3 $ gM3 ...@@ -7,7 +7,7 @@ d4 $ gF3 $ gM3
$ note "<c3 <gs3 c4>>" -- TODO Richer progression $ note "<c3 <gs3 c4>>" -- TODO Richer progression
# "bassWarsaw" # "bassWarsaw"
# gain 1.3 # gain 1.3
# crushbus 41 (range 16 2.5 "^52") # crushbus 41 (range 16 2.5 "^32")
d5 d5
$ gF3 $ gM3 $ gF3 $ gM3
$ midiOn "^89" (ply "4 4 4 <4 8>") $ midiOn "^89" (ply "4 4 4 <4 8>")
......
...@@ -25,8 +25,8 @@ d2 $ gF1 $ gM2 ...@@ -25,8 +25,8 @@ d2 $ gF1 $ gM2
-- # note "<-0!12 -2 -2 -3 0>" -- # note "<-0!12 -2 -2 -3 0>"
# gain 1.3 # gain 1.3
d6 $ gF1 $ gM3 d6 $ gF1 $ gM3
$ midiOn "^43" (<|"~ s ~ s*<1 2>") $ midiOn "^58" (<|"~ s ~ s*<1 2>")
$ midiOff "^43" (<| "~ s") $ midiOff "^58" (<| "~ s")
$ "clap:2" $ "clap:2"
-- # note "<-0!12 -2 -2 -3 0>" -- # note "<-0!12 -2 -2 -3 0>"
-- # gain 1.3 -- # gain 1.3
...@@ -49,13 +49,14 @@ d4 $ gF2 $ gM3 -- BASS <3 ...@@ -49,13 +49,14 @@ d4 $ gF2 $ gM3 -- BASS <3
-- # bandf 100 -- # bandf 100
# gain 1.8 # gain 1.8
-- # room 0.4 # sz 0.3 # dry 1.3 -- # room 0.4 # sz 0.3 # dry 1.3
# crushbus 41 (range 16 4 "^52") # crushbus 41 (range 16 4 "^32")
# octerbus 42 (range 0 0.93 "^32") # octerbus 42 (range 0 0.93 "^52")
d5 $ gF3 $ gM3 -- Rain piano <3 d5 $ gF3 $ gM3 -- Rain piano <3
$ (0.05 ~>) $ (0.05 ~>)
$ midiOn "^41" (mask "<t f>")-- Mask norepeat $ midiOn "^57" (mask "<t f>")-- Mask norepeat
$ midiOn "^90" (slice 2 "<0 0 1 1>") $ midiOn "^89" (slice 2 "<0 0 1 1>")
$ midiOn "^34" ((>| n "<<4!4 34 4!3> 4 33 <34 4>>")) -- ORAGE INFINI $ midiOn "^33" ((>| n "<<4!4 34 4!3> 4 33 <34 4>>")) -- ORAGE INFINI
-- FIXME(#94) d5 drives more controls than the grid gives it (BT5 + BL5). ^58 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^58 for its new owner also moves this. NOT commented out: this is a `$`-step and something above it is a partial application waiting for it, so removing it would stop the whole block compiling. Fold it onto d5's own control with gSel.
$ midiOn "^58" ((>| n "5/2")) -- Pluie infinie! $ midiOn "^58" ((>| n "5/2")) -- Pluie infinie!
$ slow 4 $ ply "4 . 2 0" -- Slowly, loop 4 times each $ slow 4 $ ply "4 . 2 0" -- Slowly, loop 4 times each
$ n "<~ 6 7 8 8 8 7 8 9 10 11 12 13 14 13 12 17 18 19 20 17 18 20 20 17 18 19 20 21 23 22 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 37 37 38 37 38 39 ~ 37 ~ ~ 38 38 38 39 ~>" # "orage" $ n "<~ 6 7 8 8 8 7 8 9 10 11 12 13 14 13 12 17 18 19 20 17 18 20 20 17 18 19 20 21 23 22 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 37 37 38 37 38 39 ~ 37 ~ ~ 38 38 38 39 ~>" # "orage"
...@@ -64,9 +65,10 @@ d5 $ gF3 $ gM3 -- Rain piano <3 ...@@ -64,9 +65,10 @@ d5 $ gF3 $ gM3 -- Rain piano <3
-- 6 == Loop Orage -- 6 == Loop Orage
# "orage" # "orage"
# cut 5 # cut 5
# octersubbus 51 (range 0 2 "^18") # octersubbus 51 (range 0 2 "^53")
# octerbus 52 "^34" # octerbus 52 "^33"
# crushbus 53 (range 16 5 "^54") -- FIXME(#54) d5 drives more controls than the grid gives it (B5 + C5). ^54 now belongs to another orbit, so the line(s) below are COMMENTED OUT rather than left firing across columns. Nothing is lost — restore by removing the dashes once gSel folds this onto d5's own control.
-- # crushbus 53 (range 16 5 "^54")
# room 0.3 # sz 0.4 # room 0.3 # sz 0.4
# gain 1.6 # gain 1.6
# lpf 4500 # lpf 4500
...@@ -86,12 +88,12 @@ d9 $ gF2 $ gM3 -- ACID Doutes TODO Moins criard ...@@ -86,12 +88,12 @@ d9 $ gF2 $ gM3 -- ACID Doutes TODO Moins criard
d8 $ gF1 $ gM2 -- Break discret face à une telle idole d8 $ gF1 $ gM2 -- Break discret face à une telle idole
$ midiOn "^60" (mask "t(4,8,<1!3 0>)" . chop 8) $ midiOn "^60" (mask "t(4,8,<1!3 0>)" . chop 8)
-- $ midiOn "^36" (id . (loopAt 0.5 . (# "jungle_breaks:130"))) -- $ midiOn "^36" (id . (loopAt 0.5 . (# "jungle_breaks:130")))
$ whenmod 64 8 (midiOff ("^56" +"^36") ( $ whenmod 64 8 (midiOff ("^36" +"^56") (
slice 4 "0 1 2(<2!8 3!8>,8) 3*<1 1 4 [2 8]>") slice 4 "0 1 2(<2!8 3!8>,8) 3*<1 1 4 [2 8]>")
) )
$ midiOn "^92" (mask "t(16,32)" . ply "2 2 <4 8 16 16> 2") $ midiOn "^92" (mask "t(16,32)" . ply "2 2 <4 8 16 16> 2")
$ midiOn "^36" (loopAt 0.5 . (# n 45)) -- Orleanaise $ midiOn "^56" (loopAt 0.5 . (# n 45)) -- Orleanaise
$ midiOn "^56" (loopAt "0.5 <0.5!3 <0.25 [1]>>" . (# n 14)) $ midiOn "^36" (loopAt "0.5 <0.5!3 <0.25 [1]>>" . (# n 14))
$ chop 16 $ chop 16
$ loopAt 4 $ loopAt 4
$ "jungle_breaks:12" # cut 8 $ "jungle_breaks:12" # cut 8
......
...@@ -480,6 +480,15 @@ def rewrite(path: Path, res: dict) -> tuple[int, list[str]]: ...@@ -480,6 +480,15 @@ def rewrite(path: Path, res: dict) -> tuple[int, list[str]]:
f"one physical control.", f"one physical control.",
[], f"d{orbit} ^{cc} CLASH -> ^{dest} at line {line}")) [], f"d{orbit} ^{cc} CLASH -> ^{dest} at line {line}"))
# IDEMPOTENCE. Re-running the tool used to stack a byte-identical FIXME on
# top of the last one every time: cafe_glace carried the same paragraph
# three times over, and the one file nobody re-reads is the one being
# re-annotated. An overflow is a standing condition, not an event, so it
# gets one note — a second copy adds no information and buries the score it
# is attached to. Matched on the stripped text, so indentation drift does
# not defeat it.
already = {ln.strip() for ln in lines}
# Bottom-up so earlier line numbers stay valid as we insert. # Bottom-up so earlier line numbers stay valid as we insert.
for anchor, fixme, hits, note in sorted(edits, key=lambda e: e[0], reverse=True): for anchor, fixme, hits, note in sorted(edits, key=lambda e: e[0], reverse=True):
for i in sorted(hits, reverse=True): for i in sorted(hits, reverse=True):
...@@ -487,6 +496,11 @@ def rewrite(path: Path, res: dict) -> tuple[int, list[str]]: ...@@ -487,6 +496,11 @@ def rewrite(path: Path, res: dict) -> tuple[int, list[str]]:
indent = stripped[: len(stripped) - len(stripped.lstrip())] indent = stripped[: len(stripped) - len(stripped.lstrip())]
nl = "\n" if lines[i - 1].endswith("\n") else "" nl = "\n" if lines[i - 1].endswith("\n") else ""
lines[i - 1] = f"{indent}-- {stripped.lstrip()}{nl}" lines[i - 1] = f"{indent}-- {stripped.lstrip()}{nl}"
# The comment-out above still runs on a repeat pass: if a line came back
# to life it is firing across columns again, whatever the note says.
# Only the NOTE is deduplicated.
if fixme.strip() in already:
continue
indent = re.match(r"\s*", lines[anchor - 1]).group(0) indent = re.match(r"\s*", lines[anchor - 1]).group(0)
lines.insert(anchor - 1, f"{indent}{fixme}\n") lines.insert(anchor - 1, f"{indent}{fixme}\n")
notes.append(note) notes.append(note)
......
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