Commit f6be5205 by PLN (Algolia)

feat(surface): no d7 while d6 sits empty — 150 orbits compacted

PLN: "part of the migration also: no d7 when d6 is free. d7 often was sefcond
melo, should be a d6 now d6 ids not a shitty mapped knob, but a proper column
like others".

That is the history exactly. d6's knob used to be somewhere useless, so a
second melody went to d7 and d6 was left empty; since the column remap every
one of d4-d8 owns a fader, a B knob and a C knob, so the reason is gone and
only the habit remains. A set with a hole at d6 wastes a whole column.

150 moves in 133 files. `d7 -> d6` is most of it; a lone melody with both
slots free compacts to d5.

THE BAND IS {5, 6, 7} AND IT IS DERIVED, NOT DECREED. An orbit number decides
which family DJ filter and which family mute the part answers to. From the
authored grid, d5/d6/d7 share both maps, so a move between them changes
nothing about the sound — while d4 is the bass (gF2) and d8 is percussion
(gF1/gM2), so compacting into or out of those would silently re-assign which
filter sweeps the part and which button drops it. The tool computes the band by
asking lcxl_grid which orbits agree with d6 on both families, so if the grid
ever changes, the band follows instead of rotting.

It refuses rather than guesses: 7 orbits carry an explicit `# orbit N`, which
overrides the output orbit independently of the `dN` name, so renaming the
declaration alone would move the pattern's identity and leave its AUDIO behind.
Comments are never rewritten — a commented `-- d7 $ …` is an alternative to
re-enable mid-set. Bus slots (`crushbus 71`) and `cut` groups stay put: a bus
id is an audio-graph edit and a cut group is a choke group, not an orbit.

VERIFIED: re-plan reports 0 moves left. silent-eval --seeded re-run over all
703 files and diffed per-file against the pre-migration baseline — zero verdict
changes, 703/703 joined. And the declaration multiset of every one of the 133
files is a pure permutation inside the band, with nothing outside it touched:
no pattern was dropped and no orbit was declared twice where it was not
already. That last check exists because a naive compaction fusing two blocks'
melodies onto one orbit would be silent, not loud — the later declaration wins.
parent 165abe8b
......@@ -28,7 +28,7 @@ d4 $ gF2
$ "bass_commodore:6" # cut 4
# midiG' "^81" 0 1.2
# crushbus 41 (range 16 1.2 "^32")
d7 $ gF2 -- ACID BUS
d5 $ gF2 -- ACID BUS
$ midiOn "^91" (slice 32 ("<0 0 0 0 0 1 1 1 0 1 2 2 0 2 2 3>*4"))
$ midiOff "^91" (slice 8 "<0 1 2 3>")
$ loopAt 8 $ "synth_commodore:0"
......
......@@ -38,12 +38,12 @@ d4
# pan 0.1
# lpf 4500
# gain 0.6
d6 -- Rare night alarm
d5 -- Rare night alarm
$ note "c4/8"
# "giorgio_syn:3"
# cut 6
# gain 0.34
d7 -- INFRA BASSLINE TODO Trop carré
d6 -- INFRA BASSLINE TODO Trop carré
$ note (scale "aeolian"
"<0!8 [0 . <2 0> 0 ~]!8> 4 <0!4 7 0 4 <7 0>> 3"
)
......
......@@ -46,7 +46,7 @@ d5 $ gF3 $ gM3 -- MAIN CRUTCH
# cut 5
# pan 0.3
# gain 1.4
d7 $ gF3 $ gM3 -- SIDE CRUTCHES
d6 $ gF3 $ gM3 -- SIDE CRUTCHES
-- $ slice 4 "<0 1 2 3>"
$ chop 8
$ loopAt 2
......
......@@ -42,7 +42,7 @@ d8 $ gF1 $ gM2
$ "jungle_breaks:45"
# cut 8
# gain 1.5
d6 $ gF1 $ gM3 -- HAWKS
d5 $ gF1 $ gM3 -- HAWKS
-- $ mask "<f!16 t!16>"
$ "~ [s s*2] ~ [s*<1!3 2> <~!3 s*<1 2>>]"
# "armora:1"
......@@ -54,7 +54,7 @@ d6 $ gF1 $ gM3 -- HAWKS
# sz 0.01
# dry 1.025
# gain 1.5
d7
d6
$ gM3 $ gF3 -- High carillon!
$ midiOn "^59" (off "[e,s]" (ply "<1 2>") . (# legato "e"))
$ midiOn "^91" ( -- Basse reponse
......
......@@ -19,7 +19,7 @@ d3 $ gF1 $ gM2
$ "dr*[8 <8 16 24 [8 <4 8 16 <4 8>>]>]"
# gain 1.2
# "rampleS37:5"
d7 $ gF1 $ gM3
d5 $ gF1 $ gM3
$ "~ h ~ h ~ h*<1 <2 4>> ~ h*<2 1>"
# gain 1.1
# "rampleD2:3"
......
......@@ -36,7 +36,7 @@ d5 $ gF2 $ gM3
# midiG' "^80" 0 1.5
# crushbus 51 (range 16 2.5 "^33")
# octersubbus 52 (range 0 2.5 "^53")
d7 $ gF1 $ gM3
d6 $ gF1 $ gM3
$ loopAt 2
-- $ chop 16
$ slice 4 "0 <~!4 1!4> <~!8 2!8> 3"
......
......@@ -14,4 +14,4 @@ d2 $ gM2 -- Clap timer
# lpf 2000
# gain 1.2
d4 $ "90s_matrix:0/4" # cut 4
d7 $ "90s_synatm:0" # cut 7
d5 $ "90s_synatm:0" # cut 7
......@@ -29,7 +29,7 @@ d3 $ g
-- FIXME(#54) d3 drives more controls than the grid gives it (B3 only (C1-3 are the family gF filters)). ^52 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 d3's own control.
-- # leslie (range 0 2 "^52")
# midiG' "^80" 0 1.52
d6 -- Runny Maracas
d5 -- Runny Maracas
$ g
$ whenmod 16 8 (often $ fast 2)
$ someCyclesBy "<1!16 0!16>" (often $ slow "2!3 1")
......
......@@ -38,7 +38,7 @@ $ note ("<<0 3> <0 3> <0 -4> <0 -4>>" +
# s "bass3"
# gain 0.8
d6 $ s "birds/4" # n (irand 16)
d5 $ s "birds/4" # n (irand 16)
# speed (range 0.5 2 rand)
# gain 0.7
......
......@@ -37,4 +37,4 @@ $ "moogBass"
# note ("<0!4 3!4>" + "0 -2")
# gain 0.75
d6 $ s "cp:1/4"
d5 $ s "cp:1/4"
......@@ -36,7 +36,7 @@ $ note (
# voice (slow 32 $ range 0.1 0.25 sine)
# gain 0.8
d6
d5
$ superimpose (
swing 2 . arp "up|downup"
. (# sustain 0.5)
......@@ -47,7 +47,7 @@ $ note (scale "aeolian" (slow 4 $ "c4'major'<c4 f4 b3 c4>'six")
# sustain 1
# gain 0.7
d7 -- moineau roll!
d6 -- moineau roll!
$ fast "[<1 <2 [2 4]>> <1 1 1 [2 1]>]"
$ s "birds3*8"
# n "2|3"
......
......@@ -48,7 +48,7 @@ d4 -- Guitar lead contretemps!
# gain (slow 16 $ range "<1!16 0.65!16>" "<0.5!16 0.65!16>" isaw)
# room (slow 16 $ range 0.3 0.7 saw)
# sz 0.4
d7 -- Cuivres lancinants
d6 -- Cuivres lancinants
$ mask "<t!8 f!56>"
$ swing 2
$ slow 2
......@@ -73,7 +73,7 @@ d9--- piano descente en conclusion`
-- Fguitar 20 chaleureuse breaks?
-- region SANDBOX
d6 -- Cuivre riff concluant!
d5 -- Cuivre riff concluant!
-- $ mask "<f!14 t f f!12 t!4>"
-- $ whenmod 4 3 (slice 4 "0*<2 4>")
$ loopAt 2
......
......@@ -43,7 +43,7 @@ d5 -- Telephone
# cut 5
# gain 0.5
# pan 0.9
d7
d6
$ degradeBy (slow 32 $ range 1 0.5 saw)
$ fix ((# gain 0.55) . (# pan 0.6) . (# cut 72)) (n 8) -- CRASH
$ fix ((# gain 0.6) -- Siren
......
......@@ -140,7 +140,7 @@ d10 $ g -- Events timings
$ every' 166 1 ((>| note (arpeggiate "a'maj'4")) . (# gain "0.5!3 0.6")) -- CLAP
$ note "a" # "cpluck:4" # gain 0
# pan 0.4
d7 $ g -- Side high cello
d6 $ g -- Side high cello
$ whenRouge (someCyclesBy 0.8 (off "0.625" (|+ pan 0.18)))
$ someCyclesBy 0.2 (degrade)
$ whenmod 8 4 (superimpose (
......
......@@ -37,7 +37,7 @@ d5 $ gF3 $ gM3
# "FMRhodes1"
# gain 1.4
# modIndex (range 0 4 "^33")
d7 $ gF1 $ gM3 $ loopAt 1 $ chop 16 $ "jungle_breaks:100" # cut 7 # gain 1.3
d6 $ gF1 $ gM3 $ loopAt 1 $ chop 16 $ "jungle_breaks:100" # cut 7 # gain 1.3
d8 $ gF1 $ gM2
$ midiOff "^60" (mask "t(4,8,f)" . chop 8)
$ chop 8
......
......@@ -141,7 +141,7 @@ d5 $ gF3 $ gM3 -- v1: Avec deux progs incertaines, pas d'arp
-- # gain 1.3
-- # att 0.05
-- # rel 2
d7 $ gF3 $ gM3 -- Rhodes arpege pour couplet
d6 $ gF3 $ gM3 -- Rhodes arpege pour couplet
$ whenmod 128 64 (# silence)
$ somecyclesBy "<0!8 0!32 0!32 0!32 1!8>" (|* gain (range 1 0.5 (slow 8 $ saw)))
$ somecyclesBy "<1!8 0!32 0!32 0!32 0!8>" (|* gain (range 0.5 1 (slow 8 $ saw)))
......
......@@ -107,7 +107,7 @@ d5 $ gF3 $ gM3 -- Rhodes/Keys, les moulins qui tournent doucement
# room 0.45
# gain 1.3
d7 $ gF3 $ gM3 -- Violoncelle / Guitare blues, la mémoire du voyage
d6 $ gF3 $ gM3 -- Violoncelle / Guitare blues, la mémoire du voyage
-- blues_guitar_*_60 = 60 BPM donc loopAt 0.5 pour revenir à 120
$ midiOn "^59" (# silence)
$ loopAt 0.5
......
......@@ -15,7 +15,7 @@ d3 $ gF1 $ gM1
# "hh"
# gain 1.4 # cut 3
# pan "<0.2!4 0.8!4>"
d7 $ gF3 $ gM3
d6 $ gF3 $ gM3
$ off "0.25" ( -- CHIPMUNK GLUCKSMAN
(# cut 71)
. (fix (# gain 0) (n "<0>"))
......
......@@ -71,7 +71,7 @@ d5 $ gF3 $ gM3
-- # cut 4
# modIndex (range 0 4.5 "^33")
-- # octersubbus 42 (range 0 3.5 "^33")
d7 $ gF3 $ gM3 $ "vocalOoh1/2" # n "<4 5>" # cut 7
d6 $ gF3 $ gM3 $ "vocalOoh1/2" # n "<4 5>" # cut 7
# gain 1.2
# room 0.3
d8 $ gF1 $ gM2
......@@ -99,7 +99,7 @@ d11
# room 0.3
# gain 1.3
d7 $ gF1 $ gM3
d6 $ gF1 $ gM3
$ slow 1
-- $ midiOn "^91" (ply "<[2 <2!4 4!3 8>] <2!4 8!3 [8 4]> 2 4>")
-- $ jux rev
......
......@@ -75,7 +75,7 @@ d11 $ gF2 $ gM3 -- Caring cello
# "cpluck:0"
# cut 11
# gain 1.4
d7 $ gF1 $ gM3
d6 $ gF1 $ gM3
$ midiOn "^91" ( -- Bouton Nassim <3
slice 16 "[0 .. 7] . <[0 .. 7]!3 [0 1 . [2 3]]>"
. loopAt 0.5 . (# "breaks165")
......
......@@ -45,7 +45,7 @@ d4 $ gF2
# pan 0.1
# crushbus 41 (range 16 2.5 "^32")
# midiG' "^81" 0 1.4
d6 $ gF3
d5 $ gF3
$ midiOn "^90" (ply "4 <4 8>")
-- FIXME(#94) d6 drives more controls than the grid gives it (BT6 + BL6). ^59 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^59 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 d6's own control with gSel.
-- FIXME(#94) d6 drives more controls than the grid gives it (BT6 + BL6). ^59 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^59 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 d6's own control with gSel.
......@@ -69,7 +69,7 @@ once $ "[kick:5,kick:4,808bd:8]"
# lpf 200
# gain 0.8
d7 $ gF3 $ gM3 -- High Dauphin
d6 $ gF3 $ gM3 -- High Dauphin
$ struct "t@2 t*<1 2 1 <4 1>> t*<1 2 4 8>"
$ note (
"<[g4 c ef@14] [<c g> ef g@14] <[g4 c ef@14] [c5 bf5 g5@14]> [c ef d@13 ~]>"
......@@ -104,7 +104,7 @@ d4 $ gF2 $ slow 2 -- Basse Baleine
# pan 0.4
# crushbus 41 (range 16 2.5 "^32")
# midiG' "^81" 0 1.3
d6 $ gF3 $ gM3 -- Leads reponse
d5 $ gF3 $ gM3 -- Leads reponse
-- FIXME(#94) d6 drives more controls than the grid gives it (BT6 + BL6). ^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 d6's own control with gSel.
$ midiOn "^58" (struct "t*<16 32>") -- Basse folle
$ midiOn "^58" (|+ note 12)
......
......@@ -38,7 +38,7 @@ d5 $ gM3 $ gF2
# crushbus 51 (range 12 2.4 "^33")
# cut 5
# gain 0.6
d7 $ gM3 $ gF3 -- Keys of Paradise
d6 $ gM3 $ gF3 -- Keys of Paradise
$ midiOn "^91" (ply 2 . (# freeze 0.2))
$ slice 4 "<[0 1] [2 3*<1 4>] [0 1] [2 1(<1 3>,8)]>"
$ "nujazz_keys120:25/2"
......
......@@ -71,7 +71,7 @@ d5 $ gF3 $ gM3
# attack (0.01 + (rand * 0.02)) -- Slight timing humanization
# release (slow 16 $ range 0.8 1.5 sine)
# crushbus 41 (range 16 3.5 "^53")
d7 $ gF3 $ gM3
d6 $ gF3 $ gM3
$ slow 16 $ chordsRoot -- Very slow, ambient
-- |+| n "[0,7] ~ ~ ~ [7,12]? ~ ~ ~" -- Fifth chords, sparse hits
|+| n "[0,7] ~ [0,7,12]? ~ ~ ~ [7,12] ~" -- Alt: More hits, triple voicing
......
......@@ -49,7 +49,7 @@ d11 $ gF3 $ gM3
$ slow 2
$ "cricri" # n "<0 1 2 3>"
# pan 0.3
d7 $ gF1 $ gM3
d6 $ gF1 $ gM3
-- $ fast 2 $ ply 2 $ slice 2 "<0 0 0 1>"
$ juxBy 0.2 (rev)
$ loopAt 2
......
......@@ -45,7 +45,7 @@ d4 $ gF2 $ gM3
# gain 1.5
# crushbus 41 (range 16 2.5 "^32")
# octersubbus 42 (range 0 2.5 "^52")
d7 $ gF3 $ gM3
d6 $ gF3 $ gM3
$ midiOn "^59" ((ply "8 <16 [16 32]>"))
$ slow 2
$ slice 4 ("<0 1 2 3>")
......
......@@ -42,7 +42,7 @@ d11 $ gM3 $ gF3
-- # tremdp 0.8
-- # tremr "<2 4 4 <8 16>>"
# gain 1.2
d7 $ gF1 $ gM3 -- SCRATCH
d6 $ gF1 $ gM3 -- SCRATCH
$ midiOn "^91" (ply "2 4 <8 8 4 16>")
$ midiOn "^35" (# n 13)
$ midiOn "^59"(# n 15)
......
......@@ -58,7 +58,7 @@ d8 $ gF1 $ gM2 -- Break populaire
$ "jungle_breaks:18"
# gain 0.85
# pan "0.68 0.42 0.42 0.68"
d7 $ gF1 $ gM3 -- SECOND BREAK!!?!
d6 $ gF1 $ gM3 -- SECOND BREAK!!?!
$ midiOn "^91" (ply 2)
$ midiOn "^35" (loopAt 1 . (|> "jungle_breaks:19"))
$ midiOn "^59" (slice 8 (run "8 <8!3 16>"))
......
......@@ -61,7 +61,7 @@ d5 $ gM3 $ gF3 -- Suns of Gold Keys, samples
# tremrbus 51 (range 0 "<0 8>" "^78")
# tremdp 2
# gain 1.2
d7 $ gM3 $ gF3 -- Suns of Gold Guitars, sampled and cut
d6 $ gM3 $ gF3 -- Suns of Gold Guitars, sampled and cut
$ superimpose ((# cut 71) .
(# crushbus 73 (range 16 2.9 "^35")) -- CRASH THIS GUITAR
)
......
......@@ -36,7 +36,7 @@ d5 $ gF3 $ gM3
# room 0.5
# crushbus 51 (range 10 1.8 "^33")
# sz 0.8 # dry 1.2
d7 $ gF3 $ gM3
d6 $ gF3 $ gM3
$ midiOn "^91" (ply "2 <2 4 4 8>")
$ midiOn "^59" (# n 4)
$ mask "<t f f f t f t t>"
......
......@@ -71,7 +71,7 @@ d5 $ gF3 $ gM3 -- Les ptites keys de fin de session tranquilou
# crushbus 51 (range 16 3.5 "^33")
# pan 0.9
# room 0.3
d7 $ gF3 $ gM3 $ "trance_amb:0/2" # cut 7
d6 $ gF3 $ gM3 $ "trance_amb:0/2" # cut 7
d8 $ gF1 $ gM2
$ midiOff "^60" (mask "t(4,8,1)") -- Techno drum mask
$ midiOn "^36 " (loopAt 4 . (# "jungle_breaks:22")) -- Raise COMEON!
......
......@@ -48,7 +48,7 @@ d4 $ gF2 $ gM3 -- TODO REWORK
# cut 4
-- FIXME(#54) d4 drives more controls than the grid gives it (B4 + C4). ^17 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 d4's own control.
-- # scram (range 0 0.72 "^17")
d7 $ gF3 $ gM3 -- Apollo call
d6 $ gF3 $ gM3 -- Apollo call
$ note ((scale "phrygian" "0 2@2 3@3 <2!3 5 6 6 7 [9 9]>@2")
- 1 -- Fondamentale: re
- 12 -- Octave: -1
......
......@@ -46,7 +46,7 @@ d5 $ gF3 $ gM3
$ "law_adri"
# cut 5
# pan 0.8
d7 $ gF3 $ gM3
d6 $ gF3 $ gM3
$ midiOn "^91" (ply "<2 2 [4 2] 8>")
$ "law_adri"
# n "<4!4 5!4 5!4 8 8 5 89 10 9*2 9*2 11 12 13 14>"
......
......@@ -33,7 +33,7 @@ d4 $ gF2 -- La base
$ "han" # n "<0!4 1!4>"
# midiG' "^82" 0 2
# cut 4
d6 $ gF2 -- La basse
d5 $ gF2 -- La basse
$ loopAt 2
$ slice 8 (run 8)
-- $ superimpose (# crushbus 41 (range 16 4 "^53"))
......
......@@ -39,7 +39,7 @@ d4 $ gF3
# pan 0.3
# legato 0.75
# midiG' "^81" 0 0.7
d6 $ gF3
d5 $ gF3
-- $ slow 2
$ note "c [c d ef] c [c d ef] c [c d ef] c [c <ef f g gs> <f g gs as>]"
# "harpsichord1"
......@@ -48,7 +48,7 @@ d6 $ gF3
# pan 0.3
# legato 0.5
# midiG' "^82" 0 0.7
d7 $ gF2
d6 $ gF2
--
-- 9 │ //Standard Values
-- 10 │ out = 0, pan = 0, freq = 440, amp = 0.5, gate = 1,
......@@ -85,7 +85,7 @@ once $ "c c " "phazer"
# gain 0.8
# cut 3
d6 $ gM3 $ gF3
d5 $ gM3 $ gF3
$ chop 4
-- $ slice 4 "<0 1 2 3>"
$ loopAt 4
......
......@@ -40,7 +40,7 @@ d5 $ f1
# pan 0.3
# crushbus 5 (range 10 3.5 "^33")
# midiG' "^81" 0 1.2
d7 $ f3
d6 $ f3
$ someCyclesBy "<1!6 <0 1> 0!1>" (# gain 0)
$ "<t t*4>" # "tek_end:2"
# midiG' "^84" 0.2 0.8
......
......@@ -100,7 +100,7 @@ d9 $ gF3 $ gM3 -- Menace
# legato 2
# octersub 1
# cut 9
d7 $ gM3 $ gF2
d6 $ gM3 $ gF2
-- $ ply 2
$ midiOn "^91" (# speed "-0.25")
$ midiOn "^59" (struct "t*<8!3 [8 4]>")
......
......@@ -21,7 +21,7 @@ d4 $ gF2 $ gM3
# gain 1.7
# crushbus 41 (range 16 2.5 "^32")
# octerbus 42 (range 0 1.2 "^52")
d7 $ gF3 $ gM3
d6 $ gF3 $ gM3
$ midiOn "^91" (slow 1 . slow 2 . slice 8 "0 1 2 3*<1 <2 4>> 4*2 5*2 [6 7]*<1 <2 4>> 7*4")
$ midiOn "^59" (slice 8 "0 1 2 3")
$ "praise:1/2"
......
......@@ -59,7 +59,7 @@ d5 $ gF2 $ gM3
# cut 5
# gain 1.4
# squizbus 51 (range 0 2.5 "^33")
d7 $ gF3 $ gM3 -- "FIXME ACID WEIRD NOT GOOD" — found it, 2026-08-02. THREE collisions
d6 $ gF3 $ gM3 -- "FIXME ACID WEIRD NOT GOOD" — found it, 2026-08-02. THREE collisions
-- with d4's moog bass, all invisible in the code and all audible:
-- cut 4 -> every acid note truncated the bass and vice versa
-- crushbus 41 -> ONE crush instance, ^35 and ^32 fighting over it
......
......@@ -53,7 +53,7 @@ d9 $ gF3 $ gM3
# delaybus 91 (range 0 0.9 "^19")
# delayt 0.25
# delayfbbus 92 (range 0 0.4 "^19")
d7 $ gF3 $ gM3
d5 $ gF3 $ gM3
$ note "[ef fs bf ef4]" # "FMRhodes1"
d8 $ gF1
$ gM2
......
......@@ -51,7 +51,7 @@ d5 $ gF3 $ gM3 -- LE PIMENT BRESILIEN
# room 0.3
# octerbus 51 (range 0 1.4 "^33")
# octersubbus 52 (range 0 4 "^53")
d7 $ gF3 $ gM3
d6 $ gF3 $ gM3
-- PLN: "on 59 a different progression, maybe going updowndown rather than
-- upupup?". E7, d7's own gate. The octave line below climbs 0 +12 +24 +36 over
-- 16 cycles — three steps UP, always. Held, ^59 adds 0 0 -24 -48 on top, which
......
......@@ -43,7 +43,7 @@ d5 $ gF3 $ gM3
# modIndex (range 0 32 "^53")
# gain 1.7
# delay 0.4 # delayfb 0.5 # delayt 0.125
d7 $ gM3 $ gF1
d6 $ gM3 $ gF1
-- $ midiOn rev
$ chop 16
-- $ loopAt 4
......
......@@ -49,7 +49,7 @@ d12 $ gM3 $ gF3
-- # tremdp 0.8
-- # tremr "<2 4 4 <8 16>>"
# gain 1.2
d7 $ gF1 $ gM3 -- SCRATCH
d6 $ gF1 $ gM3 -- SCRATCH
$ midiOn "^91" (ply "2 4 <8 8 4 16>")
$ midiOn "^35" (# n 15)
$ midiOn "^59" (# n 15)
......
......@@ -107,7 +107,7 @@ d10 $ gF2 $ gM3 -- Menace
# crushbus 101 (range 16 3.5 "^14")
# legato 2
# cut 9
d7 $ gM3 $ gF2
d6 $ gM3 $ gF2
-- $ ply 2
$ midiOn "^91" (# speed "-0.25")
$ midiOn "^59" (struct "t*<8!3 [8 4]>")
......
......@@ -46,7 +46,7 @@ d8 $ gF1 $ gM2 -- BROKEN BEAT | BREAKS STACK
# pan 0.7
# gain 1.45
# lpf 4000
d7 $ gF1 $ gM3
d5 $ gF1 $ gM3
$ midiOff "^59" (mask "t(4,8,1)" . chop 4)
-- $ jux (rev . (# cut 71))
-- $ slice 16 (run 8)
......
......@@ -37,7 +37,7 @@ d4 $ gF2 $ gM3 -- BASSE SIMPLE
# "rampleU4"
-- # crushbus 42 (range 16 2 "^33")
# cut 4
d7 $ gF2
d6 $ gF2
$ midiOn "^91" (ply "<1 2> <2!3 4 4!3 8>")
$ slice 8 ("[0 1 2 3]*2" + "<0!4 3!4>")
-- $ loopAt 8
......
......@@ -69,7 +69,7 @@ d4 $ gF2 $ gMask $ gMute
$ "breaks165"
# panbus 4 (slow 16 $ range 0.2 0.6 sine)
# midiG' "^81" 0 1.3
d7 $ gF3 $ gMute $ gMask
d5 $ gF3 $ gMute $ gMask
$ midiOn "^91" (ply "2 <2 4>")
$ loopAt 4 $ chop 8
$ midiOn "^59" (# n 4)
......
......@@ -13,7 +13,7 @@ $ s "b? ~ s ~ ~ b s <~ <~ <~ s>>>"
d3 -- drumroll
$ fast "4 <8 16>" $ s "drum:2" # gain 0.9
d6
d5
$ whenmod 32 24 ( -- final trompette!
superimpose (const $ slow 2 $ s "~ ~ <b ~ b b?> ~"
# s "brass:6" # gain 0.6)
......@@ -26,7 +26,7 @@ $ s "brass:2/2"
# gain 0.5
# cut 1
d7 -- toys
d6 -- toys
$ every' 16 15 ( -- petit coup
superimpose (const $ s "~ ~ brass:9 ~"))
$ every 16 ( -- intense!
......@@ -89,7 +89,7 @@ $ note (scale "major" "0 0 5 <-1>")
d4 $ s "superpiano"
d7 -- noise
d6 -- noise
$ euclid "<3 3 5 1>" 8
$ s "glitch:5"
# gain 0.7
......
......@@ -45,7 +45,7 @@ d4 $ g -- Piano contretemps quinte-ish
+ "[0,<7 7 5 5 7 7 7 3>]")
# "superpiano"
# velocity 0.39
d6 -- Distant guitar
d5 -- Distant guitar
$ g
$ mask "<<f t>!24 f!8 t!8 f!8 t!16>"
$ "g(<[1 5]!4 5 1 3 10>,16)"
......
......@@ -28,7 +28,7 @@ $ s "dr*8"
# n 0
d6 -- bass
d5 -- bass
$ whenmod 16 10 ( fast 2)
$ superimpose (|+ note "<3 3 10 3>")
$ note (scale "aeolian" "<c(3,8) a5>")
......@@ -49,7 +49,7 @@ $ sound "bd"
# gain 0.5
# legato 2
d7 -- musical forks
d6 -- musical forks
$ off 0.25 ((# room 0.5) . (|- 12))
$ superimpose (|+ note "< 5 3 2 0>")
$ s "f f f <f <f*2 ~>>"
......
......@@ -26,7 +26,7 @@ $ s "[~ hh ~ <hh [hh ~ hh]>]*2"
# gain 1.4
d6 -- white noise
d5 -- white noise
$ whenmod 64 48 (degradeBy 0.9)
$ rarely (off 0.5 id)
$ sometimes (jux rev)
......
......@@ -23,7 +23,7 @@ $ whenmod 16 8 (off 0.125 id)
$ sometimes (# s "dr")
$ s "hh(<4 4 3 4>,8)"
d7
d5
$ degrade
$ s "~ bogdan/8" # cut 1
# n (irand 10)
......
......@@ -30,7 +30,7 @@ d3 $ note ( scale "major" (
# voice 0.01
# gain 0.8
d7 -- choeur!
d5 -- choeur!
$ note (scale "major" "[0,3,<<~ 7> 5>]/2")
# s "kaamelott:1"
# end 0.04
......
......@@ -68,7 +68,7 @@ $ note (scale "major" "<0!2 2 4 -2>")
# octave 2
# gain 0.65
d7
d6
$ segment (slow 8 "<1 <2 4>>") -- Light to tornado
-- $ sometimesBy "<0.75!3 0.1>" (arp "updown")
$ note ("<f e d <d!2 e f>>" + "c'maj'5")
......
......@@ -42,7 +42,7 @@ $ note "0"
# gain 0.8
# note (scaleBocal - 24)
d7 -- aigu fou
d6 -- aigu fou
$ whenmod 128 65 (# gain 0.6)
$ whenmod 128 64 (# gain (0.6 * tri))
$ degradeBy (slow 4 $ "<0,0.05 .. 0.5>")
......@@ -55,7 +55,7 @@ $ s (slow 1 $ "<b [b b? <~ b> <~ b?>] b*4 <b*8 [b*4 b]>>")
# velocity (slow 32 $ sine * 0.3 + 0.5)
# gain 0
d6 -- Sirene occasionelle accordée
d5 -- Sirene occasionelle accordée
$ whenmod 64 32 (# gain 0.5)
$ s "supersiren/4"
# note scaleBocal
......
......@@ -64,7 +64,7 @@ d4 -- BASSES
$ "[matrix,infra]"
# cut 4
# midiG' "^81" 0 1.5
d6 $ f2 -- VOICES
d5 $ f2 -- VOICES
$ fix ( -- Morohai Morshiyum Morohai Naroz
(# "voices_celtic:32")
. ply ("<1!3 4>")
......@@ -85,7 +85,7 @@ d6 $ f2 -- VOICES
) "wooh"
$ stack ["~ <~!3 wooh>", "<morohai ~>"]
# midiG' "^83" 0 1.5
d7 $ f2 -- LEADS
d6 $ f2 -- LEADS
-- Pad-like choir
-- $ whenmod 4 3 (off "0.25" (|+ note 12))
$ fix (
......
......@@ -53,7 +53,7 @@ $ note (scale "melodicMajor" "[0 | 0*2] <3 3 2 2> <5 5 5 [5|5|5|9]> 7")
# pan 0.2
# gain 0.65
d7 -- final aigu tension
d6 -- final aigu tension
$ someCycles (segment 4 . degrade . rev)
-- $ whenmod 64 54 (# silence)
$ whenmod 64 50 (degrade)
......
......@@ -49,7 +49,7 @@ $ note (scale "aeolian"
# gain 0.5
d7
d6
$ every 2 (superimpose ((swing 2) . (arp "[updown|downup]") . (# room 0.5)))
$ note (scale "aeolian" "<d4'maj e4'maj f4'min <d f>4'maj>")
# s "toys"
......
......@@ -177,7 +177,7 @@ d1 -- Kick techno
d2 -- Snare contretemps
$ mask "<f!2 t!30 t!32>"
$ s "~ . <s!3 s*2> ~" # s "[snare,cp]" # gain 0.5
d7 -- Drumroll énergisant
d6 -- Drumroll énergisant
$ jux rev
$ fast "<4!3 <8 [8 16 8]>>"
$ "drum:2*[<2!3 4>]"
......
......@@ -68,7 +68,7 @@ d4 $ g
# octave 3
# crush (range 10 4.2 "^52")
# sz 0.8
d7 $ g
d5 $ g
$ whenmod 16 8 (fast 2)
$ "~ cp*<1!3 2>"
# note (-2)
......
......@@ -70,7 +70,7 @@ d5 -- Chopped choir
# legato 1
# pan "0.4 0.6"
# gM' 0 1.3 "^82"
d7 -- Claps répartis
d6 -- Claps répartis
$ g
$ novaOn "^59" (fast 2)
$ jux (# lpf 2000)
......
......@@ -42,7 +42,7 @@ d5 $ f2 -- Synth: ELECTRONIC ANSWERS
# delayfb 0.25 # delayt 0.25 # delay 0.8
# panbus 51 (range 0.8 0.65 saw) # crushbus 52 (range 16 2.85 "^33")
# octersubbus 53 (range 0 1.85 "^53") # gain 1.6
d7 $ f3 -- High lead: Winds of truth
d6 $ f3 -- High lead: Winds of truth
$ juxBy 0.5 ((# cut 61) . rev) -- Jux rev <3
$ whenmod 8 6 (swing "<4 2>")
$ whenmod 32 8 (superimpose ( -- Echos of doubts
......
......@@ -59,7 +59,7 @@ d8 $ gF1 $ gM2 -- Break bonus banane
$ loopAt 2
$ "break:3"
# cut 6
d7 $ gF3 $ gM3 -- Back solar mandoline
d6 $ gF3 $ gM3 -- Back solar mandoline
$ midiOn "^59" (off "s" (|+ note "<7 9 5 <7 12>>"))
-- $ midiOn "^91" (off "e" (|+ note 12))
$ superimpose (|+| note "<[0 12 0]!3 [0 12 0 12]>")
......
......@@ -35,7 +35,7 @@ d4 $ gF2 $ gM3 $ note "<[a2@2 ~ ~ a2 b2 ~ <~!1 <b2 e2>>] <e2 g2>>"
# delayt 0.125
# crushbus 41 (range 16 2.5 "^32")
-- # midiG' "^81" 0 1.6
d6 $ gF3 $ gM3
d5 $ gF3 $ gM3
-- $ mask "<f!12 t!4>"
$ note praxis
# "bassWarsaw"
......@@ -43,7 +43,7 @@ d6 $ gF3 $ gM3
# crushbus 61 (range 16 2 "^34")
# midiG' "^54" 0 1.4
# pan 0.3
d7 $ gF3 $ gM3
d6 $ gF3 $ gM3
$ mask "<t(10,16)!8 f(10,16)!8>"
$ note (praxis + 36)
# "prophet5pwmStrings"
......
......@@ -52,7 +52,7 @@ d5 $ gF3 $ gM3
# delaytime "^53"
# room 0.4 # sz 0.8 # dry 1.1
-- # crushbus 51 (range 16 3.5 "^54")
d7 $ gF3 $ gM3
d6 $ gF3 $ gM3
$ midiOn "^91" (ply "<2 4 <8 [16 8]>>")
-- $ slow 4
$ midiOn "^59" (slow 4)
......
......@@ -111,7 +111,7 @@ d5 $ gF3 $ gM3
# delaytime "^53"
# room 0.4 # sz 0.8 # dry 1.1
-- # crushbus 51 (range 16 3.5 "^54")
d7 $ gF3 $ gM3
d6 $ gF3 $ gM3
$ midiOn "^91" (ply "<2 4 <8 [16 8]>>")
$ slow 4
$ midiOn "^35" (slow 4)
......
......@@ -47,8 +47,8 @@ d8 $ gF1 $ gM2
# octersub 0.6
# lpf 5000
# gain 1.4
d6 $ gF3 $ gM3 $ loopAt 4 $ "meth_bass:4" # gain 1.3
d7 $ gF3 -- Choeurs des temps passés
d5 $ gF3 $ gM3 $ loopAt 4 $ "meth_bass:4" # gain 1.3
d6 $ gF3 -- Choeurs des temps passés
$ midiOn "^91" ((# pan "[0.4 0.6]*8")
. chop "<16!3 32>" . (# rel 0.85)
) -- Pan the chops!
......
......@@ -47,7 +47,7 @@ d5 $ gF1 $ gM3
# hpfbus 51 (range 10 1500 "^33")
# att 0.05
# rel 2
d7 $ gF1-- Comeon!
d6 $ gF1-- Comeon!
-- $ slice 4 "0 [~ 1] 2 <2 3>"
$ slice 8 "<<7 7*2 7 [7*2 7]> ~> . ~" -- COMEON!
-- $ chop 16
......
......@@ -43,7 +43,7 @@ d5 $ gF3 $ gM3
# pan "0.2 0.8 0.8 0.2"
# octersubbus 52 (range 0 16 "^33")
# crushbus 51 (range 16 2 "^33")
d7 $ gF3 $ gM3
d6 $ gF3 $ gM3
$ midiOn "^59" (struct "t*[8 . <8!3 16>]")
$ midiOff "^59" (struct "<[t(3,8)]!3 [t(3,8) . t(3,8)]>")
$ note (
......
......@@ -64,7 +64,7 @@ d9
# room 0.4
# lpf 2000
# legato 2
d7 $ gF3 $ gM3
d6 $ gF3 $ gM3
$ whenmod 4 3 (juxBy 0.2 (("e" ~>) . (# cut 71) . (|* gain 0.6)))
$ midiOn "^91" (ply "1 <2 4>")
$ midiOff "^91" (mask "<t f>")
......
......@@ -56,7 +56,7 @@ d9 $ gF3 $ gM3
# legato 1
# room 0.2
# gain 1.1
d7 $ gF1 $ gM3 $ ply "1 <1 <2 [2 4]>>" $ "[~ hh]*8" # gain 1.4
d6 $ gF1 $ gM3 $ ply "1 <1 <2 [2 4]>>" $ "[~ hh]*8" # gain 1.4
d8 $ gF1 $ gM2 $ loopAt 1
$ midiOn ("^60"- "^92") (slice 8 "~ 0 ~ <1 3(<1 3 3 5>,8) 5 7*<1!3 2>>")
$ midiOn "^92" ( -- Bouton Nassim <3
......
......@@ -19,7 +19,7 @@ d4 $ gF2 $ gM3 $ midiOn "^76" (ply 8)
# room 0.4 # sz 0.4 # dry 1.1
# crushbus 41 (range 16 2.5 "^32")
# octersubbus 42 (range 0 2.5 "^52")
d7 $ gM3 $ gF3
d6 $ gM3 $ gF3
$ midiOn "^91" (ply 4)
$ midiOn "^35" ((# n "<1 ~>") . (# end "<0.4!3 <0.8 1>>")) -- PUTAINN!!
$ midiOn ("^59" - "^35") ((>| n "<2 ~>") -- THE JUICE
......
......@@ -62,7 +62,7 @@ d5 $ gF3 -- Piano solo lover sunset
# crushbus 41 (range 16 2.25 "^33")
# modIndex (range 0 16 "^53")
# room 0.4
d7 $ gF2 -- Nice organs you got there
d6 $ gF2 -- Nice organs you got there
$ slice 8 "[5(3,8) <6 6 3 <2 7>>]"
$ loopAt 2
$ "forgan:28"
......
......@@ -60,7 +60,7 @@ d4 $ gF3
# modIndex (range 0 16 "^32")
# pan 0.8
# midiG' "^82" 0 1.3
d7 $ gF3
d6 $ gF3
$ midiOn "^59" (off "h" (# cut 71))
$ slow 2 $ slice 16 "~ <0 1 1 0 0 2 0 2 2 1 2 3 2 3 4 5>"
$ "shiloh:2"
......
......@@ -16,7 +16,7 @@ d4 $ gF2 $ gM3
# octersubbus 41 (range 0 2 "^52")
# room 0.4 # sz 0.8
d5 $ gF3 $ gM3 $ note ("<e!3 cs>@7 [<d d g d>]" - 12) # "FMRhodes1"
d7 $ gF3 $ gM3 $ note "<e3!3 cs2>@7 [d]" # "FMRhodes2"
d6 $ gF3 $ gM3 $ note "<e3!3 cs2>@7 [d]" # "FMRhodes2"
d8 $ gF1 $ gM2 $ loopAt 2 $ chop 8
$ midiOn "^60" (splice 8 "1 4 3 7 4 5*2 [6 7] 7*2")
$ "jungle_breaks:45"
......
......@@ -91,7 +91,7 @@ d5 $ gM3 $ gF3 -- Ghosts from an easier time
# "90s_synatm:8/4" # cut 5
# crushbus 51 (range 16 2.5 "^33")
-- # midiG' "^82" 0 1.1
d7 $ gF3 $ gM3 -- Jump aboard the BASIC BUS
d6 $ gF3 $ gM3 -- Jump aboard the BASIC BUS
$ midiOn "^59" ( struct "t . t(<1 2 1 <1 [4 8]>>,8,1)")
$ midiOff "^91" (loopAt 16)
$ midiOn "^91" (loopAt 8)
......@@ -130,7 +130,7 @@ d10 -- Ready playerm two
--
-- SANDBOX
--
d7 $ gM -- Break from the past
d6 $ gM -- Break from the past
-- FIXME(#54) d7 drives more controls than the grid gives it (B7 + C7). ^56 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^56 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 d7's own control with gSel.
-- FIXME(#54) d7 drives more controls than the grid gives it (B7 + C7). ^56 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^56 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 d7's own control with gSel.
$ (# speed (range (-0.25) 2.25 "^56"))
......
......@@ -50,7 +50,7 @@ d4 $ gF2 $ gM -- GENIE OF INFRABASS
# octersubbus 41 (range 0 0.81 "^32")
# octersubsubbus 42 (range 0 0.6 "^32")
# midiG' "^81" 0 1.2
d7 $ gF3
d5 $ gF3
$ midiOn "^59" (juxBy 0.7 (rev . (# cut 71)))
$ mask "t <f t>" $ chop 16
$ slice 4 "0 <1!3 2>"
......
......@@ -75,7 +75,7 @@ d12 $ gF3 $ gM3
# gain 1.4
# lpf (slow 16 $ range 800 2000 sine)
# room 0.4
d7 $ gF3 $ gM3 -- Lady Perplexity
d6 $ gF3 $ gM3 -- Lady Perplexity
-- $ whenmod 8 7 (# silence)
$ midiOn "^91" (ply "2 4 <8 8 4 16>")
$ midiOn "^59" (chop 4)
......
......@@ -80,7 +80,7 @@ d8 $ gF1 $ gM2
-- $ slice 4 "0 1 2 3*<1!3 8>"
-- $ "jungle_breaks:12" # cut 8
-- # pan 0.8
d7 $ gF3 $ gM3 -- TEMPTATION VOICES
d6 $ gF3 $ gM3 -- TEMPTATION VOICES
-- $ midiOn "^16" (# n 8)
-- $ midiOn "^17" (chop "8 <16!32 230!32>")
-- $ midiOn "^19" (>| n "8/2")
......
......@@ -62,7 +62,7 @@ d5 $ gF3 -- The starry night
# room 0.4
# sz 0.8
# pan 0.7
d7 $ gM $ gF1
d6 $ gM $ gF1
$ midiOn "^59" (mask (cat [maskDrumI,maskDrumI,maskDrumI,maskDrum]))
$ slice 4 "0 <1!8 0 0 0 1 0 1 0 1*2> 2 <3*<1 2 4 8> 3*<2 4 8 16> 3 [~ 3*<1 2>]>"
$ "break:1"
......
......@@ -41,7 +41,7 @@ d5 $ gF3 $ gM3
$ "nujazz_keys125"
# n (slow 4 "<37 38 39 40>")
# cut 5
d7 $ gF3 $ gM3
d6 $ gF3 $ gM3
$ chop 8
$ loopAt 8
$ "rhadamanthe_vocal:31"
......
......@@ -24,7 +24,7 @@ d3 $ gF1 $ gM2
# drumFrom "rolandtr909" "hh:2" # cut 3
# gain 1.8
# legato (range 0.05 0.9 "^31")
d7 $ gF1 $ gM3 -- Breaks Demoniaques
d6 $ gF1 $ gM3 -- Breaks Demoniaques
$ midiOn "^91" (ply "2 <2!2 <3 4> <4 8>>")
$ midiOn "^35" (slice 4 "<[0 1 2 3]!6 3*8 3*[16 . 32 8 8 4]>"
. (loopAt 1)
......
......@@ -93,7 +93,7 @@ d5 $ gF3 $ gM3 -- Donne moi ton Private Number <3 FIXME Decalage?
# gain 1.2
# att 0.15
# rel 2
d7 $ gF3 $ gM3
d6 $ gF3 $ gM3
$ stack [
n "<<~ 22> ~ <21 24 24 33> ~>"
# "vocalScatAr", -- Happy Bro
......
......@@ -15,7 +15,7 @@ d4
# pan 0.2
# cut 4
# midiG' "^81" 0 1.4
d6
d5
$ "90s_weird:1"
# room 0.4
# note "<0 0 2 3 2 3 -1 0>"
......
......@@ -44,7 +44,7 @@ d5 $ gF3 $ gM3 -- Blue Birdies as lead <3
# room 0.4
# sz 0.3
# cut 5
d7 $ gM3 $ gF3 -- Blue Birdies as lead <3
d6 $ gM3 $ gF3 -- Blue Birdies as lead <3
-- Sequence: A!4 C!3 A A!6 CS ~
$ midiOn "^91" (ply "<1!3 2 2!3 4>")
$ midiOn "^59" (ply "<1!3 2 2!3 4>")
......
......@@ -50,7 +50,7 @@ d5 $ gF3 $ gM3
# room 0.2 # sz 0.2
# pan 0.42
d9 $ gF2 $ gM3 $ note "<e4 a4 g4 b4>/4" # "moog" # cut 9
d7 $ gF3 $ gM3
d6 $ gF3 $ gM3
$ midiOn "^91" (ply "<2 [4 8]>" . chop 4)
$ midiOn "^59" (("<0.2 0>" <~) . (# n "<<8 9> ~!3>"))
$ n "<0 1 2 3 4 5 6 7>/2"
......
......@@ -72,7 +72,7 @@ d5 $ gF3 $ gM3
-- # crushbus 51 (range 16 3.5 "^54")
# legato 0.25
# rq 0.3 -- TODO EXPLORE <3
d7 $ gF3 $ gM3
d6 $ gF3 $ gM3
$ midiOn "^35" ( -- A-a-a-a-ACID!
chop 8 . (# n 7)
)
......
......@@ -64,7 +64,7 @@ d4 -- Resolute Bass
# crushbus 41 (range 16 1.25 "^32")
# midiG' "^81" 0 1.6
# cut 4
d6 -- Opiniatre guitare
d5 -- Opiniatre guitare
$ g
-- $ someCyclesBy "<t!16 f!16>" (segment "<8 <4 2>>")
$ midiOn "^90" (slice 2 (run "<4 <2 8>>"))
......@@ -72,7 +72,7 @@ d6 -- Opiniatre guitare
# crushbus 51 (range 10 3.5 "^34")
# midiG' "^82" 0 1.2
# cut 6
d7
d6
$ superimpose (
(# cut 71)
. arp "up"
......@@ -98,7 +98,7 @@ once $ "fguitar:59" -- sometimes 43
d6 $ "seawolf:0/4"
d5 $ "seawolf:0/4"
# cut 6
# gain 0.75
......
......@@ -59,7 +59,7 @@ d5 $ gF3 $ gM3-- RIFFs <3
$ "xplosive"
# n "<0!12 <32 33 34 35>!4>"
# cut 5 -- RIFF
d7 $ gF3 $ gM3 -- VOICES
d6 $ gF3 $ gM3 -- VOICES
$ midiOn "^91" (ply "2 <4 4 4 8>")
$ midiOn "^59" (# n "<24!2 25 <26 27>>") -- Real Dogs
$ (midiOff "^59" (superimpose (chop 16)
......
......@@ -40,7 +40,7 @@ d4 $ gF2 $ gM3
-- # room 0.2
-- # legato 0.5
# gain 1.3
d7 $ gF2 $ gM3
d6 $ gF2 $ gM3
$ midiOn "^59" (struct "t(4,8,1)")
$ midiOn "^91" (ply 2)
$ slow 2
......
......@@ -80,7 +80,7 @@ d11 $ gM3 $ gF3 -- Sky's companion
# n "3"
# cut 11
# pan 0.9
d7 $ gF3 -- together yeah!
d6 $ gF3 -- together yeah!
$ midiOn "^59" (>| n "~ ~ ~ 11") -- Shew
$ someCyclesBy ("^35" - "^59") (>| n "<0 1 2 3 4 5 6 7>/2") -- Buildup
$ midiOn ("^91" - "^59") (>| n "<[~ ~ ~ <8 8 9 10>]>") -- Reponse: COME <3
......
......@@ -46,7 +46,7 @@ d5 $ gM3 $ gF3
# "superfork" # octave 6 |* gain (range 0.87 1 perlin)
# att (range 0.2 0.4 perlin) # rel 1
# gain 0.93
d7 $ gM3 $ gF3 -- CHOIR
d6 $ gM3 $ gF3 -- CHOIR
-- $ mask "t(4,16)"
$ note (cat [
"[d4@3 c4 b3@2 a3@2 . g3 a3 b3 g3]", -- deck 1a
......
......@@ -38,7 +38,7 @@ d5 $ gF3 $ gM3 -- Burning butterflies FIXME TROP NUMERIQUE
# gain (0.5 + (range 0 0.2 (slow 2 perlin)))
# room 0.2
# dry 0.9 # sz 0.5
d7 $ gF2 $ gM3
d6 $ gF2 $ gM3
$ chop 4
$ loopAt 4
$ "meth_bass:17"
......
......@@ -78,7 +78,7 @@ d5 $ gF3 $ gM3
# delay (slow 8 $ range 0 0.9 perlin)
# delayfb (slow 16 $ range 0 0.24 perlin)
# pan 0.8
d7 $ gF2 $ gM3 -- LEAD: Rhodes arp in D Dorian (i7 → IV7 → bIII → v)
d6 $ gF2 $ gM3 -- LEAD: Rhodes arp in D Dorian (i7 → IV7 → bIII → v)
$ midiOn "^91" (jux rev)
$ midiOff "^59" (degradeBy 0.15)
$ sometimesBy "^35" (# squiz "<1 2 3 1>")
......
......@@ -41,7 +41,7 @@ d5 $ gF3 $ gM3 -- BumBum Flute (Run/Wait)
$ "bumbum"
# cut 5
# gain 1.4
d7 $ gF3 $ gM3 -- When the voice says BumBum
d6 $ gF3 $ gM3 -- When the voice says BumBum
$ midiOn "^91" ((# begin 0.5) . ply "<4 4 4 8 4 8 16 32>")
$ midiOn "^35" (
(slow 2 . (>| n "<17 17 18 18 17 17 18 19>")) -- CALL
......
......@@ -71,7 +71,7 @@ d5 $ gF3 $ gM3 -- SIDEKICK LEAD AMI FIABLE DE LA BASSE
# room 0.2
# cut "41 42 43 44"
# gain 1.42
d7 $ gM3 $ gF3
d6 $ gM3 $ gF3
$ n "<0 0 <6 5> 0 1 1 2 7>"
# "come_guitar" # cut 6
# crushbus 61 (range 16 2.5 "^35")
......
......@@ -91,7 +91,7 @@ d5 $ g -- Infectious Bassline
# crushbus 5 (range 16 2.5 "^53")
# midiG' "^82" 0 1.3
# room 0.2
d7 -- TOYS TODO Rework classico louche
d6 -- TOYS TODO Rework classico louche
$ degradeBy (0.99 - "^35")
$ somecyclesBy "<0!4 1 1 0 1>" (often (# speed "-1"))
$ slice 8 (stack [
......
......@@ -54,7 +54,7 @@ d5 $ gM3 $ gF3
# pan 0.35
# room 0.3
# modIndex (range 0 50 "^33")
d7 $ gF3 -- Anges du Minitel
d6 $ gF3 -- Anges du Minitel
$ midiOn "^91" (chop 8)
$ swingBy ("<1!3 2>"/3) 4
$ stut (slow 16 "<0 1 2 3>") 0.75 "e"
......@@ -86,7 +86,7 @@ d5 $ gM3 $ gF3
$ "nujazz_keys125" # n "<56 56 57 56 58!4 59 59 56 59>"
# cut 5
# pan 0.6
d7 $ gM3 $ gF3
d6 $ gM3 $ gF3
$ chop 8
$ loopAt 2
$ "nujazz_keys125" # n "<66!4 67!4>"
......
......@@ -32,7 +32,7 @@ d4 $ gF2
# crushbus 51 (range 16 3.4 "^32") -- BURN ME I'M FAMOUS
# roombus 52 (range 0 0.8 "^32") -- REVERB AND DINE BEFORE THO
# midiG' "^81" 0 1.2
d6 $ gF3
d5 $ gF3
$ note (
"<bf5 c6 cs6 <ef6 f6>>"
-- |+| "0 ~ [0 0] ~ ~ 0*2 ~ >"
......@@ -42,7 +42,7 @@ d6 $ gF3
# cut 6
# crushbus 61 (range 16 2.8 "^34") -- BURN ME I'M FAMOUS
# midiG' "^82" 0 1.2
d7 $ gF3 -- SHILOOOOOH FIXME: Marche plus avec la nouvelle basse
d6 $ gF3 -- SHILOOOOOH FIXME: Marche plus avec la nouvelle basse
$ midiOff "^59" ((# room 0.2) . (# legato 0.5))
-- $ (# hpfbus 71 (range 200 8800 ("^19")))
-- $ (# lpfbus 71 (range 8800 200 ("^35")))
......
......@@ -68,7 +68,7 @@ d5 $ gF2 -- Bassline langoureuse
# crushbus 51 (range 16 2 "^33")
# midiG' "^81" 0 1.52
# room 0.2 # sz 0.2
d7 $ gF3
d6 $ gF3
-- $ midiOff "^59" (mask "<f!64 t!64>")
$ slice 4 "~ <~ [0 1]>"
$ chop 4
......
......@@ -37,7 +37,7 @@ d5
# cut 5
# gain 1.5
# room 0.4
d7 $ gM3 $ gF3
d6 $ gM3 $ gF3
$ midiOn "^91" (off 0.25 (id) . ply 4)
$ midiOff "^59" (chop 8)
$ "law_adri"
......@@ -90,7 +90,7 @@ d5 $ gF3 $ gM3
# "law_adri"
# cut 5
# pan 0.8
d7 $ gF3 $ gM3
d6 $ gF3 $ gM3
$ midiOn "^91" (ply "<2 2 [4 2] 8>")
$ "law_adri"
# n "<4!4 5!4 5!4 8 8 5 89 10 9*2 9*2 11 12 13 14>"
......
......@@ -55,7 +55,7 @@ d5 $ gF3 $ gM3
# octersubbus 53 (range 0 2.5 "^53")
# room 0.4
# gain 1.2
d7 $ gF3 $ gM3
d6 $ gF3 $ gM3
$ midiOn "^91" (chop 4)
$ midiOn "^59" (ply "2 2 2 4")
$ "zombie:24"
......
......@@ -41,7 +41,7 @@ d5 $ gF3 $ gM3
$ note ("<0(3,8)!3 0(3,8)*2>" + prog)
# "FMRhodes2"
# modIndex (range 0 16 "^33")
d7 $ gF3
d6 $ gF3
$ midiOff "^59" (>| n "~ <~ <1 2>> ~ ~") -- Intro Fabuleux
$ midiOn "^91" (ply 8)
$ someCyclesBy "<0!32 1!32>" (>| n "<7 <8 [8 <12 13>]> 11 <12 13>>") -- Promesse/engagement/pari
......
......@@ -54,7 +54,7 @@ d5 $ gF3 $ gM3 -- Douce guitare juxée
# room 0.2 # dry 1
# cut 3
# gain 1.5
d7 $ gF3 $ gM3
d6 $ gF3 $ gM3
$ midiOn "^35" (mask "t f" . (chop 4))
$ superimpose ((# cut 71) . (# crushbus 71 (range 16 2.5 "^55")))
$ loopAt 4
......
......@@ -42,7 +42,7 @@ d5 $ gF3 $ gM3 -- Phone line
# crushbus 51 (range 16 3.5 "^33")
# pan 0.9
# room 0.3
d7 $ gF3 $ gM3 -- Laser!!!
d6 $ gF3 $ gM3 -- Laser!!!
-- $ midiOn "^90" (ply "4 <8 16>")
-- $ slow 2
$ midiOn "^91" (ply 2)
......
......@@ -79,7 +79,7 @@ d5 $ g -- Jumpy Piano
# room 0.5
# sz 0.7
# midiG' "^82" 0 1
d7 $ g
d6 $ g
$ midiOn "^91" (ply "<1 1 2 2>")
$ midiOn "^59" (ply "<2!3 4>")
$ slice 8 (run (
......
......@@ -54,7 +54,7 @@ d3 -- Runny Maracas
$ "hh27*8"
# n "2 <2 <[2|9] [9 <9 ~> <~ 9> 2]>>"
# midiG' "^80" 0.5 1.17
d6 $ g -- Hello Parov! Piano
d5 $ g -- Hello Parov! Piano
$ n "3"
|>| note (
"0 <7 12>*<1 2 4 1>"
......@@ -63,7 +63,7 @@ d6 $ g -- Hello Parov! Piano
# "mojo"
# cut 6
# midiG' "^81" 0.5 1.5
d7 $ g -- Hello Parov! Piano2
d6 $ g -- Hello Parov! Piano2
$ midiOn "^59" (|+| n ("0*<1!4 2!3 4 4 4 8 16>"
))
$ "mojo" # n "<6 7>"
......
......@@ -42,7 +42,7 @@ d4 $ gF2 $ gM3
-- -- # n "<0!7 1>"
-- # cut 5
-- # crushbus 51 (range 16 3.5 "^54")
d7 $ gF1 $ gM3
d5 $ gF1 $ gM3
-- $ jux rev
$ note ("0(<<1!4 3!12> <1!8 <3!3 5>!8> 3 1>,8) 0(<1 3 1 5>,8)"
+ "<f gs bf g>"
......
......@@ -54,7 +54,7 @@ d5 $ gF3 $ gM3
# width (range 0.05 0.5 "^33")
# crushbus 51 (range 16 3.5 "^53")
# room 0.3
d7 $ gF1 $ gM3 $ dMask -- Tracey Trancey's loop art
d6 $ gF1 $ gM3 $ dMask -- Tracey Trancey's loop art
$ midiOff "^59" (mask "t(4,8,1)" . chop 16) -- TECHNO MASK
$ midiOn "^35" (# n 2) -- UPDOWN
$ chop 8
......
......@@ -46,7 +46,7 @@ d4 $ gF2 $ gM3
# sz 0.5
# pan 0.6
-- SOLEIL DU SOIR <3
d7 $ gF3 $ gM3
d6 $ gF3 $ gM3
$ midiOn "^91" (ply 2 . (# legato 0.25))
$ midiOn "^59" ((|+ note 12))
$ fast 2
......
......@@ -81,7 +81,7 @@ d8 $ gF1 $ gM2
$ chop 16
$ loopAt 4
$ "jungle_breaks:45"
d6
d5
-- $ loopAt 8
$ chop "4 8"
$ note "<[fs,a,cs] [gs,c,ds] [g,b,d] [fs,a,cs]>"
......@@ -91,7 +91,7 @@ d6
-- # crushbus 61 (range 16 4.5 "^31")
-- # hpfbus 62 (range 0 1500 "^31")
# gain 0.65
d7 $ gF3 $ gM3 -- La guitare d'Icare
d6 $ gF3 $ gM3 -- La guitare d'Icare
$ midiOn "^91"(ply 2)
$ midiOn "^59" (# n 1)
$ fix (|* gain 0.8) (n "1")
......
......@@ -68,7 +68,7 @@ d4 -- BASSLINE GENERATIVE
# crushbus 41 (range 16 3.5 "^52")
# room 0.2 # dry 1.2 # sz 0.7
# gain 1.8
d7 -- CHOEUR GENERATIF ALONG THE BASS
d6 -- CHOEUR GENERATIF ALONG THE BASS
$ gF3 $ gM3
$ midiOn "^91" (superimpose (
arp "up <up <converge pinkyup>>"
......
......@@ -46,7 +46,7 @@ d5 $ gM3 $ gF3
# cut 5
# pan 0.6
# gain 1.4
d7 $ gM3 $ gF3
d6 $ gM3 $ gF3
$ midiOn "^91" (ply "<2 2 <4 8> <8 4>>")
$ chop 8
$ loopAt 2
......
......@@ -39,7 +39,7 @@ d5 $ gF3 $ gM3
$ chop 8
$ "zombie:0/2"
# cut 5
d7 $ gF3 $ gM3 -- ZOMBIE GUITAR INFECTION
d6 $ gF3 $ gM3 -- ZOMBIE GUITAR INFECTION
$ ply 8
$ chop 4
$ midiOff "^59" (slow 4)
......
......@@ -66,7 +66,7 @@ d5 $ g -- Synth voices
# crush (range 10 2 "^33")
# gM' 0 1 ("^82" - 0.2 * "^33")
# cut 5
d7 $ g -- Side guitar
d6 $ g -- Side guitar
$ sometimesBy "^35" (scramble 16)
$ mask "<t!6 f!2>"
$ loopAt 2
......
......@@ -37,7 +37,7 @@ d4 $ gF2 -- SynBase
# crushbus 42 (range 16 4 "^32")
# room 0.3 # dry 0.9
-- # midiG' "^81" 0 1.2
d6 $ gF2 -- MOTHERBASS
d5 $ gF2 -- MOTHERBASS
$ midiOn "^34" (mask "<t f!3>" . (# legato 4))
$ midiOn "^90" (ply 4)
$ note "f3"
......
......@@ -91,7 +91,7 @@ d5 -- Choeurs
# room 0.4
# size 0.7
# dry 1.05
d7
d6
$ sometimesBy "^59" (# lpf 2000)
$ g
$ sometimesBy "^91" (fast 2)
......
......@@ -48,7 +48,7 @@ d5 $ gF3 $ gM3
# n "<11>"
# crushbus 51 (range 16 3.5 "^33")
# cut 5
d7 $ gF3 $ gM3 -- La pluie <3
d6 $ gF3 $ gM3 -- La pluie <3
$ midiOn "^59" (|+| note "0 12 0 <12!4 [12 0 12]!4 [0 7 12 0]!8>")
$ superimpose (struct "t(<3!3 [3 5]>,8)" . (|+| note (arp "<down!3 up>" "<c'maj'3!3 c'maj'4>")))
$ note ("<e c b4 <e4 d4>>")
......
......@@ -51,7 +51,7 @@ d5 $ gF3 $ gM3 -- GUITARE DU DJ
-- # octer 0.8 # octersub 1.2
# lpf 5000
# pan (slow 4 $ range 0.8 0.2 sine)
d7 $ gF3 $ gM3 -- Laisse moi kiffer la vibe.
d6 $ gF3 $ gM3 -- Laisse moi kiffer la vibe.
$ midiOn ("^91" - "^59") (ply "<2 <2 4> 2 <4 [4 8] [4 16 4] [16 4]>>")
$ midiOn "^35" (-- COPINE
ply 4 .
......
......@@ -85,7 +85,7 @@ d5 $ gF3 $ gM3 -- Les ptites keys de fin de session tranquilou
# crushbus 51 (range 16 3.5 "^33")
# pan 0.9
# room 0.3
d7 $ gF3 $ gM3 $ "trance_amb:0/2" # cut 7
d6 $ gF3 $ gM3 $ "trance_amb:0/2" # cut 7
d8 $ gF1 $ gM2
$ midiOff "^60" (mask "t(4,8,1)") -- Techno drum mask
$ midiOn "^36 " (loopAt 4 . (# "jungle_breaks:22")) -- Raise COMEON!
......
......@@ -53,7 +53,7 @@ d5 $ gF3 $ gM3
$ midiOff "^57" (>| n "1/2")
$ "coffee"
# cut 5
d7 $ gF3 $ gM3
d6 $ gF3 $ gM3
$ midiOn "^91" (ply 8)
$ (0.25 ~>)
$ slow 8
......
......@@ -45,7 +45,7 @@ d5 $ gF3 $ gM3
# cut 5
# room 0.4 # sz 0.6 # dry 1.1
# octersub 1.4
d7 $ gF3 $ gM3
d6 $ gF3 $ gM3
$ midiOn "^59" (>| n "<~ ~ 8 ~>")
$ n "<<3 4 5 <6 7>> ~ <3 ~> ~>"
# "superfreak"
......
......@@ -97,7 +97,7 @@ d9 -- b ef
$ note "<[b4, gs5] ~ [cs4, b5] ~>"
# "moogBass"
# legato 2
d7 $ gF2 $ gM3
d6 $ gF2 $ gM3
$ midiOff "^91" (chop 8 . (struct "t*8"))
$ midiOff "^59" (mask "t(3,8) t(3,8)")
$ note (
......
......@@ -28,7 +28,7 @@ d2 $ gF $ gMute -- Clap timer
$ drumFrom "[sakatadpm48,rolandr8]" "cp"
# lpf 2000
# gain 1.6
d7 $ gF3 $ gM3 -- High Cello Dauphin
d6 $ gF3 $ gM3 -- High Cello Dauphin
$ midiOn "^91" (ply 2)
$ midiOn (1 - "^35") (struct "t . f")
$ struct "t@2 t*<1 2 1 <4 1>> t*<1 2 4 8>"
......
......@@ -42,7 +42,7 @@ d5 $ gM $ gF3
# room 0.2
-- # cru
# midiG' "^33" 0 1.4
d7 $ gF3 -- Marimba à la mode
d6 $ gF3 -- Marimba à la mode
$ note "<[gs ~ ef gs gs ~ ef gs ~ ef gs ~ ef@2 ~ e] [<~ <gs5 gs4>>]>"
# "modalMarimba"
# cut 7
......
......@@ -45,7 +45,7 @@ d8 $ g
$ "jungle_breaks:30"
# gain (slow 8 $ range 0.6 0.85 saw)
# cut 8
d7 $ g
d6 $ g
$ fix (|* gain 0.9) "jungle_fx:19" -- Horn
$ fix (|* gain 0.8) "jungle_fx:33" -- Detroit
$ stack [
......
......@@ -47,7 +47,7 @@ d2 $ g -- BREAK
# speed (range 0 2 "^51")
# midiG' "^80" 0 1.5
# cut 2
d7 $ g -- Hello PWM!
d6 $ g -- Hello PWM!
$ (|* gain "<1!15 0.8>")
$ midiOn "^91" (chop "<[8 <4 16>]!15 1>")
$ midiOn "^59" (superimpose $ segment 16)
......@@ -59,7 +59,7 @@ d7 $ g -- Hello PWM!
# resonance (slow 32 $ range 0.2 0.6 sine)
# crushbus 71 (range 10 3 "^35")
# midiG' "^81" 0 1.42
d6 $ g -- Nappes Rhodes
d5 $ g -- Nappes Rhodes
$ note (
prog
+ "0 12"
......
......@@ -91,7 +91,7 @@ do
# s "clap:1"
# gain gClap
# lpf 4000
d7 -- synthe echos electrique
d5 -- synthe echos electrique
$ superimpose (
(# s "supercomparator") .
(# voice (slow 64 $ sine * 8)) . (|- note 12)
......@@ -237,7 +237,7 @@ do
# sustain 4
# gain gSiren
# cut 5
d7 -- synthe echos electrique
d5 -- synthe echos electrique
$ superimpose (
(# s "supercomparator") .
(# voice (slow 64 $ sine * 8)) . (|- note 12)
......@@ -318,7 +318,7 @@ d4 -- Basse
# s "supersaw"
# voice 0.1
# gain gBass
d7 -- synthe echos electrique
d5 -- synthe echos electrique
$ superimpose (
(# s "supercomparator") .
(# voice (slow 64 $ sine * 8)) . (|- note 12)
......
......@@ -18,7 +18,7 @@ d2
d3 -- snares synchro
$ sometimesBy "0!3 1" (stut "<2 3 4>" 1 "<e!3 s>")
$ "s s s t" # "sn" # n "20" # note ("0 0 0 -12") # gain 0.8
d7
d6
$ whenmod 16 8 (superimpose (
(|* gain 0.8)
. (# lpq 0.75)
......
......@@ -69,7 +69,7 @@ do
# gain (slow 64 $ range 0.5 1.1 saw)
d7 -- lead orgue
d5 -- lead orgue
$ degradeBy 0.4
$ rev
-- $ slow 2 $ degrade $ (|+ note 7)
......
......@@ -73,7 +73,7 @@ d5 -- Side epiano
# gain (slow 64 $ range 0.35 0.55 sine)
# cut 4
# pan 0.7
d7 -- claps
d6 -- claps
$ every' 8 7 (mask "f t")
$ mask "<[<f!3 [f!7 t]>]!16 t!16>"
$ fast 2
......
......@@ -25,7 +25,7 @@ do
d1
$ fast "<2!16 4!13 0>"
$ s "[jazz,kick:7]" # gain 0.8
d7 $ "~ cp" # gain 0.8
d6 $ "~ cp" # gain 0.8
d2 $ "" # "sn:20" # gain 0.8
d5 $ splice 8 "2 4 0 0*2" $ s "fclav:8" # cut 1
......
......@@ -60,7 +60,7 @@ d5 $ gM3 $ gF3 -- BLUES RUN
# gain 1.85
-- # pan (slow 8 $ range 0.5 1 (saw - (slow 2 perlin)))
# pan (slow 16 $ range 1 0.8 saw)
d7 $ gM3 $ gF2 -- G0dz1ll4
d6 $ gM3 $ gF2 -- G0dz1ll4
$ midiOn "^59" (off 1 (
(|+ pan 0.3)
. (# cut 91)
......
#!/usr/bin/env python3
"""compact-orbits — close the gaps in the melodic band, so d6 stops being skipped.
PLN, 2026-09-22: *"part of the migration also: no d7 when d6 is free. d7 often
was sefcond melo, should be a d6 now d6 ids not a shitty mapped knob, but a
proper column like others"*.
That is the history exactly. d6's knob used to be somewhere useless, so a second
melody went to d7 and d6 was left empty. Since the column remap every one of
d4-d8 owns its own fader, its own B knob and its own C knob, so the reason to
skip d6 is gone — but the corpus still carries the habit, and a set with a hole
at d6 wastes a whole column of the surface.
WHY ONLY d5 / d6 / d7 MOVE
An orbit number is not just a label: it decides which family DJ filter and which
family mute the orbit answers to. From the authored grid (lcxl_grid._FILTER_FAMILY
and _MUTE_FAMILY):
orbit 1 2 3 4 5 6 7 8 9..12
gF 1 1 1 2 3 3 3 1 3 <- C1 percs, C2 bass, C3 melodies
gM 1 2 2 3 3 3 3 2 3 <- F1 kick, F2 percs, F3 bass+mels
d5, d6 and d7 are interchangeable: same filter family, same mute family. Nothing
about the sound changes when a pattern moves between them. **d4 is the bass and
d8 is a percussion slot**, so compacting into or out of those would silently
re-assign which filter sweeps the part and which button drops it — audible, and
not what was asked for. So the band this tool compacts is {5, 6, 7} and nothing
else. d1-d3 and d9-d12 are never touched.
WHAT IT REFUSES
* any orbit carrying an explicit `# orbit N` — that overrides the output orbit
independently of the `dN` name, so renaming the declaration alone would move
the pattern's identity and leave its AUDIO where it was. Reported, never
guessed at.
* comments. A commented-out `-- d7 $ …` is an alternative PLN may re-enable
mid-set; renaming it would rewire that alternative to a different column,
and the breakage would surface weeks later with no trace. Same rule the
column migrator follows.
WHAT IT DELIBERATELY LEAVES ALONE
* effect bus slots (`crushbus 71`, `octerbus 72`, …). Convention pairs them
with the orbit, but a bus id is a bus id: renumbering one is an audio-graph
edit, and collisions are already caught by pvlint PV011. A d7 that becomes
d6 keeps `crushbus 71`, which is untidy and correct.
* `cut` groups. A cut group is a sample choke group, not an orbit, and two
orbits sharing one is a real idiom.
The permutation is applied SIMULTANEOUSLY, for the same reason as
migrate-columns: computed one at a time, a 6-and-7 pair looks like a collision
that evaporates once both move.
tools/compact-orbits.py --plan TRACK [...] # show, change nothing
tools/compact-orbits.py --apply TRACK [...] # rewrite in place
tools/compact-orbits.py --plan # whole corpus under live/
Always --plan first. Always pvlint + silent-eval after --apply.
"""
from __future__ import annotations
import argparse
import re
import sys
from pathlib import Path
sys.path.insert(0, str(Path(__file__).resolve().parent))
from pvlint.core import load, strip_comment # noqa: E402
import lcxl_grid # noqa: E402
ROOT = Path(__file__).resolve().parent.parent
LIVE = ROOT / "live"
# The interchangeable melodic run. Derived, not asserted: these are the orbits
# in 1..8 that share both family maps with their neighbours, which is precisely
# the condition under which a move is inaudible.
BAND = tuple(n for n in range(1, 9)
if lcxl_grid.filter_family(n) == lcxl_grid.filter_family(6)
and lcxl_grid.mute_family(n) == lcxl_grid.mute_family(6))
DECL = re.compile(r"^(\s*)d(\d+)\b")
EXPLICIT_ORBIT = re.compile(r"#\s*orbit\s")
def plan_for(path: Path):
"""(moves, refusals) for one track. moves: {old orbit -> new orbit}."""
track = load(str(path))
orbits = track.orbits()
used, refused = [], []
for o in orbits:
if o.number not in BAND:
continue
if EXPLICIT_ORBIT.search(o.code()):
refused.append((o.number, o.start, "carries an explicit # orbit"))
continue
if o.number not in used:
used.append(o.number)
# An orbit that was refused keeps its number, so it must not be a
# destination either — otherwise the compaction would put two orbits on one.
frozen = {n for n, _, _ in refused}
free = [n for n in BAND if n not in frozen]
moves = {}
for old, new in zip(sorted(used), free):
if old != new:
moves[old] = new
return moves, refused
def apply_to(path: Path, moves: dict[int, int]) -> int:
"""Rewrite the `dN` declarations. One pass, so a 6<->7 swap cannot corrupt."""
lines = path.read_text(errors="replace").splitlines(keepends=True)
n = 0
for i, raw in enumerate(lines):
if raw.lstrip().startswith("--"): # comments are alternatives
continue
m = DECL.match(raw)
if not m:
continue
old = int(m.group(2))
if old not in moves:
continue
lines[i] = f"{m.group(1)}d{moves[old]}{raw[m.end():]}"
n += 1
path.write_text("".join(lines))
return n
def resolve(names: list[str]) -> list[Path]:
if not names:
return sorted(LIVE.rglob("*.tidal"))
out = []
for n in names:
p = Path(n)
out.append(p if p.is_file() else ROOT / n)
return out
def main(argv=None):
ap = argparse.ArgumentParser(
description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
g = ap.add_mutually_exclusive_group(required=True)
g.add_argument("--plan", action="store_true")
g.add_argument("--apply", action="store_true")
ap.add_argument("tracks", nargs="*")
a = ap.parse_args(argv)
total_moves = total_files = total_refused = 0
for path in resolve(a.tracks):
if not path.is_file():
print(f"! no such track: {path}", file=sys.stderr)
continue
moves, refused = plan_for(path)
if not moves and not refused:
continue
total_refused += len(refused)
if moves:
total_files += 1
total_moves += len(moves)
head = f"== {path.name}"
print(f"{head} " + ", ".join(f"d{o} -> d{n}" for o, n in sorted(moves.items()))
if moves else f"{head} (nothing to move)")
for num, line, why in refused:
print(f" d{num} line {line}: REFUSED — {why}")
if a.apply and moves:
print(f" APPLIED: {apply_to(path, moves)} declaration(s)")
print(f"\n band {BAND} · {total_moves} move(s) in {total_files} file(s)"
f" · {total_refused} refused")
if a.apply and total_moves:
print(" NOW RUN: python3 -m pvlint ... then tools/silent-eval.py --seeded ...")
if __name__ == "__main__":
main()
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