Commit 2f947c2c by PLN (Algolia)

merge: the LCXL3 surface becomes the rig's default state

Brings the v3 control surface work onto master, as PLN called it: "this is the
new tooling/state". The arc is one idea repeated — the driver owns the truths
the hardware refuses to keep.

- it plays: four defects between the driver and a live SuperCollider, all of
  them identity bugs (a port's NAME is not the port)
- it speaks a language: role hue x value lightness, the DJF's diverging
  blue -> breathing-green-zero -> red, glowing at the track's tempo
- it holds state the v3 board dropped: offset-64 relative values, row-E
  latches, paint reasserted every two seconds
- it says what each control DOES, in PLN's own words parsed from his .tidal
  ("Le Delay rose!!!", "HANDS IN THE AIR"), across all 34 display targets
- it follows the track: the editor already published it, the driver only had
  to read — remap, relabel, repaint and reset the lap clock on a change, and
  re-read on save so mapping a control lights the board within a second
- the tempo can be a knob, with landmark detents replacing the notch the v3
  encoders lack, and a bar countdown for the mute-drop transition
- and the rig around it: Ardour hears the surface again, RIG UP owns the
  ordering SuperDirt needs, midiviz replaced the transcript with a picture

Also aboard: a display-semantics probe that asks the device instead of us
guessing, realtime.tidal for composing without the crossfade, and the corpus
marked for quantise at all 14 tempo-knob sites.

Backward compatibility is the standing constraint and it holds: the corpus
speaks v2 forever, everything v3 lives in the driver, and a classic Launch
Control XL still works with nothing running.
parents d2c1388a 2e3c8000
......@@ -32,3 +32,12 @@ output/Take95/*.flac
output/Take95/tracks/
output/Take95/album-mp3/
output/Take95/*.log
# set_finder: regenerable analysis artifacts, not sources.
# The hash DB is 2.3 MB and rebuilds in 39 s; the query profile is a per-recording
# cache keyed on mtime. Committing them would put binaries in the history for no
# gain — but preload staleness taught us the cost of "generated + gitignored +
# never compared", so both are rebuilt by an explicit command, never implicitly.
armada/tide-table/set_finder_db.npz
armada/tide-table/.qprofile_*.npz
armada/tide-table/set_finder_scan.json
# 032 — The surface that spoke a different language
**Landed 2026-08-28/29.** The LCXL3 arrived. PLN, unpacking it: *"we have now infinite
knobs so always at 0 init ✨ We have colors and brightness, true colors all 3 leds
combinations, under each button and knob! we have a OLED screen with true pixels we could
display ANYTHING there! OMG so exciting wdyt?"*
Mostly yes. But the device that can paint anything could not, at first, play a single one
of his 169 tracks.
## The board's biggest unknown, answered
`reference_lcxl_v3_ordered` had carried a flagged question for twelve days: *can
third-party SysEx paint arbitrary text to the OLED?* It mattered because HUD v2's alarms
are DERIVED state, not control values — if the OLED only rendered parameter values, the
alarms would stay stuck on screen.
The official programmer's reference settles it: `F0 00 20 29 02 15 09 <target> <1216
bytes> 7F`, nineteen bytes per row, sixty-four rows, seven pixels per byte. And the
firmware **ACKs every frame** *"suitable for timing fluid animations"* — so animation is
a designed-in feature, not a hack. DESIGN.md's "alarms need motion, not numbers" is
therefore satisfiable on the device itself.
Two more open items closed the same way. LED brightness is CC 111 and non-volatile, so
open taste call #11 — should a bypassed filter be bright or dim — stops being an argument
and becomes a knob. And endless encoders send relative deltas, so pot-pickup does not
exist to solve.
## The keystone: three steps, PLN's eyes, ten minutes
The guide files "Colouring the surface" and "Controlling the screen" inside the DAW mode
chapter, prefaced *"only available once DAW mode is enabled"*. That is a document claim,
and this project has scar tissue about believing those. So it got tested.
Magenta on the MIDI port in standalone: nothing. Same paint on the DAW port with DAW mode
off: nothing. `daw on`, same bytes: all 24 rings and 16 buttons lit. PLN: *"ok now i see
purple ABC blue EF"*.
Hardware fact, not documentation artefact. Which created the real problem.
## Sixteen collisions, and one of them is the kick
DAW mode's CC map is fixed, and it was read off the hardware rather than off a
low-resolution diagram — one control per row, watching what arrived. It overlaps v2's map
with **different meanings**:
row v2 (lcxl_grid) v3 DAW
A 13-20 13-20 identical
B 29-36 21-28
C 49-56 29-36 <- v2's row B numbers
D 77-84 5-12
E 41-44, 57-60 37-44
F 73-76, 89-92 45-52
The decisive one: v3 `#41` is button **E5**, while v2 `#41` is button **E1** — the kick
gate that log 031's 169-file migration had just finished aligning. Renumbering would slide
the kick gate four buttons to the right, silently, with nothing erroring. That is the
exact failure class the migration existed to end.
So: software translates, the corpus does not move again. `tools/lcxl3-driver.py` reads the
v3 DAW port and emits v2 numbers on a virtual port, deriving the mapping from
`lcxl_grid.ROW_CCS` positionally rather than retyping it. Three facts make it cheap —
SuperCollider's `MIDIFunc.cc` binds with no cc, channel or src filter so only the number
matters; every encoder row is still in absolute mode, so a v3 encoder already behaves like
a v2 pot; and endless mode would need an integrator anyway, which is where paint-by-value
belongs later.
## Two silent breakages found on the way
**Both rig reconcilers had been dead since 23 August.** `203/EXEC`: when log 030 rescued
them from `$HOME` they were committed as **644**. The recurrence has a repo-level cause —
`core.fileMode = false` here, so git ignores exec-bit changes from the working tree
entirely, and `chmod` can never fix the index. `git update-index --chmod=+x` is the tool.
Worse, an auto-restarting unit reports `activating`, which reads as busy rather than
broken, so `rig_units --status` showed a yellow that nobody chased for five days.
**`midi-autoconnect` hardcoded "Launch Control XL"**, which matches neither v3 port — and
it routes `aconnect`'s complaints to `/dev/null`, so Ardour silently stopped hearing the
surface with every check green. It now resolves the name, preferring the driver's
translated port, and logs its choice once per change rather than every two seconds.
## Instruments that lied, and one that lied about the instrument
`aseqsend -s "B0 25 05"` treats its argument as a **filename**: it printed `cannot open
B0 25 05` and exited **0**. Thirty-two paint attempts, silent no-op, exit success. That is
how a transport bug can look like a hardware answer. `lcxl-leds.py` shells out that way
today.
And `pgrep -c -f sclang` returned 2 while `ps -C sclang` returned nothing — it was
matching its own command line. Reading that as "SC is running" produced a confidently
wrong picture of the rig for several minutes. `pgrep -x` says the truth.
## Firmware, and a decode worth keeping
The device inquiry version field is **7-bit packed**: `01 00 0A 54` = 1.0.(10<<7|84) =
**1.0.1364**, which PLN confirmed off the bootloader screen. Updated to **1.1.1465.0** via
web Components in Chromium — WebMIDI works on Linux, despite Novation documenting only the
Mac/Windows app. v1.1 adds two extra USB→DIN output ports, Mode-as-momentary for fast
custom-mode switching, and encoder acceleration (which CC 121 had refused to answer on
1.0, independently confirming the version).
## A claim retracted with evidence
The board twice asserted that the v3's DIN path mitigates the USB-hub single point of
failure. It does not: `aconnect -l` shows only Midi Through and the controller. **This
machine has no MIDI DIN input at all** — the UMC202HD has no MIDI jacks. The controller
could speak DIN all night and nothing host-side would hear it. So DAW mode disabling DIN
out costs nothing today, and #154 needs a different answer.
## Left open, honestly
The driver has never run against a live SuperCollider, because sclang, scsynth and Ardour
were all at zero when it was written. The whole "PLN can play his tracks on the new
surface" claim rests on that one untested step.
# 033 — Fourteen tracks from one microphone
**Landed 2026-08-29.** PLN dropped a file in chat: *"boom downloaded cosmic set!
ZOOM0067.MP3 can you find the tracks back? its an interesting test actually :P"*
A 63-minute handheld stage-mic MP3 of a gig with no stems and no session log. Every
boundary lens the toolbox owned needed something that recording did not have.
Orbit-activity needs stems. The gig-log's `track` events ARE the tracklist, and the
recorder never ran. Gap detection assumes a set stops between tracks, and a livecoded set
does not.
Final score against PLN's ears: **12 of 14 tracks named correctly**, 81% of the set
labelled, 85% of the labelled overlap right.
## The first pass measured loudness
I built Shazam-style landmark fingerprints of rare sample banks and reported the results,
and every bank occupied 375 of 378 time bins. Three things were wrong, and none of them
was a threshold.
**Offset consistency was missing entirely — and it is half the algorithm.** Wang's 2003
paper is explicit: real matches agree on a time offset, so the scatterplot shows a
diagonal and the offset histogram spikes. Adding it took the top hit from noise to **85%
of 1244 hashes agreeing on one offset**.
**Raw counts measure loudness, not similarity.** Measured, not assumed: 8 of 18 banks had
their global peak in the final minute at 1.3-2.5x density. A loud broadband finale makes
more spectral peaks, so it matches *everything* better.
**And fixed offset is wrong for this material anyway.** Sonnleitner, Arzt & Widmer's
ISMIR 2016 DJ-mix work allows the offset line a free slope, because a DJ plays material at
a different rate — and a livecoder changing `setcps` across 80 to 170 BPM does the same.
## PLN's reframe, which was the actual unlock
*"so it meas comparign to prior recs, of each track of the opal songs for example (almost
the same lineup in the end!), can be fertile?"*
Yes, and it reframes the task. A 0.4 s dry one-shot through a PA and a 320 kbps encode is
below any landmark method's detection floor by construction. But `Prod/Opal26_master/tracks`
holds fifteen ear-verified per-track renders of 154-524 s each, played by the same
performer from the same sample library — and Montreuil-26 adds fifteen more, six of them
tracks OPAL never had. That is minutes of reference per track instead of fractions of a
second, and it turns sample detection into **version identification**, where the
literature is unambiguous: match sequences of features, not exact time-frequency points.
`punkachien` landed at margin 1.06 purely because Montreuil supplied that render.
## Three attempts at tempo, because the first two measured nothing
1. `librosa.feature.tempo` returned 107-130 for every segment of an 80-170 BPM set. That
is its log-normal prior centred on 120. A lens whose output is its prior measures
nothing.
2. Mode of inter-onset intervals on the full mix: 233-648 BPM — it locks onto the fastest
subdivision, the hats. Its apparent matches were hollow too: five octave multiples at
5% tolerance passes roughly a quarter of *random* values.
3. Autocorrelation of the **40-120 Hz kick band**. Validated on six cases chosen because
their declared tempos are known and well separated, so the test could fail: bombe
123.9/124, punkachien 170.1/170, vague_de_crime 120.1/120, do_it_right 178.3/2 =
89.15/89. Four exact to 0.1%.
That validation is what licensed the overrides. An instrument that agrees where it should
is one whose **disagreements carry information**.
## The same bias, three times, in three costumes
`locate` normalised by reference size. `crossmatch` did not, and the number said so:
correlation(reference length, seconds won) = **+0.586**. Ceci (524 s) and Piment (506 s)
won most of the set; WAP and REVOLUTION won nothing. Fixed by standardising each track's
score column over the whole query — "how UNUSUALLY similar" rather than "how similar".
Then the fusion grew it a third time: counting each top-3 tempo candidate as a vote let
`cafe_bouillant` beat `ouais_je_funk`, which measured 120.1 against a declared 120. A
perfect match, demoted by an alphabetical tie.
## PLN's ears beat my reporting, twice
He heard a rose_rouge sample inside a seam I had labelled `quand_on_decolle`, and said he
was sure he had played `something_about_drums` in a stretch I reported as unclaimed. Both
were **already in my data**: I had 86 offset-consistent detections and had printed 4,
because the report showed each bank's single best window and discarded temporal extent —
which for this question is the informative part.
rose -> rose_rouge 22:35-24:00 (max cons 0.81) ... 31:30
movie_paris -> something_about_drums 6:15 (0.62), 10:30 (0.49)
His diagnosis of the fix was also right: *"its almost tfidf we should do here. when we
know rose sample is around a time slot, its a tell. when we see e.g. _jungle_BreakS_, it's
way less idf relevant."* With one correction from measuring it — plain log-IDF is too
flat, giving `jungle_breaks` (df=80) 0.50x the weight of `rose` (df=2), a 2x penalty for
being 40x more common. **1/df** gives 0.0125 versus 0.50.
## A negative result, and a hypothesis that died
The weighting let MAX_DF rise from 6 to 40, taking fingerprint coverage from 15/23 to
**23/23** candidate tracks — and it added **zero** evidence. I guessed reference duration
was the binding constraint. Wrong: correlation with best consistency is **-0.144**, and
the three longest references are among the worst detectors. Then the confound surfaced —
`suns_keys` belongs to `blue_gold`, which PLN did not play, so its low score is a **true
negative**. Failures and true negatives are indistinguishable without the setlist, so the
cause is recorded as unestablished rather than explained away.
## Both remaining failures are one failure
`perfect` was called gimme_acid; the improvised outro was called REVOLUTION. All five
ghosts — blue_gold, desire, gimme_acid, quand_on_decolle, REVOLUTION — are the same
mechanism: crossmatch can only choose among tracks it holds a prior render of, so audio
from a track it has never heard lands on the nearest thing it has.
Structural, not a threshold. **The fix is one render per track**, and it compounds: every
future set recovery gets easier.
## And a track that only exists live
The final 103 seconds, per PLN: *"thissegment is pure dubsiren noise and fun ahahah it
could be called 'Outro Dub Siren' ahah"*. No reference-based lens could ever have named
it. Worth cataloguing under its own name if the set is released.
# 034 — The recorder nobody enumerated
**Landed 2026-08-29.** PLN, on learning why CosmicFest's tracklist had to be recovered
with DSP at all: *"what gig-log didnt run that night? HOW COME? 😁 glad we have belt and
suspenders from that cosmicfest, but thats sad and needs proper tech debt payment! We cant
afford to miss that"*.
He is right, and the answer is not a crash.
## The cause
`gig-log.service` was installed **2026-07-29** and left `disabled`. And
`tools/rig_units.py` — the one authored inventory that log 030 created precisely so this
class of thing could not happen — mentioned it **zero times**.
So `--ensure` could not enable it. `gig-up.sh`, which gates on the inventory, never
asserted it. It ran only when somebody remembered to start it by hand, and the sessions
that survive, through 2026-08-20, are exactly those manual runs.
Two failure shapes already named in this repo, stacked:
The unit lived **only in `$HOME`**, never in the repo. That is log 030 again — the two
reconcilers rescued from a home directory after five orbits reached no Ardour track. A
file that exists in one home directory is not infrastructure, it is a habit.
And it was **missing from the one authored list**. An inventory only prevents the class of
bug it actually enumerates. gig-log was left off, so it inherited none of the protection.
## What was actually lost
Not just thermals and xruns. The gig log records a `track` event per evaluation and
coalesces the MIDI CC stream — so it holds both the tracklist and a fingerprint of which
controls each loaded track touched. Recovering the set afterwards took two DSP lenses,
thirty reference renders, three attempts at a tempo estimator, and still left two
mislabels and five ghosts. One always-on 1 Hz recorder costing 0.4% of a core would have
made all of it unnecessary.
The HUD's `eval-events.jsonl` missed the set too, which is why "belt and suspenders" did
not save us: 21 events on 2026-08-23 from 18:31 to 18:59 (prep at home — `rose_eternelle`,
`quand_on_decolle`, `because_its_there`, `sept1`), then a **3h15m hole** across the gig,
then four `pluie` evals at 22:14 with zero orbits. Pulsar was running, so the likely cause
is the lazy-activation trap, but that is a hypothesis and is recorded as one.
## Paid in three places
* `tools/gig-log.service` — versioned in the repo, symlinked into `~/.config/systemd/user`
* `gig-log` in `rig_units.py` SERVICES, so `--ensure` enables it and the generated
`parvagues-rig.target` Wants it. **Seven units, zero problems.**
* a **HARD** gate in `gig-up.sh`
## The gate does not ask whether the unit is green
A green unit is not a recording — the process can be up while the writer is wedged. So it
asserts the property that matters: a session file whose mtime is within the last 20
seconds, i.e. it is writing *now*.
And it was verified to be capable of failing, because this repo already has a log titled
"the checks that could not fail": stopped the recorder, waited 25 s, gate failed at age
25 s; restarted, age 1 s, passed.
## A footnote on how the fix nearly shipped incomplete
The commit that explains this fix and the commit that performs it were briefly different
commits, and only one existed. `30fceb4`'s message said the debt was *"paid in three
places"* and contained a single file; the inventory entry, the regenerated target and the
gate sat in the working tree until the pre-compact tree check caught them. Second
occurrence in one session of a message written from intent rather than from
`git show --stat`.
---
log: 035
title: "There were never two screens. There were thirty-four."
date: 2026-08-29
task: "n/a — LCXL3 OLED display-ownership battle"
tags: [tooling, lcxl3, surface, protocol, oled]
shareable: true
---
## Cap (what & why)
The new Launch Control XL 3's OLED kept showing the firmware's bare value —
`0` for a relative encoder, a raw 0-127 for a fader — instead of the driver's own
overlay naming the control in corpus language. PLN, after three rounds of fixes:
"still shows values." On the faders, "no info at all." A 128x64 panel that says
`0` mid-set is worse than a dark one; it looks like a working display lying to you.
## Manœuvre (how)
Three rounds had all been variations on one move: re-summon our overlay on the
global temporary target (36h) faster than the firmware's timeout could drop it.
Round 3 even found a real self-defeating bug — the keep-alive stamped its clock
on every push, so "stale" never became true — fixed it, and lost anyway.
Fourth round, we read the display chapter of the programmer's reference instead
of tuning the loop. First list in the chapter:
> • 05h (5) - 24h (36): Temporary display for Analogue controls (same as CC
> indices, 05h (5) - 0Ch (12): Faders, 0Dh (13) - 24h (36): Encoders)
> • 35h (53): Permanent/Stationary display
> • 36h (54): Overlay/Temporary display
Thirty-four targets, not two. Every fader and every encoder owns a display of
its own, addressed by its own CC index — and that is the one the firmware
auto-triggers on touch, per config bit 6, "default: Set". A fader sweep fires
target 05h thirty times a second; we were re-summoning 36h once a second.
Unwinnable by construction.
The tell had been sitting there the whole time: buttons were fine. Buttons live
at 25h-34h, outside the analogue range, own no per-control target, and were never
contested at all. A symptom that only some controls have is a symptom about
*which* controls, not about timing.
So: stop fighting, start labelling. Arrangement 4 — the firmware's default — is
"Parameter Name and Numeric Parameter Value", one host field: Name. Empty,
because nobody had written it. Write it and the display we were suppressing
becomes the one we wanted, tracking the value at wire speed and timing its own
dismissal for free.
## Prise (findings / artifacts)
- `tools/lcxl3.py`: per-control target constants, the config bit-field
(`CFG_AUTO_CHANGE` = bit 6 is the native display's on-switch),
`Surface.label_control()` / `native_overlay()`, and `lcxl3.py label|native` for
single-control eye tests.
- `tools/lcxl3-driver.py`: labels all 32 analogue controls on their own targets at
startup, re-asserts every 20 s, stands down from the overlay for them.
`--show-oled` dry-runs the label table offline, opening no port.
- The 3 DJF knobs keep our overlay — "HPF 3.4kHz !!" is prose and arrangement 4's
value is a number — by clearing bits 5+6 on exactly those three targets.
Restored on exit.
- 32 labels pushed to the live device from a second process while the driver kept
translating, uninterrupted (PID up 47 min across the push).
- Three bugs the labels exposed by being the first thing to render at full width:
`set_text` had been silently eating the four reassigned control codes its own
docstring advertised (the heart frames arrived as spaces); `parse_context` said
"a trailing comment IS the best label" and stripped `--` only at the *start* of
the body, where a trailing comment never is; and with no comment it fell back to
raw combinator soup. Across `live/`: **158 syntax-noisy labels out of 22368
became 3**. C8 of piment_bresilien went from `d8 # n "23")) --` to PLN's own
`d8 Raise COMEON!`.
## Sel (the shareable learning)
Three rounds of increasingly clever fixes to a race we could not win, because we
had never asked *which display* the firmware was drawing on. The keep-alive got
better each round and the screen never did — and a fix that improves the
mechanism without moving the symptom is evidence you are fixing the wrong
mechanism.
The partial symptom was the free clue we ignored. "The values win" was treated as
a fact about timing; "the values win *on knobs and faders but not buttons*" is a
fact about addressing, and it was there from the first report.
And the resolution wasn't to defeat the firmware's display. It was to notice the
firmware was offering us a field we had left blank. The best fix took work *away*
from the driver: no keep-alive, no diffing, no 0.9 s re-summon — the hardware
already tracked the value and timed the dismissal, it just didn't know the
control's name.
## Hameçon (hook)
"I spent an evening losing a fight for a screen. Then I read the manual and found
out there were thirty-four of them, and the one I wanted had an empty name field."
# 036 — The night the surface learned to speak (2026-08-29)
**Goal:** play rose_rouge on the just-arrived LCXL3, then design its visual
language live, PLN's hands on the hardware the whole way.
**What shipped** (branch `claude/lcxl3-surface`, `fa22bb8..ac8ed14`):
the driver met a live SuperCollider and needed FOUR defects fixed before one
fader passed (aconnect direction trap, port-name identity ×2, add-only
reconcile); the v3 visual language (role hue × value lightness, DJF
blue→breathing-green-zero→red at the track's BPM); driver-owned truths
(offset-64 relative values, row-E latches, paint reasserted every 2 s); OLED
context in PLN's own words ("Le Delay rose!!!", "HANDS IN THE AIR"); the
34-display-targets discovery that ended the overlay war (log 035); midiviz,
the wordless purple glyph-rain monitor (Opus worker, 999923c); the Ardour
saga — a webcam squatting the control input, then Ardour 9's silent
`config=` load gate, bindings wiped and restored twice (log-worthy on its
own); RIG UP reordered around the SuperDirt-owns-MIDI-first constraint; the
nine-press edge-button census.
**The theme, three times over:** identity bugs. A port's NAME is not the
port (aconnect client vs port name, twice in our code, once in
midi-autoconnect, once independently rediscovered by the midiviz worker), and
a device's saved identity is not the device (Ardour's control input bound to
"C922 Pro Stream Webcam"). Identity is the numeric address; names are
decoration.
**BC invariant, stated and kept:** the corpus speaks v2 forever. Everything
v3 lives in one process; unplug it and the classic LCXL still plays every
track — PLN: "we need to be BC always."
# 037 — The surface follows the track (2026-08-30)
**Goal:** stop the driver from being a one-track instrument. PLN, mid-set, three
ways in one hour: "i see still ROSE_ROUGE in title", "why dont i see the lcxl
colors evolve as i map buttons on the new track?", "im starting a new track,
probably this will be an opp to confirm you read current file well". One bug,
three faces — a driver that parsed its `.tidal` once, at launch, and never
looked again. It played sept1 correctly the whole time, because the v3→v2
translation is track-agnostic, and it labelled everything wrongly, because the
map was rose_rouge's. The sound was right and every light lied.
**What shipped** (`claude/lcxl3-surface`, `7c297a6..ac86478`):
- **Track-follow.** The bus already existed and nobody had read it: the Pulsar
HUD publishes the loaded track to `~/.cache/parvagues/current-track` and
appends every ctrl+enter to `eval-events.jsonl`. A different path is a track
change (remap, relabel 32 targets, repaint, reset the lap clock); a changed
mtime on the same path is a re-read, so mapping a control and saving lights
the board in under a second. Verified live twice in the log while PLN worked.
- **Carry policy**, his spec: DJFs carry (they ARE the transition — "so i can do
djf-and-fader-crossfaded-transitions"), effect knobs go to 0, faders are
physical. Two he did not name carry too, because the sound would otherwise
have taught us: the tempo knob (reset = the range floor = a 60→120 transition
slamming back to 60 as the new track lands) and every button (emitting to a
gate is the mutebomb).
- **Live tempo.** `# cps ((range 60 180 "^29")/60/4)` makes row-B knob 1 the
clock. BPM now comes from the knob, and bar phase is integrated rather than
read off the wall clock — the wall-clock form re-scales all of history the
moment the tempo moves, which would make the countdown jump exactly
mid-transition.
- **The move, served.** PLN: "start holding kick mute, move kick to the 120bpm
position (i used the center notch, now ill rely on OLED), drop kick mute at
end of a bar." So the screen became the notch — BPM not wire units, an arrow
to the nearest landmark that vanishes when he is on it, and while a mute is
held the bar countdown ("DROP kick / ~120 BPM >2") with the ring breathing at
the beat to count it in. Plus software detents, since the encoder has no
ridge.
- **The mute overlay** finally names the held SET ("MUTE x2 / kick+percs",
"all") instead of the last finger down.
- **A probe instead of a fourth guess** (`lcxl3-probe-display.py`, Opus worker):
the frozen lap clock and the 1-second DJF Hz share one unproven rule, the
protocol has no display readback, so the instrument is PLN's eyes asked
precise questions in order.
**Three findings that cost nothing but reading.** The v2 `lcxl-leds-watch`
service has been logging "no LCXL sequencer port" every 30 s since the v3 board
arrived — its name regex cannot match "LCXL3 1", so my prime suspect for the
paint-reset mystery never touched the surface at all, and that mystery is
reopened with no suspect. The Midi-Through→SuperCollider re-add is
`MIDIIn.connectAll`, re-running on sample reload, exactly as
`midi-autoconnect.sh`'s own header predicted. And the A1 label off-by-one that
sat on the board was never real: "d9 level [ard]" is correct — the grid puts
d9-d12 on row A and d1-d8 on the faders.
**Two traps worth the retelling.** The detent welded the knob to the first notch
it met, twice: the closest STEP to a landmark sits just below it, so stepping up
re-crosses the same landmark and snaps back — 24 consecutive clicks stuck at
114.8 BPM before the fix tracked *which* landmark holds you by identity. And a
rich commit message passed inline under zsh lost every backticked code
reference to command substitution, silently; the only hint was a stray "command
not found: resetCycles". Rich messages go through `-F` from now on.
**Answered at the desk, unbuilt on purpose:** PLN asked why rapid ctrl+enter
retriggers the kick "as if it was a once, not a d1". Because `resetCycles` shares
a blank-line block with the patterns, so every eval restarts cycle 0 — and
separately, every `dN` is a 1-cycle crossfade launch by definition
(`d1 = xfade 1 . (|< orbit 0)`). Both diagnosed, neither touched: it is his file
and his taste. The compose/perform mode that would make it a switch instead of a
shadowed `let` is now C-1 on the register.
[
{
"start": 0.0,
"end": 300.0,
"verdict": "bombe_dj",
"lens": "crossmatch only",
"evidence": [
"crossmatch only"
]
},
{
"start": 425.0,
"end": 475.0,
"verdict": "quand_on_decolle",
"lens": "crossmatch only",
"evidence": [
"crossmatch only"
]
},
{
"start": 530.0,
"end": 580.0,
"verdict": "something_about_drums",
"lens": "crossmatch only",
"evidence": [
"crossmatch only"
]
},
{
"start": 630.0,
"end": 685.0,
"verdict": "something_about_drums",
"lens": "locate idf 0.494",
"evidence": [
"locate idf 0.494"
]
},
{
"start": 690.0,
"end": 1015.0,
"verdict": "do_it_right",
"lens": "crossmatch only",
"evidence": [
"crossmatch only"
]
},
{
"start": 1020.0,
"end": 1065.0,
"verdict": "blue_gold",
"lens": "crossmatch only",
"evidence": [
"crossmatch only"
]
},
{
"start": 1090.0,
"end": 1350.0,
"verdict": "you_my_sunshine",
"lens": "crossmatch only",
"evidence": [
"crossmatch only"
]
},
{
"start": 1355.0,
"end": 1600.0,
"verdict": "rose_rouge",
"lens": "locate idf 0.793",
"evidence": [
"locate idf 0.793"
]
},
{
"start": 1695.0,
"end": 1905.0,
"verdict": "rose_rouge",
"lens": "locate idf 0.475",
"evidence": [
"locate idf 0.475"
]
},
{
"start": 1905.0,
"end": 2145.0,
"verdict": "take_5_drops",
"lens": "crossmatch only",
"evidence": [
"crossmatch only"
]
},
{
"start": 2145.0,
"end": 2230.0,
"verdict": "piment_bresilien",
"lens": "crossmatch only",
"evidence": [
"crossmatch only"
]
},
{
"start": 2230.0,
"end": 2275.0,
"verdict": "ouais_je_funk",
"lens": "crossmatch only",
"evidence": [
"crossmatch only"
]
},
{
"start": 2310.0,
"end": 2390.0,
"verdict": "piment_bresilien",
"lens": "crossmatch only",
"evidence": [
"crossmatch only"
]
},
{
"start": 2435.0,
"end": 2500.0,
"verdict": "piment_bresilien",
"lens": "crossmatch only",
"evidence": [
"crossmatch only"
]
},
{
"start": 2525.0,
"end": 2675.0,
"verdict": "ouais_je_funk",
"lens": "crossmatch only",
"evidence": [
"crossmatch only"
]
},
{
"start": 2745.0,
"end": 2905.0,
"verdict": "gimme_acid",
"lens": "crossmatch only",
"evidence": [
"crossmatch only"
]
},
{
"start": 2905.0,
"end": 3080.0,
"verdict": "punkachien",
"lens": "crossmatch only",
"evidence": [
"crossmatch only"
]
},
{
"start": 3090.0,
"end": 3250.0,
"verdict": "mafia",
"lens": "crossmatch only",
"evidence": [
"crossmatch only"
]
},
{
"start": 3320.0,
"end": 3385.0,
"verdict": "livecode_parade",
"lens": "locate idf 0.638",
"evidence": [
"locate idf 0.638"
]
},
{
"start": 3445.0,
"end": 3615.0,
"verdict": "vague_de_crime",
"lens": "crossmatch only",
"evidence": [
"crossmatch only"
]
},
{
"start": 3615.0,
"end": 3660.0,
"verdict": "desire",
"lens": "crossmatch only",
"evidence": [
"crossmatch only"
]
},
{
"start": 3695.0,
"end": 3775.0,
"verdict": "the_revolution_will_be_sampled",
"lens": "crossmatch only",
"evidence": [
"crossmatch only"
]
}
]
\ No newline at end of file
# CosmicFest 2026-08-23 — recovered set (ZOOM0067.MP3, 62:59)
Three independent lenses, fused. **Not a verified tracklist** — PLN's ears remain
the authority. The gig-log that would have settled this in one line never ran;
that is now fixed (`gig-log` is in `rig_units.py` and gated hard by `gig-up.sh`).
## The lenses
| lens | what it measures | independent of |
|---|---|---|
| **crossmatch** | window embeddings (MFCC+chroma+contrast) vs 30 prior renders from OPAL-26 and Montreuil-26 | the others |
| **locate** | Shazam-style landmark fingerprints of rare (df<=6) sample banks, offset-consistency filtered | different features, different references |
| **tempo** | autocorrelation of the 40-120 Hz kick-band envelope vs each track's declared `setcps` | pure DSP, no reference audio at all |
## The set
| start | end | len | verdict | conf | evidence |
|---|---|---|---|---|---|
| 0:00 | 1:24 | 84s | **bombe_dj** | *** | crossmatch=bombe_dj (margin 0.67); locate CONFIRMS; tempo OK 124.1~124= |
| 1:39 | 5:04 | 204s | **bombe_dj** | *** | crossmatch=bombe_dj (margin 0.56); locate CONFIRMS; tempo OK 124.1~124= |
| 11:33 | 16:58 | 324s | **do_it_right** | ** | crossmatch=do_it_right (margin 0.87); tempo OK 178.3~89/2 |
| 18:13 | 22:32 | 259s | **—** | unresolved | crossmatch=you_my_sunshine (margin 0.82); tempo CLASH 82.6 vs 144; -> UNRESOLVED; tempo allows 4 candidates |
| 22:32 | 23:57 | 84s | **quand_on_decolle** | * | crossmatch=quand_on_decolle (margin 0.87) |
| 25:12 | 26:42 | 89s | **—** | unresolved | crossmatch=blue_gold (margin 0.11); tempo CLASH 118.1 vs 124; -> UNRESOLVED; tempo allows 7 candidates |
| 29:57 | 31:17 | 79s | **rose_rouge** | ** | crossmatch=blue_gold (margin 0.44); tempo CLASH 118.1 vs 124; -> OVERRIDE to rose_rouge: locate + tempo agree |
| 31:27 | 35:46 | 259s | **take_5_drops** | ** | crossmatch=take_5_drops (margin 0.58); tempo OK 124.1~124= |
| 35:36 | 37:21 | 104s | **—** | unresolved | crossmatch=piment_bresilien (margin 0.83); tempo CLASH 192.3 vs 124; -> UNRESOLVED; tempo allows 0 candidates |
| 38:31 | 39:51 | 79s | **piment_bresilien** | ** | crossmatch=piment_bresilien (margin 1.19); tempo OK 62.0~124x2 |
| 40:36 | 41:41 | 64s | **piment_bresilien** | ** | crossmatch=piment_bresilien (margin 0.40); tempo OK 124.1~124= |
| 42:06 | 44:35 | 149s | **ouais_je_funk** | ** | crossmatch=ouais_je_funk (margin 0.41); tempo OK 120.1~120= |
| 45:45 | 48:25 | 159s | **—** | unresolved | crossmatch=gimme_acid (margin 0.48); tempo CLASH 128.2 vs 80; -> UNRESOLVED; tempo allows 9 candidates |
| 48:25 | 51:20 | 174s | **punkachien** | ** | crossmatch=punkachien (margin 1.06); tempo OK 170.1~170= |
| 51:30 | 54:10 | 159s | **mafia** | * | crossmatch=mafia (margin 0.69) |
| 54:59 | 56:24 | 84s | **livecode_parade** | ** | crossmatch=gimme_acid (margin 0.46); tempo CLASH 130.0 vs 80; -> OVERRIDE to livecode_parade: locate + tempo agree |
| 57:29 | 60:29 | 179s | **vague_de_crime** | ** | crossmatch=vague_de_crime (margin 0.82); tempo OK 119.8~120= |
| 61:39 | 62:59 | 79s | **the_revolution_will_be_sampled** | * | crossmatch=the_revolution_will_be_sampled (margin 0.48) |
`***` all three lenses agree · `**` two · `*` crossmatch alone · `unresolved` = the
lenses contradict and nothing breaks the tie. Unresolved is a real answer here; a
confident wrong row costs more than a blank one.
## The two rows the system corrected by itself
PLN confirmed independently that he played **rose_rouge** and **livecode_parade**,
and did NOT play blue_gold. The fusion reaches both without being told:
* `29:57` crossmatch said blue_gold (margin 0.44, weak). Tempo clashed: 118.1
measured vs 124 declared. rose_rouge is declared **118**. locate had `rose` at
0.602 offset consistency. Two lenses override one.
* `54:59` crossmatch said gimme_acid (declared 80). Tempo measured **130.0**;
livecode_parade is declared **130**; locate had `love_parade` at 0.399.
Both were reachable because crossmatch *cannot* name them — rose_rouge played
neither reference gig, and livecode_parade's `.tidal` was CREATED in the CosmicFest
prep commit itself, so no prior render can exist. That is a structural blind spot,
not a tuning failure, and the fix is one render per new track.
## Three attempts at the tempo lens, because the first two measured nothing
1. `librosa.feature.tempo`: every segment of an 80-170 BPM set returned 107-130.
That is the estimator's log-normal prior centred on 120, not the music.
2. Mode of inter-onset intervals on the full mix: 233-648 BPM — it locks onto the
fastest subdivision, the hats. Its 'matches' were hollow too: five octave
multiples at 5% tolerance passes about a quarter of *random* values.
3. Autocorrelation of the **kick band** (40-120 Hz): validated on six cases picked
because their tempos are known and well separated, so the test could fail.
bombe 123.9/124, punkachien 170.1/170, vague_de_crime 120.1/120,
do_it_right 178.3/2 = 89.15/89. Four exact to 0.1%, three multiples, 4% tol.
An instrument that agrees where it should is one whose disagreements carry
information. That is the only reason the two overrides above are trustworthy.
## Still unresolved
* `18:13` (259s) — crossmatch says you_my_sunshine at margin 0.82, but tempo says
82.6 (x2=165) against a declared 144. Strong embedding, clashing tempo.
* `25:12`, `35:36`, `45:45` — tempo clashes with crossmatch and no second lens
breaks the tie.
* `5:04-8:54` and `26:42-29:57` carry no confident label at all.
## What would have made this a one-liner
`gig-log` records a `track` event per evaluation, and its MIDI CC stream
fingerprints which controls a loaded track touches. It was installed 2026-07-29,
never enabled, and absent from the authored inventory. Fixed 2026-08-29.
The HUD's `eval-events.jsonl` also missed the set: 21 events from 18:31-18:59
(prep at home), then a 3h15m hole, then four `pluie` evals at 22:14 with zero
orbits. Likely `reference_pulsar_lazy_activation`, but that is a hypothesis.
[
{
"start": 0.0,
"end": 84.89206349206349,
"track": "bombe",
"margin": 0.6707673788070678,
"kick_bpm": 124.10881801125704,
"declared_bpm": 124.0,
"tempo_ok": true,
"tempo_rel": "=",
"locate": "diams_dj cons 0.85"
},
{
"start": 99.84580498866214,
"end": 304.5528344671202,
"track": "bombe",
"margin": 0.5605897108713785,
"kick_bpm": 124.10881801125704,
"declared_bpm": 124.0,
"tempo_ok": true,
"tempo_rel": "=",
"locate": "diams_dj cons 0.85"
},
{
"start": 693.9283446712018,
"end": 1018.4503401360545,
"track": "am_i_doing_it_right",
"margin": 0.8676325489604284,
"kick_bpm": 178.30188679245282,
"declared_bpm": 89.0,
"tempo_ok": true,
"tempo_rel": "/2",
"locate": ""
},
{
"start": 1093.3115646258505,
"end": 1352.9337868480725,
"track": "you_my_sunshine",
"margin": 0.8212043213844299,
"kick_bpm": 82.58426966292134,
"declared_bpm": 144.0,
"tempo_ok": false,
"tempo_rel": null,
"locate": ""
},
{
"start": 1352.910657596372,
"end": 1437.8027210884354,
"track": "quand_on_decolle",
"margin": 0.8728898286819458,
"kick_bpm": 200.45454545454547,
"declared_bpm": null,
"tempo_ok": null,
"tempo_rel": null,
"locate": ""
},
{
"start": 1512.6639455782313,
"end": 1602.548299319728,
"track": "blue_gold",
"margin": 0.10626140609383583,
"kick_bpm": 118.125,
"declared_bpm": 124.0,
"tempo_ok": false,
"tempo_rel": null,
"locate": ""
},
{
"start": 1797.2244897959183,
"end": 1877.1242630385489,
"track": "blue_gold",
"margin": 0.43801358874355045,
"kick_bpm": 118.125,
"declared_bpm": 124.0,
"tempo_ok": false,
"tempo_rel": null,
"locate": "rose cons 0.60"
},
{
"start": 1887.0857142857142,
"end": 2146.7079365079367,
"track": "take5_drops",
"margin": 0.5844392025470734,
"kick_bpm": 124.10881801125704,
"declared_bpm": 124.0,
"tempo_ok": true,
"tempo_rel": "=",
"locate": "rose cons 0.60"
},
{
"start": 2136.70022675737,
"end": 2241.5614512471657,
"track": "piment_bresilien",
"margin": 0.8337016984036094,
"kick_bpm": 192.29651162790697,
"declared_bpm": 124.0,
"tempo_ok": false,
"tempo_rel": null,
"locate": "take5 cons 0.38"
},
{
"start": 2311.4303854875284,
"end": 2391.330158730159,
"track": "piment_bresilien",
"margin": 1.193022438458034,
"kick_bpm": 61.9962511715089,
"declared_bpm": 124.0,
"tempo_ok": true,
"tempo_rel": "x2",
"locate": ""
},
{
"start": 2436.237641723356,
"end": 2501.160544217687,
"track": "piment_bresilien",
"margin": 0.4029255888678811,
"kick_bpm": 124.10881801125704,
"declared_bpm": 124.0,
"tempo_ok": true,
"tempo_rel": "=",
"locate": ""
},
{
"start": 2526.0988662131517,
"end": 2675.890702947846,
"track": "ouais_je_funk",
"margin": 0.41027835437229704,
"kick_bpm": 120.05444646098003,
"declared_bpm": 120.0,
"tempo_ok": true,
"tempo_rel": "=",
"locate": ""
},
{
"start": 2745.7596371882087,
"end": 2905.5360544217688,
"track": "gimme_acid",
"margin": 0.47852219740549723,
"kick_bpm": 128.19767441860466,
"declared_bpm": 80.0,
"tempo_ok": false,
"tempo_rel": null,
"locate": ""
},
{
"start": 2905.5129251700682,
"end": 3080.2662131519273,
"track": "punkachien",
"margin": 1.0621700846787654,
"kick_bpm": 170.05141388174806,
"declared_bpm": 170.0,
"tempo_ok": true,
"tempo_rel": "=",
"locate": ""
},
{
"start": 3090.227664399093,
"end": 3250.004081632653,
"track": "mafia",
"margin": 0.6944610873858134,
"kick_bpm": 162.13235294117646,
"declared_bpm": null,
"tempo_ok": null,
"tempo_rel": null,
"locate": ""
},
{
"start": 3299.9038548752833,
"end": 3384.795918367347,
"track": "gimme_acid",
"margin": 0.4596813917160034,
"kick_bpm": 129.9607072691552,
"declared_bpm": 80.0,
"tempo_ok": false,
"tempo_rel": null,
"locate": "love_parade cons 0.40"
},
{
"start": 3449.6725623582765,
"end": 3629.4181405895692,
"track": "vague_de_crime",
"margin": 0.8222432381966535,
"kick_bpm": 119.83695652173913,
"declared_bpm": 120.0,
"tempo_ok": true,
"tempo_rel": "=",
"locate": "love_parade cons 0.40"
},
{
"start": 3699.287074829932,
"end": 3779.1868480725625,
"track": "revolution",
"margin": 0.4755561777523586,
"kick_bpm": 93.69688385269122,
"declared_bpm": null,
"tempo_ok": null,
"tempo_rel": null,
"locate": ""
}
]
\ No newline at end of file
{
"gig": "cosmicfest-2026",
"_provenance": [
"PLN's ear calls, boundary lab, 2026-08-29. THE ground truth for this gig.",
"The `decided` block came from the lab's export. The `skipped` notes did NOT:",
"the exporter emitted skipped boundaries as bare integers and dropped their",
"comments, so these were recovered from chat and re-entered by hand. That bug",
"is fixed in BoundaryLab.tsx; this file records that these eight notes came",
"the long way round."
],
"decided": {
"1": {
"start": 406.63,
"source": "playhead",
"note": "from here its clearly something about drums, might even start earlier idk"
},
"3": {
"start": 698.63,
"source": "playhead",
"note": "crossfade starts a bit earlier, this 11:38.6 is a good start point"
},
"5": {
"start": 1095.32,
"source": "playhead",
"note": "that's the exact first sound of the next track you_my_sunshine"
},
"6": {
"start": 1364.91,
"source": "playhead",
"note": "at 22:42 its end of reose_rouge, theres a loud blip noise, at 22:44.9 its the start of rose rouge, could we cut noise and blend better?"
},
"7": {
"start": 1897.76,
"source": "playhead",
"note": "at 31:37.8 we're enough in the crosfade it makes a good 5 drops start."
},
"8": {
"start": 2145.61,
"source": "playhead",
"note": "starting at 35:45.6 i hear proper only piment start sound"
},
"11": {
"start": 2525.44,
"source": "playhead",
"note": "start of ouais_je_funk for real"
},
"12": {
"start": 2735.79,
"source": "playhead",
"note": "start of perfect! there was no gimme_acid in this performance."
},
"13": {
"start": 2907.36,
"source": "playhead",
"note": "this is end of perfect -> perfect cut at 48:27.4 into PunkAChien!"
},
"14": {
"start": 3072.47,
"source": "playhead",
"note": "proper start of mafia"
}
},
"skipped": {
"2": {
"note": "00:40 is still sth about drums",
"source": "chat-recovered"
},
"4": {
"note": "seam is wrong, theres no blue_gold in this set, we're hearing do_it_right throughout.",
"source": "chat-recovered"
},
"9": {
"note": "whole section is still piment_bresilien actually",
"source": "chat-recovered"
},
"10": {
"note": "i hear ouais_je_funk already (BTW theres no funk->piment transition! in this set i playd piment once, then funk, then next",
"source": "chat-recovered"
},
"15": {
"note": "livecode parade is already playing at the begin of this segment.",
"source": "chat-recovered"
},
"16": {
"note": "i hear vague de crime from the first section of this segment.",
"source": "chat-recovered"
},
"17": {
"note": "I closed on vague de crime i think i recall now! Clearly didnt play desire i was not found of that closing at opal :')",
"source": "chat-recovered"
},
"18": {
"note": "thissegment is pure dubsiren noise and fun ahahah it could be called \"Outro Dub Siren\" ahah",
"source": "chat-recovered"
}
}
}
{
"gig": "cosmicfest-2026",
"source": "PLN ear calls, boundary lab + chat, 2026-08-29",
"_note": [
"THE ground truth. 14 tracks. Boundaries between decided calls are",
"inferred from adjacent skip notes, so mid-span edges are softer than",
"the playhead calls themselves."
],
"tracks": [
{
"n": 1,
"start": 0.0,
"end": 406.6,
"track": "bombe_dj",
"evidence": "opener; locate diams_dj cons 0.85 across 0:00-3:55"
},
{
"n": 2,
"start": 406.6,
"end": 698.6,
"track": "something_about_drums",
"evidence": "#1 'from here its clearly something about drums, might even start earlier idk'; #2 '00:40 is still sth about drums'"
},
{
"n": 3,
"start": 698.6,
"end": 1095.3,
"track": "do_it_right",
"evidence": "#3 'crossfade starts a bit earlier, this 11:38.6 is a good start point'; #4 'theres no blue_gold in this set, we're hearing do_it_right throughout'"
},
{
"n": 4,
"start": 1095.3,
"end": 1364.9,
"track": "you_my_sunshine",
"evidence": "#5 'thats the exact first sound of the next track you_my_sunshine'"
},
{
"n": 5,
"start": 1364.9,
"end": 1897.8,
"track": "rose_rouge",
"evidence": "#6 'at 22:44.9 its the start of rose rouge'; loud blip at 22:42 flagged for the mix"
},
{
"n": 6,
"start": 1897.8,
"end": 2145.6,
"track": "take_5_drops",
"evidence": "#7 'enough in the crosfade it makes a good 5 drops start'"
},
{
"n": 7,
"start": 2145.6,
"end": 2525.4,
"track": "piment_bresilien",
"evidence": "#8 'i hear proper only piment start sound'; #9 'whole section is still piment_bresilien actually'; #10 'no funk->piment transition! i playd piment once, then funk'"
},
{
"n": 8,
"start": 2525.4,
"end": 2735.8,
"track": "ouais_je_funk",
"evidence": "#11 'start of ouais_je_funk for real'; #10 'i hear ouais_je_funk already'"
},
{
"n": 9,
"start": 2735.8,
"end": 2907.4,
"track": "perfect",
"evidence": "#12 'start of perfect! there was no gimme_acid in this performance.'"
},
{
"n": 10,
"start": 2907.4,
"end": 3072.5,
"track": "punkachien",
"evidence": "#13 'end of perfect -> perfect cut at 48:27.4 into PunkAChien!'"
},
{
"n": 11,
"start": 3072.5,
"end": 3298,
"track": "mafia",
"evidence": "#14 'proper start of mafia'; #15 bounds the end"
},
{
"n": 12,
"start": 3298,
"end": 3424,
"track": "livecode_parade",
"evidence": "#15 'livecode parade is already playing at the begin of this segment'"
},
{
"n": 13,
"start": 3424,
"end": 3676,
"track": "vague_de_crime",
"evidence": "#16 'i hear vague de crime from the first section'; #17 'I closed on vague de crime... Clearly didnt play desire'"
},
{
"n": 14,
"start": 3676,
"end": 3779.3,
"track": "Outro Dub Siren",
"evidence": "#18 'pure dubsiren noise and fun ahahah it could be called \"Outro Dub Siren\"'"
}
]
}
# ParVagues v2 map for a Launch Control XL 3 Custom Mode
Generated from `tools/lcxl_grid.py` — the one authored table. Do not hand-edit;
regenerate. Enter these CC numbers in Novation Components, per control,
left to right. Channel 1 for everything (SuperCollider's MIDIFunc.cc binds
with no channel filter, so only the number matters).
| physical row | col | factory CC | **set CC to** | changed? |
|---|---|---|---|---|
| Encoder row 1 (top) | 1 | 13 | **13** | |
| Encoder row 1 (top) | 2 | 14 | **14** | |
| Encoder row 1 (top) | 3 | 15 | **15** | |
| Encoder row 1 (top) | 4 | 16 | **16** | |
| Encoder row 1 (top) | 5 | 17 | **17** | |
| Encoder row 1 (top) | 6 | 18 | **18** | |
| Encoder row 1 (top) | 7 | 19 | **19** | |
| Encoder row 1 (top) | 8 | 20 | **20** | |
| Encoder row 2 (middle) | 1 | 21 | **29** | **yes** |
| Encoder row 2 (middle) | 2 | 22 | **30** | **yes** |
| Encoder row 2 (middle) | 3 | 23 | **31** | **yes** |
| Encoder row 2 (middle) | 4 | 24 | **32** | **yes** |
| Encoder row 2 (middle) | 5 | 25 | **33** | **yes** |
| Encoder row 2 (middle) | 6 | 26 | **34** | **yes** |
| Encoder row 2 (middle) | 7 | 27 | **35** | **yes** |
| Encoder row 2 (middle) | 8 | 28 | **36** | **yes** |
| Encoder row 3 (bottom) | 1 | 29 | **49** | **yes** |
| Encoder row 3 (bottom) | 2 | 30 | **50** | **yes** |
| Encoder row 3 (bottom) | 3 | 31 | **51** | **yes** |
| Encoder row 3 (bottom) | 4 | 32 | **52** | **yes** |
| Encoder row 3 (bottom) | 5 | 33 | **53** | **yes** |
| Encoder row 3 (bottom) | 6 | 34 | **54** | **yes** |
| Encoder row 3 (bottom) | 7 | 35 | **55** | **yes** |
| Encoder row 3 (bottom) | 8 | 36 | **56** | **yes** |
| Faders | 1 | 5 | **77** | **yes** |
| Faders | 2 | 6 | **78** | **yes** |
| Faders | 3 | 7 | **79** | **yes** |
| Faders | 4 | 8 | **80** | **yes** |
| Faders | 5 | 9 | **81** | **yes** |
| Faders | 6 | 10 | **82** | **yes** |
| Faders | 7 | 11 | **83** | **yes** |
| Faders | 8 | 12 | **84** | **yes** |
| Button row E (upper) | 1 | 37 | **41** | **yes** |
| Button row E (upper) | 2 | 38 | **42** | **yes** |
| Button row E (upper) | 3 | 39 | **43** | **yes** |
| Button row E (upper) | 4 | 40 | **44** | **yes** |
| Button row E (upper) | 5 | 41 | **57** | **yes** |
| Button row E (upper) | 6 | 42 | **58** | **yes** |
| Button row E (upper) | 7 | 43 | **59** | **yes** |
| Button row E (upper) | 8 | 44 | **60** | **yes** |
| Button row F (lower) | 1 | 45 | **73** | **yes** |
| Button row F (lower) | 2 | 46 | **74** | **yes** |
| Button row F (lower) | 3 | 47 | **75** | **yes** |
| Button row F (lower) | 4 | 48 | **76** | **yes** |
| Button row F (lower) | 5 | 49 | **89** | **yes** |
| Button row F (lower) | 6 | 50 | **90** | **yes** |
| Button row F (lower) | 7 | 51 | **91** | **yes** |
| Button row F (lower) | 8 | 52 | **92** | **yes** |
40 of 48 controls need changing; 8 already match.
## Why bother, when the driver also works
Two different jobs. A custom mode plays the corpus with NOTHING running —
no process to die mid-set — but cannot paint: colour and the OLED exist only
in DAW mode (tested). The driver gets paint but is one more moving part.
Firmware 1.1 makes them complementary rather than exclusive: *"The Mode
button can now be held to function as a momentary button, allowing for faster
Custom Mode switching."* So the custom mode is the fallback you reach for when
the instrumented path fails, and it costs one Components session to have.
# lcxl3 custom-mode sniff
[DAW] note_on channel=15 note=11 velocity=127 time=0
[DAW] control_change channel=6 control=30 value=6 time=0
[DAW] note_on channel=15 note=11 velocity=0 time=0
[MIDI] SYSEX len=10 cmd=0x05 00 20 29 02 15 05 00 15 00 06
[MIDI] SYSEX len=10 cmd=0x05 00 20 29 02 15 05 00 15 03 06
#!/usr/bin/env python3
r"""make_bounds — turn machine-labelled segments into a Boundary Lab document.
PLN: "dotn we have a webapp for listening to seams in a set? you could use it for
me to confirm your labels. reusable tooling pattern."
Yes — `armada/ui/bounds.html` (BoundaryLab). This does NOT build a second page; it
generates the document that page already reads, so the ear-confirmation loop is the
one that already exists and already exports decisions.
WHY THIS DIRECTION MATTERS
The three-lens fusion is a machine opinion. Eleven of eighteen CosmicFest
segments have two lenses behind them, four are honestly unresolved, and the two
that were WRONG were caught by PLN's memory, not by any score. So the output of
an analysis pipeline should land in front of ears, not in a report — and the
Boundary Lab already does exactly that, storing calls per gig in localStorage
and exporting `boundaries-<gig>.json`.
THE CONTRACT (read from armada/ui/src/bounds/BoundaryLab.tsx, not assumed)
The page fetches `/bounds-<gig>.json`, so the document goes in
`armada/ui/public/`. Each boundary needs:
track, title (incoming), fromTitle (outgoing), nominal (master time),
clipStart, clipEnd, url, peaks[], marks[{key,label,t}], settled,
noCandidate, note
`marks[].t` is in MASTER time — the page subtracts clipStart itself.
Mark keys are colour-coded by the page: `takeover` is brand magenta ("the one
to try first"), `ear` green, `mid`/`onset` blue, `alt` dim green.
`url` is handed to WaveformPlayer with dur = clipEnd - clipStart, so it must
point at a CLIP of that length, not at the whole recording.
WHY CLIPS AND A MOUNT, RATHER THAN THE WHOLE FILE
`audio-mounts.json` maps `/audio/<prefix>/...` to disk for BOTH vite dev and
armada/serve.py, deliberately, so the SPA's URLs are identical in both — "a UI
that only works under npm run dev is a demo, not a tool". We add one mount and
write clips into it. A 40 s clip also loads instantly on a phone over LAN,
which is where this actually gets used.
"""
from __future__ import annotations
import argparse
import json
import pathlib
import subprocess
import sys
import numpy as np
REPO = pathlib.Path("/home/pln/Work/Sound/Tidal")
PUBLIC = REPO / "armada" / "ui" / "public"
MOUNTS = REPO / "armada" / "ui" / "audio-mounts.json"
N_PEAKS = 1400
def probe_dur(path: pathlib.Path) -> float:
return float(subprocess.run(
["ffprobe", "-v", "error", "-show_entries", "format=duration",
"-of", "csv=p=0", str(path)], capture_output=True, text=True).stdout.strip())
def cut(src: pathlib.Path, dst: pathlib.Path, start: float, dur: float) -> bool:
dst.parent.mkdir(parents=True, exist_ok=True)
r = subprocess.run(
["ffmpeg", "-hide_banner", "-loglevel", "error", "-y",
"-ss", f"{start:.3f}", "-t", f"{dur:.3f}", "-i", str(src),
"-ac", "2", "-b:a", "128k", str(dst)],
capture_output=True, text=True)
return r.returncode == 0 and dst.exists()
def peaks_of(path: pathlib.Path, n: int = N_PEAKS) -> list[float]:
"""Abs-max envelope, n points, normalised to the clip's own peak.
Per-clip normalisation on purpose: these are 40 s windows of a room mic whose
level wanders, and a waveform you cannot see is not a waveform.
"""
import soundfile as sf # noqa: PLC0415
y, _ = sf.read(str(path), dtype="float32", always_2d=True)
y = y.mean(axis=1)
if len(y) < n:
return [0.0] * n
step = len(y) // n
env = np.abs(y[: step * n].reshape(n, step)).max(axis=1)
m = float(env.max()) or 1.0
return [round(float(v / m), 4) for v in env]
def main(argv=None) -> int:
ap = argparse.ArgumentParser(prog="make_bounds", description=__doc__.splitlines()[0])
ap.add_argument("recording")
ap.add_argument("--fused", default=str(REPO / "armada/tide-table/cosmicfest26_fused.json"))
ap.add_argument("--gig", default="cosmicfest-2026")
ap.add_argument("--title", default="CosmicFest 2026 — confirm the machine's labels")
ap.add_argument("--mount", default="cosmic")
ap.add_argument("--pad", type=float, default=20.0)
ap.add_argument("--outdir", default=str(REPO / "armada/tide-table/cosmicfest_bounds"))
a = ap.parse_args(argv)
rec = pathlib.Path(a.recording)
raw = json.load(open(a.fused))
# MERGE consecutive segments carrying the same verdict, before emitting seams.
# Without this the document offered "bombe_dj -> bombe_dj" as cut #1, which is
# not a seam at all: the crossmatch median filter simply produced two adjacent
# windows with the same label. The consolidated tracklist merged them; this
# generator read the un-merged fused file and faithfully published nonsense.
#
# Adjacent UNRESOLVED spans merge too. They might be different tracks, but
# nothing here can tell, and offering two boundaries where we cannot justify
# even one is asking PLN to adjudicate our uncertainty rather than the audio.
segs = []
for r in raw:
if segs and segs[-1].get("verdict") == r.get("verdict"):
segs[-1]["end"] = r["end"]
ev = segs[-1].setdefault("evidence", [])
for e in r.get("evidence", []):
if e not in ev:
ev.append(e)
if r.get("kick_bpm") and not segs[-1].get("kick_bpm"):
segs[-1]["kick_bpm"] = r["kick_bpm"]
else:
segs.append(dict(r))
if len(segs) != len(raw):
print(f"merged {len(raw)} raw segments -> {len(segs)} "
f"({len(raw)-len(segs)} same-label neighbours collapsed)")
outdir = pathlib.Path(a.outdir)
dur = probe_dur(rec)
print(f"{rec.name}: {dur/60:.1f} min · {len(segs)} segments · pad {a.pad}s")
bounds = []
for i, s in enumerate(segs):
nominal = float(s["start"])
if nominal <= 1.0:
continue # the set's start is not a seam
cs = max(0.0, nominal - a.pad)
ce = min(dur, nominal + a.pad)
clip = outdir / f"{i:02d}.mp3"
if not clip.exists() and not cut(rec, clip, cs, ce - cs):
print(f" ! ffmpeg failed for {clip.name}, skipping")
continue
prev = segs[i - 1] if i else None
verdict = s.get("verdict")
if prev is not None and prev.get("verdict") == verdict:
print(f" {i:02d} skipped: {verdict} -> {verdict} is not a seam")
continue
marks = [{"key": "mid", "label": "seg mid",
"t": round((s["start"] + s["end"]) / 2, 2)}]
# The lens that disagreed is worth SEEING on the waveform, because that is
# exactly where an ear call is most valuable.
ev = "; ".join(s.get("evidence", []))
if "OVERRIDE" in ev:
marks.append({"key": "takeover", "label": "lens override here",
"t": round(nominal, 2)})
note = ev or ""
if s.get("kick_bpm"):
note = f"kick {s['kick_bpm']:.1f} BPM · " + note
bounds.append({
"track": i,
"title": verdict or "UNRESOLVED",
"fromTitle": (prev.get("verdict") or "UNRESOLVED") if prev else "start",
"nominal": round(nominal, 2),
"clipStart": round(cs, 2),
"clipEnd": round(ce, 2),
"url": f"/audio/{a.mount}/{clip.name}",
"peaks": peaks_of(clip),
"marks": marks,
# `settled` is the page's "already decided" flag. Nothing here is
# settled: that is the entire reason the document exists.
"settled": False,
"noCandidate": verdict is None,
"note": note[:400],
})
print(f" {i:02d} {nominal/60:5.1f}m {bounds[-1]['fromTitle'][:18]:<20}"
f" -> {bounds[-1]['title'][:20]:<22} {clip.name}")
doc = {"gig": a.gig, "title": a.title, "generated": True,
"pad": a.pad, "boundaries": bounds}
dst = PUBLIC / f"bounds-{a.gig}.json"
dst.write_text(json.dumps(doc))
print(f"\nwrote {dst.relative_to(REPO)} ({dst.stat().st_size/1024:.0f} KB, "
f"{len(bounds)} seams)")
# Register the mount, idempotently, so the same URLs work in dev and prod.
m = json.loads(MOUNTS.read_text())
if m["mounts"].get(a.mount) != str(outdir):
m["mounts"][a.mount] = str(outdir)
MOUNTS.write_text(json.dumps(m, indent=2, ensure_ascii=False) + "\n")
print(f"registered mount '{a.mount}' -> {outdir}")
else:
print(f"mount '{a.mount}' already registered")
# The query key is `set`, NOT `gig`. bounds.tsx reads
# new URLSearchParams(location.search).get('set') ?? 'opal-festival-2026'
# so a wrong key silently loads the DEFAULT document instead of erroring — PLN
# spent time auditioning OPAL's Sunset Forest seams believing they were his
# CosmicFest ones. The variable in that file is named `gig`, which is exactly
# how the mistake was made: grepping found the word and not the key.
print(f"\nAudition: python3 armada/serve.py --dir armada/ui/dist --port 8742")
print(f" then open /bounds.html?set={a.gig}")
print(" (the key is ?set= — ?gig= silently loads the default doc)")
print("Your calls export as boundaries-%s.json from the page." % a.gig)
return 0
if __name__ == "__main__":
sys.exit(main())
......@@ -594,3 +594,43 @@ tail existed only as instructions until this pass.
Both were his second listen changing the answer, which is the argument for
keeping the audition loop cheap: neither correction cost more than a re-render.
## CosmicFest 2026-08-23 — ear pass over the room recording (2026-08-29)
PLN auditioned all 18 machine-proposed seams in the boundary lab, against a
handheld stage-mic capture (`ZOOM0067.MP3`, 62:59). His verdict on the recording
itself, before any of this: *"imo we have a bad rec cause the whole soundsystem
had effects and at some points ppl messed with it lol"*.
**A mix note, not a boundary note.** At the rose_rouge entry: *"at 22:42 its end
of reose_rouge, theres a loud blip noise, at 22:44.9 its the start of rose
rouge, could we cut noise and blend better?"* So a transition can carry a
**defect** that is neither of the two tracks — a blip in the 2.9 s between them.
The boundary tool asks "where does the next track start" and has no way to say
"there is garbage here"; a `noise` mark would let him flag it in place.
**A track that only exists live.** The final 103 s: *"thissegment is pure
dubsiren noise and fun ahahah it could be called 'Outro Dub Siren' ahah"*. The
machine labelled it REVOLUTION, which is the best any reference-based lens could
do — there is no prior render of an improvised outro. Worth catalog-ing under its
own name if the set is ever released.
**A closing he changed his mind about, across gigs.** *"I closed on vague de
crime i think i recall now! Clearly didnt play desire i was not found of that
closing at opal :')"* — the OPAL-26 ending was not to his taste, so he dropped it
at CosmicFest. That is a set-order preference the backlog does not record, and it
explains a machine "ghost": `desire` was proposed at 60:15 purely because a prior
render of it exists.
**Two tracks he did not play at all**, both of which the machine proposed:
`blue_gold` (*"theres no blue_gold in this set, we're hearing do_it_right
throughout"*) and `gimme_acid` (*"there was no gimme_acid in this performance"* —
it was **perfect**). Both were reference-driven false positives: crossmatch can
only choose among tracks it holds a render of, so an absent track's audio gets
assigned to the nearest available one.
**And a structural correction worth remembering for set prep:** *"BTW theres no
funk->piment transition! in this set i playd piment once, then funk, then next"*.
The machine had piment_bresilien and ouais_je_funk alternating in 45-80 s slices,
which was a median-filter artifact, not a performance. A real set alternating two
tracks four times would be unusual; treat that pattern as suspicious by default.
This source diff could not be displayed because it is too large. You can view the blob instead.
{
"recording": "/home/pln/Downloads/ZOOM0067.MP3",
"refdir": "/home/pln/Work/Sound/Prod/Opal26_master/tracks",
"window_s": 15.0,
"hop_s": 5.0,
"smooth_windows": 9,
"features": "20 MFCC (mean+std) + 12 chroma (mean) + 7 spectral contrast (mean)",
"tracks": [
"am_i_doing_it_right",
"blue_gold",
"bombe",
"desire",
"ghosts_in_the_toilets",
"gimme_acid",
"jeudrill",
"mafia",
"ouais_je_funk",
"perfect",
"piment_bresilien",
"plosive",
"punkachien",
"quand_on_decolle",
"revolution",
"sept1",
"something_about_drums",
"super_sunny_side_up",
"take5_drops",
"techno_orage",
"vague_de_crime",
"wap",
"you_my_sunshine"
],
"segments": [
{
"start": 0.0,
"end": 84.89206349206349,
"track": "bombe",
"sim_mean": 2.326028029123942,
"margin_mean": 0.6707673788070678
},
{
"start": 99.84580498866214,
"end": 304.5528344671202,
"track": "bombe",
"sim_mean": 1.7748116040841126,
"margin_mean": 0.5605897108713785
},
{
"start": 429.3369614512472,
"end": 479.2829931972789,
"track": "quand_on_decolle",
"sim_mean": 1.4115474373102188,
"margin_mean": 0.24013188481330872
},
{
"start": 534.1750566893425,
"end": 584.1210884353742,
"track": "something_about_drums",
"sim_mean": 1.824080839753151,
"margin_mean": 0.19256052374839783
},
{
"start": 594.0825396825397,
"end": 649.0208616780045,
"track": "revolution",
"sim_mean": 1.310353398323059,
"margin_mean": 0.12175949414571126
},
{
"start": 639.0131519274377,
"end": 688.9591836734694,
"track": "something_about_drums",
"sim_mean": 1.2422544956207275,
"margin_mean": 0.1321343034505844
},
{
"start": 693.9283446712018,
"end": 1018.4503401360545,
"track": "am_i_doing_it_right",
"sim_mean": 1.7631455924775865,
"margin_mean": 0.8676325489604284
},
{
"start": 1023.4195011337869,
"end": 1068.3732426303854,
"track": "blue_gold",
"sim_mean": 1.3923064129693168,
"margin_mean": 0.5740974119731358
},
{
"start": 1093.3115646258505,
"end": 1352.9337868480725,
"track": "you_my_sunshine",
"sim_mean": 1.90894162774086,
"margin_mean": 0.8212043213844299
},
{
"start": 1352.910657596372,
"end": 1437.8027210884354,
"track": "quand_on_decolle",
"sim_mean": 1.4542362332344054,
"margin_mean": 0.8728898286819458
},
{
"start": 1457.748752834467,
"end": 1517.679365079365,
"track": "blue_gold",
"sim_mean": 1.3168923377990722,
"margin_mean": 0.5831946909427643
},
{
"start": 1512.6639455782313,
"end": 1602.548299319728,
"track": "blue_gold",
"sim_mean": 0.8362636901438236,
"margin_mean": 0.10626140609383583
},
{
"start": 1662.4326530612245,
"end": 1707.3863945578232,
"track": "perfect",
"sim_mean": 1.0441721848079137,
"margin_mean": 0.15980574914387294
},
{
"start": 1732.324716553288,
"end": 1782.2707482993196,
"track": "ghosts_in_the_toilets",
"sim_mean": 1.2327303662896156,
"margin_mean": 0.14953850209712982
},
{
"start": 1797.2244897959183,
"end": 1877.1242630385489,
"track": "blue_gold",
"sim_mean": 0.6630881194557462,
"margin_mean": 0.43801358874355045
},
{
"start": 1887.0857142857142,
"end": 2146.7079365079367,
"track": "take5_drops",
"sim_mean": 1.9131825828552247,
"margin_mean": 0.5844392025470734
},
{
"start": 2136.70022675737,
"end": 2241.5614512471657,
"track": "piment_bresilien",
"sim_mean": 2.264173796302394,
"margin_mean": 0.8337016984036094
},
{
"start": 2231.553741496599,
"end": 2276.5074829931973,
"track": "ouais_je_funk",
"sim_mean": 1.398917487689427,
"margin_mean": 0.14644076142992293
},
{
"start": 2311.4303854875284,
"end": 2391.330158730159,
"track": "piment_bresilien",
"sim_mean": 1.8342654279300146,
"margin_mean": 1.193022438458034
},
{
"start": 2436.237641723356,
"end": 2501.160544217687,
"track": "piment_bresilien",
"sim_mean": 1.451278654011813,
"margin_mean": 0.4029255888678811
},
{
"start": 2526.0988662131517,
"end": 2675.890702947846,
"track": "ouais_je_funk",
"sim_mean": 1.9318194772515977,
"margin_mean": 0.41027835437229704
},
{
"start": 2745.7596371882087,
"end": 2905.5360544217688,
"track": "gimme_acid",
"sim_mean": 2.1704105695088702,
"margin_mean": 0.47852219740549723
},
{
"start": 2905.5129251700682,
"end": 3080.2662131519273,
"track": "punkachien",
"sim_mean": 2.3882757605928364,
"margin_mean": 1.0621700846787654
},
{
"start": 3090.227664399093,
"end": 3250.004081632653,
"track": "mafia",
"sim_mean": 2.214364759127299,
"margin_mean": 0.6944610873858134
},
{
"start": 3299.9038548752833,
"end": 3384.795918367347,
"track": "gimme_acid",
"sim_mean": 1.565756130218506,
"margin_mean": 0.4596813917160034
},
{
"start": 3409.7342403628118,
"end": 3459.6802721088434,
"track": "desire",
"sim_mean": 2.141493782401085,
"margin_mean": 0.17272403836250305
},
{
"start": 3449.6725623582765,
"end": 3629.4181405895692,
"track": "vague_de_crime",
"sim_mean": 2.152665986734278,
"margin_mean": 0.8222432381966535
},
{
"start": 3619.4104308390024,
"end": 3664.364172335601,
"track": "desire",
"sim_mean": 2.4372547013419017,
"margin_mean": 0.28722901003701345
},
{
"start": 3699.287074829932,
"end": 3779.1868480725625,
"track": "revolution",
"sim_mean": 2.153998928410666,
"margin_mean": 0.4755561777523586
}
],
"caveat": "similarity is to a DIFFERENT performance of the same track. A thin margin means the palette matched but the track did not; tracks sharing instruments (the cafe_* family) will not separate."
}
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -2,16 +2,16 @@
"_comment": [
"Where /audio/<prefix>/... resolves to on disk. Read by vite.config.ts in dev",
"and by armada/serve.py in production, so the SPA's URLs are identical in both",
"\u2014 a UI that only works under `npm run dev` is a demo, not a tool.",
"— a UI that only works under `npm run dev` is a demo, not a tool.",
"",
"Masters live outside the repo (they are gigabytes). Mounting them by prefix",
"keeps the URLs stable while the paths move between gigs, and keeps `heads`",
"and `full` apart \u2014 `master split` names both '01 - Title.flac', so a single",
"and `full` apart — `master split` names both '01 - Title.flac', so a single",
"flat mount would serve the 98 MB track when the UI asked for the 16 s head.",
"",
"'samples' is the whole custom sample root, not just one pack, so the kit",
"auditioner works on every kit PLN owns \u2014 the 163 already there and every",
"one the Foundry cuts next \u2014 without a config change per pack."
"auditioner works on every kit PLN owns — the 163 already there and every",
"one the Foundry cuts next — without a config change per pack."
],
"mounts": {
"bounds": "/home/pln/Work/Sound/Prod/Opal26_master/bounds_v4",
......@@ -20,6 +20,7 @@
"heads": "/home/pln/Work/Sound/Prod/Opal26_master/heads_v4",
"joins": "/home/pln/Work/Sound/Prod/Opal26_master/joins_v4",
"samples": "/home/pln/Work/Sound/Samples",
"": "/home/pln/Work/Sound/Tidal/armada/tide-table/punkachien"
"": "/home/pln/Work/Sound/Tidal/armada/tide-table/punkachien",
"cosmic": "/home/pln/Work/Sound/Tidal/armada/tide-table/cosmicfest_bounds"
}
}
This source diff could not be displayed because it is too large. You can view the blob instead.
......@@ -37,7 +37,14 @@ interface Boundary {
}
interface BoundsDoc { gig: string; title: string; pad: number; boundaries: Boundary[] }
// `noise` came from PLN auditioning CosmicFest: "at 22:42 its end of reose_rouge,
// theres a loud blip noise, at 22:44.9 its the start of rose rouge, could we cut
// noise and blend better?" — a defect in the 2.9 s BETWEEN two tracks, belonging
// to neither. Until now the lab could only answer "where does the next track
// start", so a transition carrying garbage had nowhere to be recorded, and the
// note survived only as prose in a comment box.
const MARK_COLOR: Record<string, string> = {
noise: 'rgba(255, 96, 64, 0.95)', // a defect, not a candidate — warm and loud
takeover: 'rgba(217, 0, 255, 0.9)', // brand magenta — the one to try first
mid: 'rgba(120, 170, 255, 0.75)',
onset: 'rgba(120, 170, 255, 0.45)',
......@@ -46,7 +53,7 @@ const MARK_COLOR: Record<string, string> = {
nominal: 'rgba(255, 255, 255, 0.35)',
}
type Call = { t: number | null; comment: string; source: string }
type Call = { t: number | null; comment: string; source: string; noise?: number[] }
export function BoundaryLab({ gig }: { gig: string }) {
const [doc, setDoc] = useState<BoundsDoc | null>(null)
......@@ -75,13 +82,16 @@ export function BoundaryLab({ gig }: { gig: string }) {
const markers = useMemo(() => {
if (!b) return []
const all = [...b.marks, { key: 'nominal', label: 'nominal', t: b.nominal }]
const mine = (calls[b.track]?.noise ?? []).map((t, n) => ({
key: 'noise', label: `noise ${n + 1}`, t,
}))
const all = [...b.marks, ...mine, { key: 'nominal', label: 'nominal', t: b.nominal }]
return all.map((m) => ({
t: toClip(m.t),
label: m.label,
color: MARK_COLOR[m.key] ?? MARK_COLOR.nominal,
}))
}, [b, toClip])
}, [b, toClip, calls])
const jump = useCallback((tMaster: number, lead = 4) => {
// land a few seconds BEFORE the candidate: a cut is judged by what leads
......@@ -101,6 +111,21 @@ export function BoundaryLab({ gig }: { gig: string }) {
if (e.key === 'j') setI((v) => Math.min(doc.boundaries.length - 1, v + 1))
else if (e.key === 'k') setI((v) => Math.max(0, v - 1))
else if (e.key === 'Enter' && b) setCall(toMaster(now), 'playhead')
// `n` marks garbage AT the playhead and leaves the cut call untouched: a
// blip between two tracks is not an opinion about where either begins.
else if (e.key === 'n' && b) {
const t = Number(toMaster(now).toFixed(2))
setCalls((c) => {
const cur = c[b.track] ?? { t: null, source: 'noise', comment: '' }
const noise = [...(cur.noise ?? []), t].sort((x, y) => x - y)
return { ...c, [b.track]: { ...cur, noise } }
})
}
// `N` clears them, because a mis-tapped defect marker you cannot remove is
// worse than none.
else if (e.key === 'N' && b) {
setCalls((c) => (c[b.track] ? { ...c, [b.track]: { ...c[b.track], noise: [] } } : c))
}
}
window.addEventListener('keydown', onKey)
return () => window.removeEventListener('keydown', onKey)
......@@ -114,13 +139,34 @@ export function BoundaryLab({ gig }: { gig: string }) {
'Ear calls from the boundary lab. Times are absolute MASTER seconds.',
'These are PLN\'s answers — merge them into the `verified` block of',
'judge_specs/<gig>_boundaries_ear.json, which is the ground truth.',
'BOTH blocks carry notes: a skipped seam usually means the seam itself is',
'wrong, which is more informative than a confirmed cut time.',
],
decided: Object.fromEntries(
Object.entries(calls)
.filter(([, c]) => c.t !== null)
.map(([k, c]) => [k, { start: Number(c.t!.toFixed(2)), source: c.source, note: c.comment }]),
.map(([k, c]) => [k, {
start: Number(c.t!.toFixed(2)), source: c.source, note: c.comment,
...(c.noise?.length ? { noise: c.noise } : {}),
}]),
),
// Skipped boundaries keep their NOTE. They used to export as bare integers,
// which silently threw away the most valuable thing in the file: PLN skipped
// eight CosmicFest seams and typed a correction into every one of them —
// "theres no blue_gold in this set", "no funk->piment transition", "could be
// called Outro Dub Siren" — and the export emitted `[2,4,9,10,15,16,17,18]`.
// A skip is not an absence of judgement; it is usually a judgement that the
// SEAM is wrong rather than that the moment is unclear.
// The comment was always kept in state (the textarea writes it with t ?? null),
// so this recovers notes already in localStorage, not just future ones.
skipped: Object.fromEntries(
Object.entries(calls)
.filter(([, c]) => c.t === null)
.map(([k, c]) => [k, {
source: c.source, note: c.comment,
...(c.noise?.length ? { noise: c.noise } : {}),
}]),
),
skipped: Object.entries(calls).filter(([, c]) => c.t === null).map(([k]) => Number(k)),
}
const url = URL.createObjectURL(new Blob([JSON.stringify(out, null, 1)], { type: 'application/json' }))
const a = document.createElement('a')
......@@ -268,7 +314,7 @@ export function BoundaryLab({ gig }: { gig: string }) {
</section>
<p className="mt-6 font-mono text-[10px] text-ink-faint/70">
j/k next-prev · space play/pause · Enter = take the playhead · drag to loop a span ·
n = mark noise (N clears) · j/k next-prev · space play/pause · Enter = take the playhead · drag to loop a span ·
clip is ±{doc.pad}s around the current cut, all exported times are master time
</p>
</div>
......
......@@ -8,14 +8,14 @@ let gMute = (midiOn "^73" (mask "f*16"))
let gM = gMask . gMute
d1 $ gF $ gM
$ midiOn "^14" (fast 2)
$ midiOn "^42" (superimpose (# "808bd:2") . struct "t t t <t <[~ t] t*2>>")
$ midiOn "^41" (superimpose (# "808bd:2") . struct "t t t <t <[~ t] t*2>>")
-- $ midiOff "^42" (<| "<t ~> . ~ ~ <~ t> <~!3 t>")
$ midiOff "^42" (<| "[t ~ t t]*4")
$ midiOff "^41" (<| "[t ~ t t]*4")
$ "[jazz ~ jazz:1 jazz:1]*4"
# midiG' "^78" 0 1.3
d2 $ gF2 $ gMask -- Coupe de feu
$ midiOn "^43" (struct "~ t ~ t ~ t ~ [<t ~ ~ t> <~ t>]")
$ midiOff "^43" (slow 2)
$ midiOn "^42" (struct "~ t ~ t ~ t ~ [<t ~ ~ t> <~ t>]")
$ midiOff "^42" (slow 2)
$ "~ cp"
# lpf 2000
# note (-4)
......@@ -25,7 +25,7 @@ d3 -- weird memories
$ "90s_weird:1"
# cut 3
# note 0
# crushbus 31 (range 16 2.5 "^56")
# crushbus 31 (range 16 2.5 "^31")
# panbus 32 (range "<0.1 0.2 0.3 0.4>" "<0.4 0.5 0.6 0.7>" (fast 16 sine))
# room 0.74 # dry 1.4
# sz 0.1
......@@ -45,16 +45,16 @@ d5 $ gF2 $ gMask
$ midiOn "^57" (euclid "<3 [3 5] 5 [5 <4 8>]>" 8)
$ note (slow 2 "[gs3@2,<gs2'maj'4 c3'maj'4 gs2'maj'4 f2'maj'4>]")
# "bassWarsaw"
# crushbus 51 (range 16 2.5 "^53")
# crushbus 51 (range 16 2.5 "^33")
# room 0.2
# pan 0.3
# midiG' "^81" 0 1.3
d6 $ gF $ gM -- Break rayon laser =------------>
$ midiOn "^91" (ply 8)
$ midiOn "^59" (ply "1 <1!3 2>")
$ midiOff "^59" (slow 4)
$ midiOn "^90" (ply 8)
$ midiOn "^58" (ply "1 <1!3 2>")
$ midiOff "^58" (slow 4)
$ slice 8 (run "<8!7 16>")
$ "break:4"
# cut 6
# speed (range 0 2 "^55")
# speed (range 0 2 "^34")
# midiG' "^83" 0 1.5
......@@ -6,21 +6,24 @@ let gF = (# djfbus 1 (range 0.05 0.95 "^49"))
let gM = gMask
d1 $ gM1 $ gF
$ midiOn "^14" (fast 2)
$ midiOn "^42" (superimpose (# "808bd:2") . struct "t t t <t <[~ t] t*2>>")
$ midiOn "^41" (superimpose (# "808bd:2") . struct "t t t <t <[~ t] t*2>>")
-- $ midiOff "^42" (<| "<t ~> . ~ ~ <~ t> <~!3 t>")
$ midiOff "^42" (<| "t")
$ midiOff "^41" (<| "t")
$ "[808bd:13,cpu]" -- 4 6
# midiG' "^78" 0 1.2
d2 $ gM2 $ gF -- Slow clap
$ midiOn "^41" (<| "~ s ~ s ~ s ~ s*<1 2>") -- RUN!
-- FIXME(#94) d2 drives more controls than the grid gives it (BT2 only — BL1-3 are the family mutes). ^42 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^42 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 d2's own control with gSel.
$ midiOn "^42" (<| "~ s ~ s ~ s ~ s*<1 2>") -- RUN!
-- FIXME(#94) d2 drives more controls than the grid gives it (BT2 only — BL1-3 are the family mutes). ^43 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^43 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 d2's own control with gSel.
-- FIXME(#94) d2 drives more controls than the grid gives it (BT2 only — BL1-3 are the family mutes). ^43 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^43 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 d2's own control with gSel.
$ midiOn ("^43" - "^42") ((whenmod 8 4 (fast "<1 2 1 4> <2 2 4 4>")) . (struct "~ t ~ t"))
$ midiOff ("^43" + "^41" + "^42") (struct "~ t")
$ midiOff ("^43" + "^42" + "^42") (struct "~ t")
$ "clap"
# hpqbus 22 (range 0 (1 - "^41") "^31")
# hpqbus 22 (range 0 (1 - "^42") "^30")
# hpfbus 21 (range 0 5000 "^51")
# midiG' "^79" 0 1.2
d3 $ gM2 $ gMask $ gF -- Broken drummer
$ sometimesBy (1 - "^52") (mask "t(3,8)")
$ sometimesBy (1 - "^31") (mask "t(3,8)")
$ sometimesBy "0!4 1 0!3" (mask "t(4,16)")
$ sometimesBy "0!7 1" (ply 2)
$ n (run 16)
......@@ -29,7 +32,7 @@ d3 $ gM2 $ gMask $ gF -- Broken drummer
# midiG' "^80" 0 1.2
# cut 3
d6 $ gM3 -- Drumroll fou
$ midiOn "^91" (fast "2 <2!3 <4 [4 8]>>")
$ midiOn "^90" (fast "2 <2!3 <4 [4 8]>>")
$ "dr*[<16 [16 32 16]> 16 <32 [32 16 32]> <16 [8 16]>]"
# "drum:2"
# midiG' "^83" 0 1.1
......@@ -42,7 +45,7 @@ d4 $ gF2 "atmos/4" # "90s_synatm:0" # cut 4
# delay 0.2
# delayfb 0.8
# delayt 0.125
# crushbus 41 (range 16 1.2 "^56")
# crushbus 41 (range 16 1.2 "^32")
# pan 0.7
# midiG' "^84" 0 0.9
d5 $ gMask $ gF2-- La Basse qui devance
......@@ -53,7 +56,7 @@ d5 $ gMask $ gF2-- La Basse qui devance
-- chop "4 <[4 8]> 4 <4!3 16>"
)
$ juxBy 0.3 (
(# crushbus 51 (range 16 2.2 "^53"))
(# crushbus 51 (range 16 2.2 "^33"))
. (|* gain 0.8)
)
$ note ("<a <f [f@7 g]> e@2>"
......
......@@ -4,10 +4,12 @@ setcps (60/60/4)
let width = pF "width"
let dMask = (whenmod 8 7 (mask "t t <t [f t]> f"))
d1 $ gF1 $ gM1
$ midiOn "^30" (fast 2)
$ midiOn "^42" ((<| "k k k <k k*2 k [~ k*2]>"))
$ midiOff "^42" (<| "k . <~!8 k(3,8)!8>")
-- FIXME(#54) d1 drives more controls than the grid gives it (B1 only (C1-3 are the family gF filters)). ^29 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^29 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 d1's own control with gSel.
$ midiOn "^29" (fast 2)
$ midiOn "^41" ((<| "k k k <k k*2 k [~ k*2]>"))
$ midiOff "^41" (<| "k . <~!8 k(3,8)!8>")
$ "kick:5"
-- TODO(tempo): wrap the range in `quantise 1` — 128 CC steps rarely land on a round BPM
# cps ((range 60 120 "^29")/60/4)
d2 $ gF1 $ gM2
$ "~ s ~ s ~ s ~ s*2"
......@@ -15,11 +17,11 @@ d2 $ gF1 $ gM2
# room 0.4 # dry 0.9
d3 $ gF1 $ gM2 $ "dr*[8 8 <8 <12 24>> 16]"
d4 $ gF2 $ gM3
$ midiOn "^89" (ply 4)
$ midiOn "^76" (ply 4)
$ superimpose (arp "up <up!3 down>" . (|+| note "c'maj9'8"))
$ superimpose (
(# lpf 5000)
. (# crushbus 41 (range 16 4 "^53"))
. (# crushbus 41 (range 16 4 "^32"))
)
-- $ midiOn "^"
$ note "<ef3 <fs3 bf3>>"
......@@ -36,7 +38,7 @@ d9 $ gF2 $ gM3
# octerbus 91 (range 0 1.4 "^19")
# crushbus 92 (range 16 3 "^18")
d5 $ gF3 $ gM3 -- MAIN CRUTCH
$ midiOn "^90" (ply "2 <4 8>")
$ midiOn "^89" (ply "2 <4 8>")
-- $ slice 4 "<0 1 2 3>"
$ chop 8
$ loopAt 2
......
......@@ -5,14 +5,14 @@ let modIndex = pF "modIndex"
d1 $ gM1 $ gF1 -- Kick solide
$ fix ((|* gain 0.9) . (# lpf 1000)) "jazz"
$ fix ((# att 0.02) . (# rel 0.5) . (# lpf 5000)) "kick:4"
$ midiOn "^42" (struct "t t t t")
$ midiOff "^42" (struct "t ~ t ~")
$ midiOn "^41" (struct "t t t t")
$ midiOff "^41" (struct "t ~ t ~")
$ "[jazz,kick:4]"
# gain 1.3
d2 $ gM2 $ gF1 -- snare contretemps variable
$ fix ((|* gain 0.8) . (# legato 0.05)) "cp"
$ midiOn "^43" (<| "~ cp ~ cp*<1 1 2 <1 2>>")
$ midiOff "^43" (<| "~ [cp*<1!3 <2 <4 [4 2]>>> ~]")
$ midiOn "^42" (<| "~ cp ~ cp*<1 1 2 <1 2>>")
$ midiOff "^42" (<| "~ [cp*<1!3 <2 <4 [4 2]>>> ~]")
$ "[snare:24,cp]"
# pan 0.65
# gain 1.6
......@@ -22,8 +22,8 @@ d3 $ gM2 $ gF1
# hpf 7000
# gain 1.5
d4 $ gF2 $ gM3
$ midiOn "^89" (ply "4 8")
$ midiOff "^89" (superimpose (struct "t(5,8)"))
$ midiOn "^76" (ply "4 8")
$ midiOff "^76" (superimpose (struct "t(5,8)"))
$ note (
"<a3 d3 c3 <a3!3 e3>>"
-- + "[0,0(3,8)]"
......@@ -31,7 +31,7 @@ d4 $ gF2 $ gM3
# "bassWarsaw"
# gain 1.4
# room 0.4
# crushbus 41 (range 16 3.5 "^53")
# crushbus 41 (range 16 3.5 "^32")
d8 $ gF1 $ gM2
$ midiOn "^92" (ply "1 <2!3 4>")
$ midiOff "^60" (mask "t(4,8,1)") -- Techno drum mask
......@@ -56,8 +56,8 @@ d6 $ gF1 $ gM3 -- HAWKS
# gain 1.5
d7
$ gM3 $ gF3 -- High carillon!
$ midiOn "^91" (off "[e,s]" (ply "<1 2>") . (# legato "e"))
$ midiOn "^59" ( -- Basse reponse
$ midiOn "^59" (off "[e,s]" (ply "<1 2>") . (# legato "e"))
$ midiOn "^91" ( -- Basse reponse
superimpose ((0.125 <~) . (|* gain 1.2) . (# note "<c4!4 cs4!4>") . (# pan 0.45))
)
$ (0.125 ~>)
......@@ -66,8 +66,8 @@ d7
)
# "808hc:2"
# pan 0.85
# octerbus 71 (range 0 0.5 "^55")
# octersubbus 72 (range 0 1.4 "^55")
# octerbus 71 (range 0 0.5 "^35")
# octersubbus 72 (range 0 1.4 "^35")
# room 0.2 # dry 1.08 # sz 0.3
# gain 1.4
d9 $ gF3 -- Pads atmospheriques
......
......@@ -11,20 +11,22 @@ let gMute = (midiOn "^73" (mask "f*16"))
let gM = gMask . gMute
let modIndex = pF "modIndex"
d1 $ gF1 $ gM -- Kick
$ midiOn "^42" (struct "t . ~ t ~ <~!7 t>")
$ midiOn "^41" (struct "t . ~ t ~ <~!7 t>")
-- $ struct ("t <t!3 [~ t]> t <t!6 ~!2>") -- RUN!
$ "cpu"
# midiG' "^78" 0 1.2
# pan 0.8
d2 $ gF1 $ gM2 -- Snare
$ midiOn "^43" (struct "~ t ~ t")
$ midiOff "^43" (struct "~ . t")
$ midiOn "^42" (struct "~ t ~ t")
$ midiOff "^42" (struct "~ . t")
$ "808sd:6" -- "snare:5"
# release 0.4
# att 0.02
# midiG' "^79" 0 1.5
d3 $ gF1 $ gMute -- Hats complément
$ midiOn "^44" (fast 2)
$ midiOn "^43" (fast 2)
-- FIXME(#94) d3 drives more controls than the grid gives it (BT3 only — BL1-3 are the family mutes). ^76 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^76 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 d3's own control with gSel.
-- FIXME(#94) d3 drives more controls than the grid gives it (BT3 only — BL1-3 are the family mutes). ^76 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^76 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 d3's own control with gSel.
$ midiOn "^76" (ply "<2 4>")
-- $ "~ h ~ <h!3 ~> ~ <~!8 h!8> ~ h"
$ "h h h h" # "cpu:4"
......@@ -39,14 +41,14 @@ d8 $ gF3
# midiG' "^84" 0 1
# cut 8
d4 $ gF2
$ midiOn "^57" (struct "t(3,8)" . arpeggiate . (# legato 2) . (# room 0.2) . (# size 0.8))
$ midiOn "^44" (struct "t(3,8)" . arpeggiate . (# legato 2) . (# room 0.2) . (# size 0.8))
-- $ note (slow 2 "<[c4, e4, a4] [g3, b4, d4]>")
-- TODO: Try with just the fundamentals:
-- "e3 a3 d3 g3 e3 a3 d3 c3 g2 c3 f3 e3" -- 12 Chorus
-- "e3 ~" -- Bridge x2 -- OR SILENT?
-- "a3 d3 g3 c3 a3 d3 e3 e3 a3 d3 g3 b2" -- 12 Verse
-- Pasted: Chorus/Bridge/Verse/Chorus/Bridge2/Verse/Chorus/Bridge8
$ midiOn "^89" (chop 8)
$ midiOn "^76" (chop 8)
-- $ note ("<e3 a3 d3 g3 e3 a3 d3 c3 g2 c3 f3 e3 e3 ~ a3 d3 g3 c3 a3 d3 e3 e3 a3 d3 g3 b2 e3 a3 d3 g3 e3 a3 d3 c3 g2 c3 f3 e3 e3 ~ a3 d3 g3 c3 a3 d3 e3 e3 a3 d3 g3 b2 e3 a3 d3 g3 e3 a3 d3 c3 g2 c3 f3 e3 e3 ~ e3 ~ e3 ~ e3 ~>")
-- TODO: Move along new fundamentals
-- Mapping to: F G Ab Bb C Db Eb
......@@ -103,7 +105,7 @@ let gMute = (midiOn "^73" (mask "f*16"))
let gM = gMask . gMute
let modIndex = pF "modIndex"
d1 $ gF1 $ gM -- Kick
$ midiOn "^42" (struct "t . ~ t ~ ~")
$ midiOn "^41" (struct "t . ~ t ~ ~")
-- $ struct ("t <t!3 [~ t]> t <t!6 ~!2>") -- RUN!
$ fix (|* gain 0.7) "jazz"
$ fix ((|* gain 0.7) . (# "jazz") . (# n "<4 4 <3 3 4 4> 3>")) "sub"
......@@ -111,8 +113,8 @@ d1 $ gF1 $ gM -- Kick
# midiG' "^78" 0 1.2
# pan 0.8
d2 $ gF1 $ gMask -- Snare
$ midiOff "^43" (struct "~ ~ ~ t")
$ midiOn "^43" (struct "~ t ~ t")
$ midiOff "^42" (struct "~ ~ ~ t")
$ midiOn "^42" (struct "~ t ~ t")
$ "808sd:6"-- "snare:5"
# release 0.4
# att 0.02
......@@ -132,9 +134,9 @@ d4 $ gF2 $ gMute -- Hats pirouette
# midiG' "^80" 0 0.8
# pan 0.65
d5 $ gM $ gF2 -- BASSLINE!
$ midiOn "^58" (|- note 24)
$ midiOn "^57" (|- note 24)
$ mask "<t!3 t(<1 8>,8)>"
$ midiOn "^90" ( -- FIRELINE
$ midiOn "^89" ( -- FIRELINE
off 0.5 (
-- (# crush 6) .
(|- note 12)
......@@ -153,7 +155,7 @@ d5 $ gM $ gF2 -- BASSLINE!
# room 0.64 # sz 0.5 # dry 1
# pan 0.2
# midiG' "^82" 0 1.6
# modIndex (range 0 2 "^54")
# modIndex (range 0 2 "^33")
d6 $ gM $ gF1
$ fix (|* gain 0.7) "cpu"
-- $ sometimesBy "0 0.25" (mask "t . t(<3 5 8 1>,8)")
......
......@@ -7,7 +7,7 @@ let gMute = (midiOn "^73" (mask "f*16"))
let gM = gMask . gMute
let modIndex = pF "modIndex"
d1 $ gF1 $ gM -- Kick
$ midiOn "^42" (struct "t . ~ t ~ ~")
$ midiOn "^41" (struct "t . ~ t ~ ~")
-- $ struct ("t <t!3 [~ t]> t <t!6 ~!2>") -- RUN!
$ fix (|* gain 0.7) "jazz"
$ fix ((|* gain 0.7) . (# "jazz") . (# n "<4 4 <3 3 4 4> 3>")) "sub"
......@@ -15,14 +15,14 @@ d1 $ gF1 $ gM -- Kick
# midiG' "^78" 0 1.2
# pan 0.8
d2 $ gF1 $ gMask -- Snare
$ midiOff "^43" (struct "~ ~ ~ t")
$ midiOn "^43" (struct "~ t ~ t")
$ midiOff "^42" (struct "~ ~ ~ t")
$ midiOn "^42" (struct "~ t ~ t")
$ "808sd:6"-- "snare:5"
# release 0.4
# att 0.02
# midiG' "^79" 0 1.5
d3 $ gF1 $ gMute -- Hats complément
$ midiOn "^76" (ply "<2 4>")
$ midiOn "^43" (ply "<2 4>")
$ "~ h ~ <h!3 ~> ~ <~!8 h!8> ~ h"
# "snare:51"
# att 0.0125 # rel 2 # hpf 3000
......@@ -36,9 +36,9 @@ d4 $ gF2 $ gMute -- Hats pirouette
# midiG' "^80" 0 0.8
# pan 0.65
d5 $ gM $ gF2 -- BASSLINE!
$ midiOn "^58" (|- note 24)
$ midiOn "^57" (|- note 24)
$ mask "<t!3 t(<1 8>,8)>"
$ midiOn "^90" ( -- FIRELINE
$ midiOn "^89" ( -- FIRELINE
off 0.5 (
-- (# crush 6) .
(|- note 12)
......@@ -57,7 +57,7 @@ d5 $ gM $ gF2 -- BASSLINE!
# room 0.64 # sz 0.5 # dry 1
# pan 0.2
# midiG' "^82" 0 1.6
# modIndex (range 0 2 "^54")
# modIndex (range 0 2 "^33")
d6 $ gM $ gF1
$ fix (|* gain 0.7) "cpu"
-- $ sometimesBy "0 0.25" (mask "t . t(<3 5 8 1>,8)")
......
......@@ -6,19 +6,21 @@ let gMute = (midiOn "^73" (mask "f*16"))
let gM = gMask . gMute
let modIndex = pF "modIndex"
d1 $ gF1 $ gM1 -- Kick
$ midiOff "^42" (<| "k k k <k <k*2 [~ k]>>")
$ midiOn "^42" (<| "k ~ ~ <~ k> . <k ~>")
$ midiOff "^41" (<| "k k k <k <k*2 [~ k]>>")
$ midiOn "^41" (<| "k ~ ~ <~ k> . <k ~>")
$ "[jazz,kick:5]"
-- # midiG' "^78" 0 1.3 -- FIXME Remove after unplugging direct SC->output line
# pan 0.8
# gain 1.4
d2 $ gF1 $ gM
$ midiOff "^43" (<| "~ s ~ s*<1!4 2!3 1>")
$ midiOn "^43" (<| "~ ~ ~ k")
$ midiOff "^42" (<| "~ s ~ s*<1!4 2!3 1>")
$ midiOn "^42" (<| "~ ~ ~ k")
$ "[drumtraks:9]"
-- # midiG' "^79" 0 1.45
d3 $ gF1 $ gM
$ midiOn "^44" (ply 2)
$ midiOn "^43" (ply 2)
-- FIXME(#94) d3 drives more controls than the grid gives it (BT3 only — BL1-3 are the family mutes). ^76 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^76 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 d3's own control with gSel.
-- FIXME(#94) d3 drives more controls than the grid gives it (BT3 only — BL1-3 are the family mutes). ^76 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^76 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 d3's own control with gSel.
$ midiOn "^76" (ply 2)
$ "d d d <d [<d ~> d]>" # "drum:2"
# gain 0.8
......@@ -26,7 +28,7 @@ d3 $ gF1 $ gM
# room 0.2 # sz 0.1 # dry (slow 4 $ range 0.9 0.6 saw)
d4 $ gF2 -- V2
-- $ superimpose ((arp "up") . (|+ note 12))
$ midiOn "^89" (stutWith 4 0.25 ((|* gain 0.85) . (# room 0)))
$ midiOn "^44" (stutWith 4 0.25 ((|* gain 0.85) . (# room 0)))
$ note (cat [
-- PARTITION ORIGINALE
-- "[bf3, d4, f4, a4]", -- Bbmaj7
......@@ -44,7 +46,7 @@ d4 $ gF2 -- V2
# "FMRhodes2"
-- |- note 12
|+ note 2 -- Adjust to C
# modIndex (range 0 2 "^53")
# modIndex (range 0 2 "^32")
-- # midiG' "^81" 0 1.6
d5 $ note ("<[d3@1.25 e3@0.25 ~@0.75 f3@2 ~] [e3@1.25 f3@0.25 ~@0.75 g3@2 ~] [f3@1.25 g3@0.25 ~@0.75 a3@2 ~] [a3 g3 g3 f3 f3 d3 c3 d3]>")
# "bassWarsaw"
......
......@@ -10,8 +10,8 @@ setcps (125/60/4)
d1 $ gF1
$ fix (# hpf 2000) "909"
$ fix (# lpf 120) "[808bd,bd]"
$ midiOn "^42" ((|* gain "1 1 0.95") . struct "t ~ [~ t]")
$ midiOff "^42" (struct "t")
$ midiOn "^41" ((|* gain "1 1 0.95") . struct "t ~ [~ t]")
$ midiOff "^41" (struct "t")
-- $ "[808bd,cpu]"
$ "[808bd:3,bd:1,909]"
# room 0.2 # dry 1 # sz 0.8
......@@ -19,7 +19,7 @@ d1 $ gF1
# release 10
# midiG' "^78" 0 1.4
d2 $ gF1
$ midiOn "^43" (mask "t!7 f")
$ midiOn "^42" (mask "t!7 f")
$ "~ ~ ~ s ~ <~!3 s>"
# "snare:8"
# hpf 2000 # gain "1.1"
......@@ -27,7 +27,9 @@ d2 $ gF1
d3 $ gF2
$ fix (|* gain (slow 2 $ range 0.5 0.81 sine)) "drum"
$ fix ((# n "0!3 <0 1>") . (|* gain (range 0.7 0.5 sine))) "808oh"
$ midiOn "^76" (fast 2)
$ midiOn "^43" (fast 2)
-- FIXME(#94) d3 drives more controls than the grid gives it (BT3 only — BL1-3 are the family mutes). ^44 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^44 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 d3's own control with gSel.
-- FIXME(#94) d3 drives more controls than the grid gives it (BT3 only — BL1-3 are the family mutes). ^44 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^44 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 d3's own control with gSel.
$ midiOn "^44" (fast 2)
$ (|* gain "1 0.9 0.85")
$ "d d d"
......@@ -37,8 +39,10 @@ d3 $ gF2
d5 $ gF2 -- filler
-- FIXME On different chorus
-- f fs gs as c cs ds
$ midiOn "^89" ((# note "fs5'maj'3")) -- Pre-verse
$ midiOn "^90" (# note ("gs4'maj'3")) -- Chorus
$ midiOn "^57" ((# note "fs5'maj'3")) -- Pre-verse
$ midiOn "^89" (# note ("gs4'maj'3")) -- Chorus
-- FIXME(#94) d5 drives more controls than the grid gives it (BT5 + BL5). ^91 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^91 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.
-- FIXME(#94) d5 drives more controls than the grid gives it (BT5 + BL5). ^91 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^91 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 "^91" (# note ("ds5'maj'3")) -- Chorus
$ "bassWarsaw"
# velocity 1
......
......@@ -9,21 +9,23 @@ let bluesM = ["c", "f", "c", "c", "f", "f", "c", "c", "g", "f", "c", "c", "g", "
let gDJF = (# djfbus 1 (slow 32 $ range 0.2 0.8 saw))
let gDJF = id
d1 $ gF1 $ gM1
$ midiOn "^42" (<| "k k k <k k*2>")
$ midiOff "^42" (<| "k . k(3,8)")
$ midiOn "^41" (<| "k k k <k k*2>")
$ midiOff "^41" (<| "k . k(3,8)")
$ fix ((|* gain 0.6) . (# hpf 200)) "jazz"
-- $ "<k!16 k*2!16 k*4!16 [k . k(3,8)]!16>"
$ "[jazz,cpu]" # gain 1
-- # midiG' "^78" 0 1.5
d2 $ gF1 $ gM2
$ midiOff "^43" (<| note ("~ ~ ~ <~ ~ -2 -2>. 0" - 8))
$ midiOn "^43" (<| note ("~ 0 ~ 0"))
$ midiOff "^42" (<| note ("~ ~ ~ <~ ~ -2 -2>. 0" - 8))
$ midiOn "^42" (<| note ("~ 0 ~ 0"))
$ "[snare:60,snare:21,snare:51]"
# gain 0.56
# pan 0.3
-- # room 0.2 # dry 1.1 # sz 0.8
d3 $ gF1 $ gM2
$ midiOn "^44" (ply 2)
$ midiOn "^43" (ply 2)
-- FIXME(#94) d3 drives more controls than the grid gives it (BT3 only — BL1-3 are the family mutes). ^76 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^76 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 d3's own control with gSel.
-- FIXME(#94) d3 drives more controls than the grid gives it (BT3 only — BL1-3 are the family mutes). ^76 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^76 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 d3's own control with gSel.
$ midiOn "^76" (ply 2)
$ "drum:2*[4 <4 <8 16>>]"
-- $ "drum:2*[6 12]"
......@@ -41,15 +43,15 @@ d8 $ gF1 $ gM2
# gain 0.8
# pan 0.7
d4 $ gF2 $ gM3
$ midiOn "^57" (|+| note "0 <7 7 12 12>(3,8) 0 <7 12>([5 <3 2>],8)")
$ midiOn "^89" (superimpose (|+| note "[0 0(<3!3 5>,8)]"))
$ midiOn "^44" (|+| note "0 <7 7 12 12>(3,8) 0 <7 12>([5 <3 2>],8)")
$ midiOn "^76" (superimpose (|+| note "[0 0(<3!3 5>,8)]"))
$ note (
cat blues + "[0]"
)
-- # "bass3:4"
-- # "modalMarimba" |+| note "0*4"
# "bassWarsaw" |- note 24
# octersubbus 41 (range 0 2 "^53")
# octersubbus 41 (range 0 2 "^32")
# pan 0.3 # crush 16
-- # room 0.1
-- # voice 0.8
......@@ -90,7 +92,7 @@ d5 $ gF3 $ note (
)
# cut 51
# room 0
# crushbus 51 (range 16 3 "^54")
# crushbus 51 (range 16 3 "^33")
# "come_guitar:0"
# midiG' "^82" 0 1.7
......
......@@ -5,25 +5,27 @@ let gM = gMask . gMute
let modIndex = pF "modIndex"
let gF = gF1 . gF2
d1 $ gF1 $ gM -- Kick
$ midiOn "^42" (<| "k k k <k <k*2 [~ k]>>")
$ midiOff "^42" (<| "k ~ ~ <~ k> . <k ~>")
$ midiOn "^41" (<| "k k k <k <k*2 [~ k]>>")
$ midiOff "^41" (<| "k ~ ~ <~ k> . <k ~>")
$ "jazz"
# midiG' "^78" 0 1.3
# pan 0.8
d2 $ gF1
$ midiOn "^43" (<| "~ s ~ s*<1!4 2!3 1>")
$ midiOff "^43" (<| "~ ~ ~ k")
$ midiOn "^42" (<| "~ s ~ s*<1!4 2!3 1>")
$ midiOff "^42" (<| "~ ~ ~ k")
$ "[drumtraks:9]"
# midiG' "^79" 0 1.45
d3 $ gF1 $ gM
$ midiOn "^44" (ply 2)
$ midiOn "^43" (ply 2)
-- FIXME(#94) d3 drives more controls than the grid gives it (BT3 only — BL1-3 are the family mutes). ^76 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^76 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 d3's own control with gSel.
-- FIXME(#94) d3 drives more controls than the grid gives it (BT3 only — BL1-3 are the family mutes). ^76 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^76 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 d3's own control with gSel.
$ midiOn "^76" (ply 2)
$ "d d d <d [<d ~> d]>" # "drum:2"
# midiG' "^80" 0 1
# room 0.2 # sz 0.1 # dry (slow 4 $ range 0.9 0.6 saw)
d4 $ gF2 -- V2
$ midiOn "^57" (|+ note 12)
$ midiOn "^89" (stutWith 4 0.25 ((|* gain 0.85) . (# room 0)))
$ midiOn "^44" (|+ note 12)
$ midiOn "^76" (stutWith 4 0.25 ((|* gain 0.85) . (# room 0)))
$ note (cat [
"[bf3, d4, f4, a4]", -- Bbmaj7
"[a3, c4, e4, g4]", -- Am7
......@@ -34,7 +36,7 @@ d4 $ gF2 -- V2
# "FMRhodes2"
-- |- note 12
|+ note 2 -- Adjust to C
# modIndex (range 0 2 "^53")
# modIndex (range 0 2 "^32")
# midiG' "^81" 0 1.6
d8 $ gF $ gM
$ midiOn "^92" (ply "2 <2!3 4>")
......
......@@ -21,8 +21,8 @@ let blues = ["c", "f", "c", "c", "f", "f", "c", "c","g", "f", "c", "c", "g", "f"
-- Sol Fa Do Sol
d1 $ gF $ gM1
-- $ "k . ~ ~ <~!3 k> <~!2 k <~ k*2>>"
$ midiOn "^42" (<| "k k k <k <[~ k] k*2>>")
$ midiOff "^42" (<| "k . k(<3!3 5>,8)")
$ midiOn "^41" (<| "k k k <k <[~ k] k*2>>")
$ midiOff "^41" (<| "k . k(<3!3 5>,8)")
$ "k"
# "[cpu,jazz,808bd:3,808bd:2]"
-- # midiG' "^78" 0 1.9
......@@ -31,7 +31,7 @@ d2 $ gF $ gMute
$ n "~ [40,39] ~ [42]*<1!3 <2 4>>" # "snare"
-- # midiG' "^79" 0 1.3
d3 $ gF $ gMute
$ midiOn "^76" (ply 2)
$ midiOn "^43" (ply 2)
$ rarely (ply 2)
$ "drum:2*[8 <8 16>]" # gain 0.5
# midiG' "^80" 0 1.9
......@@ -47,8 +47,8 @@ d8 $ gF $ gM
# cut 8
# gain 1.2
d4 $ gF2 $ gM3
$ midiOn "^89" (slice 4 "0 1 2 3*<2 <4 [4 8]>>")
$ midiOn "^57" (juxBy 0.2 (
$ midiOn "^76" (slice 4 "0 1 2 3*<2 <4 [4 8]>>")
$ midiOn "^44" (juxBy 0.2 (
-- ply "<2 4 [4 8] 8>" .
arp "pinkyup"
. (often (ply 2))
......@@ -62,8 +62,8 @@ d4 $ gF2 $ gM3
# pan 0.3
# room 0.1
# voice 0.8
# crushbus 41 (range 16 1.3 "^53")
# octerbus 42 (range 0 1.3 "^33")
# crushbus 41 (range 16 1.3 "^32")
# octerbus 42 (range 0 1.3 "^52")
# gain 1
d9
$ note ("0(<3!3 <5 [5 3]>>,8)" + "c'maj'2" + (cat blues))
......
......@@ -8,7 +8,8 @@ let modIndex = pF "modIndex"
d1
$ gF1
$ midiOn "^74" (fast 2)
$ midiOn ("^42" - "^41") (mask "t(1,4)")
-- FIXME(#94) d1 drives more controls than the grid gives it (BT1 only — BL1-3 are the family mutes). ^41 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^41 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 d1's own control with gSel.
$ midiOn ("^41" - "^41") (mask "t(1,4)")
-- $ mask "<f!4 t(1,2)!3 t!9>"
$ fix ((|* gain 0.8) . (# att 0.05) . (# rel 1)) ("kick")
$ fix ((|* gain 0.95)
......@@ -31,26 +32,28 @@ d3 $ gF3 $ gO
# midiG' "^80" 0 1.2
d3 $ gF $ gM -- Breaks du Marathon
$ midiOn "^76" (scramble (8 - 4 * "^44"))
-- FIXME(#94) d3 drives more controls than the grid gives it (BT3 only — BL1-3 are the family mutes). ^44 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^44 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 d3's own control with gSel.
-- FIXME(#94) d3 drives more controls than the grid gives it (BT3 only — BL1-3 are the family mutes). ^44 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^44 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 d3's own control with gSel.
$ midiOn "^43" (scramble (8 - 4 * "^44"))
$ midiOn "^44" (slice 16 (run "8 . <8 8 <8 16> <16!3 [32 <32 16>]>>"))
$ midiOff "^44" (slice 8 ("0 1 2 3 . 4 5 6 <7!3 6>"))
$ loopAt 2
$ "break:15"
# cut 2
# pan 0.4
# speed (range 0 2 "^52")
# speed (range 0 2 "^31")
# midiG' "^80" 0 1.5
d4 -- BASSLINE BRULANTE
$ gF
$ midiOn "^53" (-- Trigger: DATA BURN
$ midiOn "^32" (-- Trigger: DATA BURN
(
(# cut 42) . (|* gain 0.85) .
(# squizbus 41 (range 200 0 "^53"))
(# squizbus 41 (range 200 0 "^32"))
)
)
$ midiOn "^57" ( -- Ritournelle
midiOn "^89" (ply "2 2 4 <2 4 <4 4 8 4> <2 4>>")
$ midiOn "^44" ( -- Ritournelle
midiOn "^76" (ply "2 2 4 <2 4 <4 4 8 4> <2 4>>")
. (+| note (scale "aeolian" (arp "converge" $
"[0 <2!4 1!2 2!2> 0 <0!3 4>]"
-- "<5@3 [5 4@2]> <<2 0> [2 0]>"
......@@ -65,25 +68,26 @@ d4 -- BASSLINE BRULANTE
# "90s_synatm:9"
# pan 0.15
-- # room 0.5 # dry 0.2 # sz 0.8
# lratebus 43 (range 0.6 6.7 "^33")
# lesliebus 42 (range 0 1 "^17")
# lratebus 43 (range 0.6 6.7 "^52")
-- 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.
-- # lesliebus 42 (range 0 1 "^17")
# lsize (slow 8 $ range 2 6 saw)
# midiG' "^81" 0 (1.5 - 0.3 * "^17" - 0.25 * "^53")
# crushbus 41 (range 10 4.5 "^53")
-- # midiG' "^81" 0 (1.5 - 0.3 * "^17" - 0.25 * "^32")
# crushbus 41 (range 10 4.5 "^32")
# cut 4
d5 $ gF2 $ gM -- Ritournelle Rhodes
$ midiOn "^58" (off "q" (|+ note 12) . (|* gain 0.85))
$ midiOn "^57" (off "q" (|+ note 12) . (|* gain 0.85))
$ note (
"<[c ~ c d ~ d <ef!3 f> ~]!0 [f ~ f g ~ <g!3 f> <gs!3 f> ~]!8>"
- "<24!12 12!4>")
# "FMRhodes1"
# modIndex (range 0 100 "^54")
# modIndex (range 0 100 "^33")
-- # crushbus 51 (range 10 4.5 "^34")
# midiG' "^82" 0 2
d6 $ gF2 -- Voices from the st0rm
$ midiOn "^91" ((# cut 6) . slow 8)
$ midiOn "^58" ((# cut 6) . slow 8)
$ swingBy 0.125 8
$ midiOn "^59" (superimpose ( -- Resolution chant
$ midiOn "^90" (superimpose ( -- Resolution chant
(>| note (scale "aeolian" "<7 [7@3 <5 9>]>"))
. (# cut 61)
. (# legato 1.2)
......@@ -94,7 +98,7 @@ d6 $ gF2 -- Voices from the st0rm
))
# "90s_matrix:3"
# cut 6 # gain 0.4
# squizbus 61 (range 0 4 "^55")
# squizbus 61 (range 0 4 "^34")
# room 0.42 # dry 1 # sz 0.8
# pan 0.6
# midiG' "^83" 0 2
......
......@@ -7,8 +7,8 @@ let mBreak = (midiOn "^41" (mask "t f . f <f!4 t!4> <f!2 t!6> t"))
let g = (gDJF)
let m = mBreak
d1 $ g --
$ midiOn "^42" (<| "k k k <k [<~ k> k]>")
$ midiOff "^42" (<| "k . ~ <k k ~ ~> k*<1!3 2 2 2 1 2> <~ ~ k <k ~>>")
$ midiOn "^41" (<| "k k k <k [<~ k> k]>")
$ midiOff "^41" (<| "k . ~ <k k ~ ~> k*<1!3 2 2 2 1 2> <~ ~ k <k ~>>")
$ "jazz"
-- # release "<0.7!3 1>"
# midiG' "^78" 0 1.4
......@@ -22,7 +22,9 @@ d3 $ g $ m -- Clap contretemps stable
# room 0.8 # sz 0.8 # dry 0.99
# midiG' "^79" 0 1.8
d2 $ g $ m -- BREAK
$ midiOn ("^44" - "^76") (ply 2)
-- FIXME(#94) d2 drives more controls than the grid gives it (BT2 only — BL1-3 are the family mutes). ^76 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^76 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 d2's own control with gSel.
-- FIXME(#94) d2 drives more controls than the grid gives it (BT2 only — BL1-3 are the family mutes). ^76 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^76 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 d2's own control with gSel.
$ midiOn ("^42" - "^76") (ply 2)
$ midiOn "^76" (fast 2)
$ loopAt 2
$ whenmod 8 6 (off "h" id)
......@@ -45,7 +47,7 @@ d9
d4 $ g $ m
$ midiOn "^57" (chop "8 1")
$ midiOn "^76" (chop "8 1")
$ superimpose ((# cut 41)
. (|+| note "0*<1!3 2 1!3 4 2!4 4!4> 7(<5 5 3 3>,8)")
)
......@@ -56,11 +58,11 @@ d4 $ g $ m
)
# "bassWarsaw"
# midiG' "^81" 0 1.5
# crushbus 4 (range 16 1.5 "^53")
# crushbus 4 (range 16 1.5 "^32")
# cut 4
# pan 0.2
d5 $ g $ m
$ midiOn "^58" (superimpose (
$ midiOn "^89" (superimpose (
(# cut 51)
. (|+| note "~ 12(<1 1 2 1 2 5 2 1 2 2 5 2 2 4 3 8>,8)")
. (|* gain 0.9)
......@@ -72,6 +74,6 @@ d5 $ g $ m
)
# "FMRhodes1"
# midiG' "^82" 0 1.8
# modIndex (range 0.1 32 "^54")
# modIndex (range 0.1 32 "^33")
# cut 5
# pan 0.8
......@@ -4,8 +4,8 @@ setcps (118/60/4)
let modIndex = pF "modIndex"
d1 $ gF1 $ gM1
-- $ mask "<f!16 t!4 f!8 t!36>"
$ midiOn "^42" (<| "k k k k")
$ midiOff "^42" (<| "k . ~!3 <~ k>")
$ midiOn "^41" (<| "k k k k")
$ midiOff "^41" (<| "k . ~!3 <~ k>")
-- $ superimpose ((# "hardkick_rha:3") . (# lpfbus 12 80))
$ stack [
"[techno:0,jazz]"
......@@ -14,8 +14,8 @@ d1 $ gF1 $ gM1
-- # room 0.2
d2 $ gM2 $ gF1 -- Snare contretemps DNB Techno-compatible
$ fix ( (# gain "<0!32 0!28 2!4>") . (ply "<1!7 2>") .(# speed 1.7) . (# lpf 2000)) "nass"
$ midiOff "^43" (<| "~ s ~ s*<1 <2 4>>")
$ midiOn "^43" (<| "~ s")
$ midiOff "^42" (<| "~ s ~ s*<1 <2 4>>")
$ midiOn "^42" (<| "~ s")
-- $ "[snare:35,<snare:43!4 snare:40!4>,nass:0]"
$ "[snare:45]"
-- # note "<0!6 -1 -2>"
......@@ -29,7 +29,7 @@ d4 $ gF2 $ gM3
-- $ slow 2
$ note ("<[b,e,g] [b,ds,g] [b,d,g] [b,cs,e,g] [b,c,e,g] [a,c,e,g] [bf,c,e,g] [a,b,d,f]>" - 12)
# "bassWarsaw"
# crushbus 41 (range 16 2.5 "^53")
# crushbus 41 (range 16 2.5 "^32")
d5 $ gM3 $ gF3
$ ("1/8" ~>)
$ loopAt 4
......@@ -43,10 +43,10 @@ d8 $ gF1 $ gM2
d4 $ gF2 $ gM3-- BASSLINE
-- $ mask "<f!8 t!12 t!44 t!64>"
$ superimpose (
(# crushbus 4 (range 16 4 "^53"))
(# crushbus 4 (range 16 4 "^32"))
. (# hpf 200) . (|* gain 1.4)
)
$ midiOn "^57" (chop "<8 8 4 <8 16>>")
$ midiOn "^76" (chop "<8 8 4 <8 16>>")
$ whenmod 64 16 (superimpose ( -- Aigu complément
("e" ~>) . (# voice 100)
. (# pan 0.4)
......@@ -67,7 +67,7 @@ d7 $ gF2 $ gM3 -- SYNTH BASS FRIEND
# "giorgio_syn:9" # n "<9!3 10>"
# cut 7
# gain 1.3
# crushbus 71 (range 16 4 "^55")
# crushbus 71 (range 16 4 "^35")
# room 0.3 # bandf 400
d10 $ gF3 $ gM3 -- Mad organ
$ mask "<f!4 t!10 f!2>"
......@@ -105,7 +105,7 @@ d5 $ gF3 $ gM3 -- Rhodes arps <3
+ "0 12"
- 24)
# "[FMRhodes2,FMRhodes1]"
# modIndex (range 0 2 "^34")
# modIndex (range 0 2 "^33")
# crushbus 6 (slow 16 $ range 16 4 saw)
# pan 0.6
# room 0.4
......
......@@ -20,21 +20,25 @@ d1 $ g
-- # crushbus 11 (range 16 0.95 "^14")
d2 $ g
$ midiOn ("^75") (fast 2)
$ midiOn ("^41"-"^43") (fast 2)
-- FIXME(#94) d2 drives more controls than the grid gives it (BT2 only — BL1-3 are the family mutes). ^43 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^43 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 d2's own control with gSel.
-- FIXME(#94) d2 drives more controls than the grid gives it (BT2 only — BL1-3 are the family mutes). ^43 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^43 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 d2's own control with gSel.
$ midiOn ("^42"-"^43") (fast 2)
$ "~ [cp,clap:1]"
# midiG' "^79" 0 3
# note (range "-12" "12" "^51")
# room 0.4 # dry 0.98
# crushbus 11 (range 16 1.95 "^15")
d3 $ g
$ midiOn ("^44" + "^76") (
-- FIXME(#94) d3 drives more controls than the grid gives it (BT3 only — BL1-3 are the family mutes). ^76 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^76 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 d3's own control with gSel.
-- FIXME(#94) d3 drives more controls than the grid gives it (BT3 only — BL1-3 are the family mutes). ^76 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^76 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 d3's own control with gSel.
$ midiOn ("^43" + "^76") (
const $ loopAt "<1!6 2 2>"
$ someCyclesBy 0.2 (scramble 4)
$ rarely (ply "2 <4 8>")
$ slice 8 (run 8)
$ "breaks165"
# cut 3
# note (range "-12" "12" "^52")
# note (range "-12" "12" "^31")
# midiG' "^80" 0 1.8
)
$ rarely ("e" ~>)
......@@ -42,13 +46,13 @@ d3 $ g
$ "[drum:2,tech:7]*8"
# midiG' "^80" 0 1.9
d4 $ g -- Mecano Course
$ midiOn "^57" (
$ midiOn "^76" (
slice 8 ("0*<1 2> 1 2 3*<2 1>")
-- . (>| "breaks125")
)
$ midiOn "^89" (slice 8 "0 <1 ~> 7 3*<1 2 4 4>")
$ midiOn "^44" (slice 8 "0 <1 ~> 7 3*<1 2 4 4>")
$ sometimesBy "0 ^33!7" (shuffle 8)
$ someCyclesBy "^53" (iter "1 4")
$ someCyclesBy "^32" (iter "1 4")
$ chop 8
$ loopAt 1
$ "breaks125:3"
......@@ -57,21 +61,22 @@ d4 $ g -- Mecano Course
d5 -- Runny Maracas Pitchables
$ g
$ mask "t(16,32)"
$ midiOn "^90" (ply "<2!3 4>")
$ midiOn "^89" (ply "<2!3 4>")
$ whenmod 16 8 (often $ fast 2)
$ someCyclesBy "<1!16 0!16>" (often $ slow "2!3 1")
-- $ fix ((|* gain 0.9) . (# release 0.8)) (n 9)
$ "hh27*8"
# n "2 <2 <[2|9] [9 <9 ~> <~ 9> 2]>>"
# midiG' "^82" 0 2
# room "^34"
# note (range "-24" "0" "^18")
# crushbus 51 (range 16 4.2 "^54")
# room "^33"
# note (range "-24" "0" "^53")
-- 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 51 (range 16 4.2 "^54")
d6 -- Running Hats
$ g
-- $ degradeBy ("1 0 0 1!13" - "^52")
$ midiOn "^44" (slow 2)
$ midiOn "^76" (fast 2)
$ midiOn "^58" (slow 2)
$ midiOn "^90" (fast 2)
$ "hh*[8 . 8 <16 8 4 [4 8]>]"
-- # n "[0|0|0|0|1|1|3|3]*8"
# midiG' "^80" 0 (1.7 + (slow 4 perlin/4))
......@@ -88,8 +93,8 @@ d6 -- Running Hats
d8 $ g
$ note (scale "aeolian" (iter 4 $ slow 4 $ arpeggiate "c'min'4") - 24)
# "supersaw"
# midiG' "^56" 0 1
# crushbus 51 (range 16 2 "^36")
# midiG' "^36" 0 1
# crushbus 51 (range 16 2 "^56")
# pan 0.2
# velocity 0.9
......
......@@ -5,19 +5,21 @@ let gMute = (midiOn "^73" (mask "f*16"))
let gM = gMask . gMute
setcps (120/60/4)
d1 $ gF1 $ gM1
$ midiOn "^42" (<| "k k k k*<1 2>")
$ midiOff "^42" (<| "k*<1!4 2!4> . k(<1 3 3 <5 [3 <1 5>]>>,8)")
$ midiOn "^41" (<| "k k k k*<1 2>")
$ midiOff "^41" (<| "k*<1!4 2!4> . k(<1 3 3 <5 [3 <1 5>]>>,8)")
$ "[cpu,jazz,808bd:3,808bd:2]"
# gain 0.9
d2 $ gM $ gF2
$ midiOn "^43" (<| "~ s ~ s")
$ midiOff "^43" (<| "~ s")
$ midiOn "^42" (<| "~ s ~ s")
$ midiOff "^42" (<| "~ s")
$ "snare:39"
-- # note "-2"
# gain 1
# att 0.02 # rel 0.9
d3 $ gF1 $ gM2
$ midiOff "^44" (mask "t([8 4 <4 <8 16>>],16)")
$ midiOff "^43" (mask "t([8 4 <4 <8 16>>],16)")
-- FIXME(#94) d3 drives more controls than the grid gives it (BT3 only — BL1-3 are the family mutes). ^76 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^76 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 d3's own control with gSel.
-- FIXME(#94) d3 drives more controls than the grid gives it (BT3 only — BL1-3 are the family mutes). ^76 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^76 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 d3's own control with gSel.
$ midiOn "^76" (struct "t*[8 <8 16> <16 8 8 16> <16 [32 <64 128>]>]")
$ fix ((|* gain (slow 32 $ range 0.3 1.3 saw))) "oh"
$ "~ h ~ h ~ h*<1!3 2 1 1 2 2> ~ h*<1!7 2>" # drumFrom "sakatadpm48" "[hh,oh]"
......@@ -26,13 +28,13 @@ d3 $ gF1 $ gM2
d8 $ gF1 $ gM
$ midiOff "^60" (struct "t(<4>,8)" . segment 8)
$ whenmod 16 8 (iter 8)
$ midiOn "^56" (loopAt 2 . (# n "40"))
$ midiOn "^36" (loopAt 2 . (# n "40"))
$ loopAt 2
$ midiOn "^92" (ply 8)
-- $ slice 16 (run 8)
$ chop 8
$ "jungle_breaks:8"
# speed (range 0.5 1.5 "^56")
# speed (range 0.5 1.5 "^36")
# cut 8
# gain 0.8
......
......@@ -36,13 +36,13 @@ let modIndex = pF "modIndex"
setcps (120/60/4)
d1 $ g1 $ gMute -- THE ROAD
$ midiOn "^74" (fast 2)
$ midiOn "^42" (struct "t t t <t t*2 t [~ t]>")
$ midiOff "^42" (struct "t*2")
$ midiOn "^41" (struct "t t t <t t*2 t [~ t]>")
$ midiOff "^41" (struct "t*2")
$ "[jazz,808bd:6]"
# midiG' "^78" 0 1.4
# orbit 0
d2 $ g1 $ gM -- THE FUEL
$ midiOn "^43" (mask "t f . f <t!4 f!4> t <t!4 f!3 t>")
$ midiOn "^42" (mask "t f . f <t!4 f!4> t <t!4 f!3 t>")
$ midiOn "^75" (ply 2)
$ loopAt 4
$ chop 32
......@@ -52,7 +52,9 @@ d2 $ g1 $ gM -- THE FUEL
# cut 2
# orbit 1
d3 $ gM $ g1 -- THE GUIDELINES
$ midiOn ("^44" - "^76")
-- FIXME(#94) d3 drives more controls than the grid gives it (BT3 only — BL1-3 are the family mutes). ^76 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^76 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 d3's own control with gSel.
-- FIXME(#94) d3 drives more controls than the grid gives it (BT3 only — BL1-3 are the family mutes). ^76 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^76 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 d3's own control with gSel.
$ midiOn ("^43" - "^76")
(sometimesBy (slow 8 $ range 0.3 0.95 saw)
$ mask "t(3,8)")
$ midiOn "^76" (fast "<2!4 <4 [4 8]>>") -- YOU SHALL RUN
......@@ -63,31 +65,31 @@ d3 $ gM $ g1 -- THE GUIDELINES
# orbit 2
d4 $ gMask -- THE THUNDER
$ g2
$ midiOn "^57" (off "0.75" id)
$ midiOn "^89" (off "1" id . chop "8")
$ midiOn "^44" (off "0.75" id)
$ midiOn "^76" (off "1" id . chop "8")
$ fix (|* gain 0.8) (note "a4")
$ note "<ef3 <~!0 [~ ~ ~ ~ ~ <~ e3> ~ <a3 <e3 cs3>>]!4>>"
# "FMRhodes1"
# cut 4
# modIndex (range 0 128 "^53")
# crushbus 41 (range 16 4 "^33")
# roombus 42 (range 0.05 0.6 "^33")
# modIndex (range 0 128 "^32")
# crushbus 41 (range 16 4 "^52")
# roombus 42 (range 0.05 0.6 "^52")
# sz 0.9
# pan "<0.8!3 0.5>"
# midiG' "^81" 0 1.8
# room 0.4
# orbit 3
d5 $ g2 $ gMask -- THE RAIN
$ midiOn "^58" ((whenmod 8 7 (off "s" id)) .(off "e" id))
$ midiOn "^90" (striate "<2!3 4>" . ply 2)
$ midiOn "^57" ((whenmod 8 7 (off "s" id)) .(off "e" id))
$ midiOn "^89" (striate "<2!3 4>" . ply 2)
$ struct "t(<3!7 [3 8]>,8,<0!3 3>)"
$ note (
arp "down"
("<c'maj'4!2 <c'maj'4!3 ef'maj'4> g'min'4>" |+| "ef3" - 12))
# "FMRhodes2"
# modIndex (range 0 128 "^54")
# crushbus 41 (range 16 4 "^34")
# roombus 42 (range 0 0.2 "^34")
# modIndex (range 0 128 "^33")
# crushbus 41 (range 16 4 "^53")
# roombus 42 (range 0 0.2 "^53")
# sz 0.5
# pan 0.8
# orbit 4
......@@ -96,8 +98,8 @@ d8 $ g3 $ gM -- THE UNAVOIDABLE BREAKS
$ mask "t(16,64)"
$ midiOn "^36" (# n 6) -- Double light
$ midiOn "^56" (# n 4) -- DOUBLE HEAVY
$ midiOn "^60" (ply 2)
$ midiOn "^92" (fast 2)
$ midiOn "^92" (ply 2)
$ midiOn "^60" (fast 2)
$ slice 8 ("<0!3 ~> <1!3 3> <2 2 [2 6][ 2 6 6 6]> <3!3 7>*<1 2>")
$ loopAt 2
$ "fbreak120:3"
......
......@@ -6,13 +6,13 @@ setcps (120/60/4)
let g1 = (# djfbus 1 (range 0.05 0.95 "^49"))
let g2 = (# djfbus 2 (range 0.05 0.95 "^50"))
d1 $ g1
$ midiOn "^42" ((<| "k k k <k [<~ k> k]>"))
$ midiOff "^42" (<| "k . k(<1!3 <3 5>>,8)")
$ midiOn "^41" ((<| "k k k <k [<~ k> k]>"))
$ midiOff "^41" (<| "k . k(<1!3 <3 5>>,8)")
$ "jazz"
# midiG' "^78" 0 1.3
d2 $ g1
$ midiOn "^43" (struct "~ t ~ t*<1 2 2 1>")
$ midiOff "^43" (struct "~ t")
$ midiOn "^42" (struct "~ t ~ t*<1 2 2 1>")
$ midiOff "^42" (struct "~ t")
$ "cp"
# lpf 1200
# room 0.2
......@@ -20,7 +20,9 @@ d2 $ g1
# dry 1
# midiG' "^79" 0 1
d3 $ g1
$ midiOn "^44" (mask "t([5 <8!3 <4 16>>],16)")
$ midiOn "^43" (mask "t([5 <8!3 <4 16>>],16)")
-- FIXME(#94) d3 drives more controls than the grid gives it (BT3 only — BL1-3 are the family mutes). ^76 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^76 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 d3's own control with gSel.
-- FIXME(#94) d3 drives more controls than the grid gives it (BT3 only — BL1-3 are the family mutes). ^76 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^76 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 d3's own control with gSel.
$ midiOn "^76" (mask "t(16,32)" . ply 2)
$ n "~ 0 ~ 0 ~ 0 ~ <0!3 2>*<2 1 2 2>"
# "h2ogmsn" # gain 0.8
......@@ -35,20 +37,20 @@ d4 $ g1
# pan 0.3
# midiG' "^80" 0 1.1
d5 $ g2 -- THE BASS REMNANTS
$ midiOn ("^89" + "^57") (slice 4 "0 1 2 <3 1 3 3*8>")
$ midiOn "^57" ((# legato 4) . (slow 4)) -- Hack longer sample
$ midiOn ("^57" + "^89") (slice 4 "0 1 2 <3 1 3 3*8>")
$ midiOn "^89" ((# legato 4) . (slow 4)) -- Hack longer sample
$ "90s_matrix:0"
# crushbus 51 (range 16 1.8 "^53")
# crushbus 51 (range 16 1.8 "^33")
# legato 2 # cut 5
# midiG' "^81" 0 1.8
d6 -- TODO BASSLINE <3
$ note (-24) # "bassWarsaw"
# midiG' "^82" 0 1.3
d8 $ g2
$ midiOn "^59" (chop 2)
$ midiOn "^91" (chop 8)
$ midiOn "^92" (chop 2)
$ midiOn "^60" (chop 8)
$ "90s_glassatm:3" -- Scintillant espoir
# crushbus 81 (range 16 1.8 "^55")
# crushbus 81 (range 16 1.8 "^36")
# cut 8
# midiG' "^83" 0 1.2
# pan (0.9 - 0.3 * perlin)
......
......@@ -49,8 +49,8 @@ setcps (120/60/4)
let modIndex = pF "modIndex"
d1 $ gF1 $ gM1 -- Kick, le pas du train qui démarre
$ midiOn "^42" (struct "t ~ ~ ~ ~ ~ t ~") -- half-time feel (60bpm sur 120 Tidal)
$ midiOff "^42" (struct "t ~ <~ t> ~ ~ ~ t <~ t>") -- broken-beat plus dense
$ midiOn "^41" (struct "t ~ ~ ~ ~ ~ t ~") -- half-time feel (60bpm sur 120 Tidal)
$ midiOff "^41" (struct "t ~ <~ t> ~ ~ ~ t <~ t>") -- broken-beat plus dense
$ stack [
"kick" # lpf 10000 # cut 1,
"jazz" # lpf 200 # cut 11 |* gain 0.9,
......@@ -58,32 +58,33 @@ d1 $ gF1 $ gM1 -- Kick, le pas du train qui démarre
]
# "[kick:3,jazz]"
# gain 1.35
-- TODO(tempo): wrap the range in `quantise 1` — 128 CC steps rarely land on a round BPM
# cps ((range 60 180 "^29")/60/4)
d2 $ gF1 $ gM2 -- Clap/snare, contretemps liquide
$ midiOn "^43" (<| "~ ~ ~ ~ s ~ ~ <~ s*<1 2>>")
$ midiOff "^43" (<| "~ ~ ~ ~ s ~ ~ ~")
$ midiOn "^42" (<| "~ ~ ~ ~ s ~ ~ <~ s*<1 2>>")
$ midiOff "^42" (<| "~ ~ ~ ~ s ~ ~ ~")
$ "[snare:24,cp]"
# gain 1.3
d3 $ gF1 $ gM2 -- Cymbales légères, la brume du matin
$ midiOn "^44" (<| "~ cy ~ cy ~ cy ~ <cy [~ cy]>")
$ midiOff "^44" (<| "~!6 <~ <cy ~> cy>")
$ midiOn "^43" (<| "~ cy ~ cy ~ cy ~ <cy [~ cy]>")
$ midiOff "^43" (<| "~!6 <~ <cy ~> cy>")
$ "cy" # "<cy:1!6 cy:2!2>" # "h2ogmcy"
|* gain (range 1.0 0.7 perlin)
|* legato (range 0.5 2 (fast 2 perlin))
d4 $ gF2 $ gM3 -- Basse bassWarsaw, le cœur qui tourne (C#m ⇄ G# puis F#m-B-E-A)
$ midiOn "^89" (struct "t*16")
$ midiOn "^57" (struct "t(<3 5 5 7>,8)")
$ midiOn "^44" (struct "t*16")
$ midiOn "^76" (struct "t(<3 5 5 7>,8)")
-- couplet (i⇄V) puis spirale du refrain
$ note ("<[cs2@7 gs2] [gs1@7 cs2] [cs2@7 gs2] [gs1@7 cs2] [fs1@7 b1] [b1@7 e2] [e2@7 a1] [a1@7 gs1]>")
# stack [
"bassWarsaw" # lpf 500,
"bassWarsaw" # cut 41 # crushbus 41 (range 16 3.5 "^53") # bandf 500 # gain 1.2,
"bassWarsaw" # cut 41 # crushbus 41 (range 16 3.5 "^32") # bandf 500 # gain 1.2,
""]
# "cpluck" |+ note 12
# octerbus 42 (range 0 0.8 "^33")
# octerbus 42 (range 0 0.8 "^52")
-- # octersubbus 43 (range 0 2.5 "^33")
# cut 41
# lpf 20000
......@@ -91,10 +92,10 @@ d4 $ gF2 $ gM3 -- Basse bassWarsaw, le cœur qui tourne (C#m ⇄ G# puis F#m-B-E
d5 $ gF3 $ gM3 -- Rhodes/Keys, les moulins qui tournent doucement
-- sample 120_Rhodes_Chords_C ou _Eli_rhodes_chords_C shiftés +1 pour C#
$ midiOn "^90" (superimpose ((# cut 51) . (# delay 0.95) . (# delayt 0.125) . (# delayfb 0.7) . (# room 0) . (|* gain 0.8)))
$ midiOn "^89" (superimpose ((# cut 51) . (# delay 0.95) . (# delayt 0.125) . (# delayfb 0.7) . (# room 0) . (|* gain 0.8)))
$ stack [
midiOn "^58" (# silence) $ slow 2 "<begin ~ begin ~ begin ~ ~ ~>/2" # cut 51 # begin 0 # end 0.4 # pan 0.4,
midiOn "^58" (# silence) $ slow 2 "<~ mid ~ mid ~ ~ ~ ~>/2" # cut 52 # begin 0.4 # end 0.8 # pan 0.55,
midiOn "^57" (# silence) $ slow 2 "<begin ~ begin ~ begin ~ ~ ~>/2" # cut 51 # begin 0 # end 0.4 # pan 0.4,
midiOn "^57" (# silence) $ slow 2 "<~ mid ~ mid ~ ~ ~ ~>/2" # cut 52 # begin 0.4 # end 0.8 # pan 0.55,
"<~!24 end!8>" # begin 0.8 # end 1 # cut 53 # gain 0.8 # pan 0.7,
""
]
......@@ -102,7 +103,7 @@ d5 $ gF3 $ gM3 -- Rhodes/Keys, les moulins qui tournent doucement
# "120_Rhodes_Chords_C:0" |+ note 1
-- alternatives : "120_NuPad_Chords_C:<0 1 2 3>" |+ note 1 ← pad 8-variations
-- "120_Eli_rhodes_chords_C:<0 1 2>" |+ note 1
# crushbus 51 (range 16 2.7 "^54")
# crushbus 51 (range 16 2.7 "^33")
# room 0.45
# gain 1.3
......
......@@ -9,14 +9,14 @@ let modIndex = pF "modIndex"
d1 $ gM1 $ gF1 -- Kick solide
$ fix ((|* gain 0.9) . (# lpf 1000)) "ja zz"
$ fix ((# att 0.02) . (# rel 0.5) . (# lpf 5000)) "kick:4"
$ midiOn "^42" (struct "t t t t*<1!6 2 2>")
$ midiOff "^42" (<| "k . ~ <~!3 k> ~ ~")
$ midiOn "^41" (struct "t t t t*<1!6 2 2>")
$ midiOff "^41" (<| "k . ~ <~!3 k> ~ ~")
$ "[jazz,kick:4]"
# gain 1.2
d2 $ gM2 $ gF1 -- snare contretemps variable
$ fix ((|* gain 0.8) . (# legato 0.05)) "cp"
$ midiOn "^43" (<| "~ cp ~ cp*<1 1 2 <1 2>>")
$ midiOff "^43" (<| "~ [cp*<1!3 <2 <4 [4 2]>>> ~]")
$ midiOn "^42" (<| "~ cp ~ cp*<1 1 2 <1 2>>")
$ midiOff "^42" (<| "~ [cp*<1!3 <2 <4 [4 2]>>> ~]")
$ "[cp,snare:30]"
# pan 0.65
# legato 0.22
......@@ -25,18 +25,18 @@ d3 $ gM2 $ gF1
# "snare:34"
# hpf 7000
d4 $ gF2 $ gM3
$ midiOn "^57" (slice 16 "[0 ~]*<4!3 8>")
$ midiOn "^89" (ply 8)
$ midiOn "^76" (slice 16 "[0 ~]*<4!3 8>")
$ midiOn "^44" (ply 8)
$ note "<b2 <<as2 [as2@3 [~ <fs2 b2>]]>!6 cs3 [cs3@3 [~ ef3]]> gs2@2>"
# "bassWarsaw"
# gain 1.4 # cut 4
# crushbus 41 (range 16 4.5 "^53")
# octerbus 42 (range 0 0.04 "^33")
# octersubbus 43 (range 0 1.2 "^33")
# octersubsubbus 44 (range 0 1.2 "^33")
# crushbus 41 (range 16 4.5 "^32")
# octerbus 42 (range 0 0.04 "^52")
# octersubbus 43 (range 0 1.2 "^52")
# octersubsubbus 44 (range 0 1.2 "^52")
d5 $ gF3 $ gM3 -- Baba hums
$ midiOff "^58" (mask "f")
$ midiOn "^90" ((# begin 0.5))
$ midiOff "^57" (mask "f")
$ midiOn "^89" ((# begin 0.5))
$ someCyclesBy "<t!16 f!16>" (>| n "<1@2 1@2 2@4>") -- Better usage!
$ n "<1@2 2@2 3@2 4@2>" -- Live v1
-- $ n "<3 ~>"
......@@ -45,7 +45,7 @@ d5 $ gF3 $ gM3 -- Baba hums
# begin 0.02
-- # rel 4
# "paroles" # cut 5
# tremrbus 51 (range 0 8 "^54")
# tremrbus 51 (range 0 8 "^33")
# tremdp 0.8
-- # lpf 3000
# hpf 400 -- Needed to remove kick in the background :'(
......@@ -76,7 +76,7 @@ d7 $ gM3 $ gF3 -- Paroles!
# hpf 300
d8 $ gF1 $ gM2
$ midiOn ("^60" - "^92") (ply "1!2 <1!3 <2 1 1 2>>!2" . mask "f(4,8)")
$ midiOn ("^56" - "^92") ((loopAt 1) . (# hpf 1500) . (# "jungle_breaks:30")) -- Clochettes?
$ midiOn ("^36" - "^92") ((loopAt 1) . (# hpf 1500) . (# "jungle_breaks:30")) -- Clochettes?
$ midiOn ("^92") ( -- Bouton Nassim <3
slice 16 "[0 .. 7] . <[0 .. 7]!7 [0 1 . [2 3]]>"
. loopAt 0.5 . (# "breaks165") . (# octersub 2)
......
......@@ -19,6 +19,7 @@ d1 $ gF1 $ gM1
]
# "[techno:1,jazz]"
# gain 1.4
-- TODO(tempo): wrap the range in `quantise 1` — 128 CC steps rarely land on a round BPM
# cps ((range 60 180 "^29")/60/4)
d2 $ gF1 $ gM2
$ midiOn "^42" (<|"~ s ~ s*<1 2>")
......@@ -26,36 +27,36 @@ d2 $ gF1 $ gM2
$ "[snare:24]"
# gain 1.4
d3 $ gF1 $ gM2 -- Cymbales sol
$ midiOn "^44" (<| "~ cy ~ cy ~ cy ~ <cy [~ cy]>")
$ midiOff "^44" (<| "~!7 <~ <cy ~> ~ cy>")
$ midiOn "^43" (<| "~ cy ~ cy ~ cy ~ <cy [~ cy]>")
$ midiOff "^43" (<| "~!7 <~ <cy ~> ~ cy>")
$ "cy" # "<cy:1!6 cy:2!2>" # "h2ogmcy"
|* gain (range 1.1 0.8 perlin)
|* legato (range 0.5 2 (fast 2 perlin))
d4 $ gF2 $ gM3 -- Bassline faite main avec un violoncelle californien
$ midiOn "^89" (struct "t*16")
$ midiOn "^57" (struct "t(<3 5 5 7>,8)")
$ midiOn "^44" (struct "t*16")
$ midiOn "^76" (struct "t(<3 5 5 7>,8)")
$ note ("<<[b3@5 a3 b3 a3] <[b3@7 a3] [b3@5 d4@2 a3]>> [e3@7 b3]>")
# stack [
"bass" # lpf 500,
"bass" # cut 41 # crushbus 41 (range 16 4.5 "^53") # bandf 500 # gain 1.2,
"bass" # cut 41 # crushbus 41 (range 16 4.5 "^32") # bandf 500 # gain 1.2,
""]
# "cpluck" |+ note 12
# octerbus 42 (range 0 0.8 "^33")
# octerbus 42 (range 0 0.8 "^52")
-- # octersubbus 43 (range 0 2.5 "^33")
# cut 41
# lpf 20000
# gain 1.4
d5 $ gF3 $ gM3 -- Piano nostalgique, temps inexorable
$ midiOn "^90" (superimpose ((# cut 51) . (# delay 0.95). (# delayt 0.125) . (# delayfb 0.7) . (# room 0) .(|* gain 0.8)))
$ midiOn "^89" (superimpose ((# cut 51) . (# delay 0.95). (# delayt 0.125) . (# delayfb 0.7) . (# room 0) .(|* gain 0.8)))
$ stack [
midiOn "^58" (# silence) $ slow 2 "<begin ~ begin ~ begin ~ ~ ~>/2" # cut 51 # begin 0 # end 0.2 # pan 0.4, -- Main piano
midiOn "^58" (# silence) $ slow 2 "<~ mid ~ mid ~ mid ~ ~>/2" # cut 52 # begin 0.25 # end 0.6 # pan 0.4, -- side piano
midiOn "^57" (# silence) $ slow 2 "<begin ~ begin ~ begin ~ ~ ~>/2" # cut 51 # begin 0 # end 0.2 # pan 0.4, -- Main piano
midiOn "^57" (# silence) $ slow 2 "<~ mid ~ mid ~ mid ~ ~>/2" # cut 52 # begin 0.25 # end 0.6 # pan 0.4, -- side piano
"<~!24 end!8>" # begin 0.75 # end 1 # cut 53 # gain 0.8 # pan 0.9, -- ENDING <3
-- midiOff "^58" (# silence) $ (0.25 ~>) $ (# hpf 1200) ("<p1 ~>") # cut 54, -- Filtered delayed echoes
""
]
# "rhadamanthe_melo:1"
# crushbus 51 (range 16 2.7 "^54")
# crushbus 51 (range 16 2.7 "^33")
# room 0.4
# gain 1.3
d6 $ gF1 $ gM2 $ chop 8 -- Je t'avais oublie toi <3
......
......@@ -2,12 +2,12 @@
do
setcps (120/60/4)
d1 $ gM1 $ gF1
$ midiOn "^42" (<| "k k k <k!3 <[~ k] [k <k ~> k ~]>>" )
$ midiOn "^41" (<| "k k k <k!3 <[~ k] [k <k ~> k ~]>>" )
$ midiOff "^42 " (<| "<k ~>")
$ "[jazz,techno:1]"
d2 $ gF1 $ gM2
$ midiOn "^43" (<| "~ s ~ s*<1!3 2>")
$ midiOff "^43" (<| "<~ <~ sn>>")
$ midiOn "^42" (<| "~ s ~ s*<1!3 2>")
$ midiOff "^42" (<| "<~ <~ sn>>")
$ "snare:39"
d3 $ gF1 $ gM2
$ "h h h h h h h h*<1 <2 0 [4 2] [0 2]>>"
......@@ -16,18 +16,18 @@ d3 $ gF1 $ gM2
|* gain (slow 16 $ range 0.75 0.9 saw)
# room 0.3 # sz 0.01
d4 $ gF2 $ gM3
$ superimpose ((# crushbus 41 (range 16 3 "^53")) . (# cut 41))
$ midiOn "^89" (slice 2 1)
$ midiOn ("^57" - "^89") (ply "<1 1 2 1 2 1 4 2 4 2 1 4 2 4 8 <4 8>>" . slice 2 "<0!4 1!4>")
$ midiOff ("^57" + "^89") (slice 2 "<0 1>")
$ superimpose ((# crushbus 41 (range 16 3 "^32")) . (# cut 41))
$ midiOn "^76" (slice 2 1)
$ midiOn ("^44" - "^76") (ply "<1 1 2 1 2 1 4 2 4 2 1 4 2 4 8 <4 8>>" . slice 2 "<0!4 1!4>")
$ midiOff ("^44" + "^76") (slice 2 "<0 1>")
$ "nujazz_bass120:16"
# room 0
# cut 4
d8 $ gF1 $ gM2
$ chop 8
$ loopAt 2
$ midiOn "^56" ((# "jungle_breaks:30") . (# lpf 4000))
$ midiOn "^36" (# "jungle_breaks:13")
$ midiOn "^36" ((# "jungle_breaks:30") . (# lpf 4000))
$ midiOn "^56" (# "jungle_breaks:13")
$ "jungle_breaks:3"
d11 $ gF3 $ gM3
$ midiOn "^89" (>| note "cs5@2 gs4 cs5@3 gs4@2")
......
......@@ -5,20 +5,20 @@ let width = pF "width"
let dMask = (whenmod 8 7 (mask "t t <t [f t]> f"))
d1 $ gF1 $ gM1
-- $ midiOn "^41" (fast "<1!8 1 2 2 1 2 4 4 [4 8]>" )
$ midiOn "^42" (<| "k k k <k <k*2 [~ k]>>")
$ midiOff "^42" (fast 2 . (<| "k . ~ k ~ ~"))
$ midiOn "^41" (<| "k k k <k <k*2 [~ k]>>")
$ midiOff "^41" (fast 2 . (<| "k . ~ k ~ ~"))
$ "[808bd:3,jazz]"
# gain 1.8
d2 $ gF2 $ gM2
$ midiOn "^43" (fast "<1!8 4!24>")
$ midiOn "^42" (fast "<1!8 4!24>")
$ "~ s*<1!7 [4 <2 4>]>"
# "snare:32"
# note "-4"
# gain 1.3 # legato 0.35
# hpf 1300
d3 $ gF1 $ gM2
$ midiOn "^44" (fast 2 . (>| "~ hh ~ hh ~ hh ~ hh"))
$ midiOff "^44" (<| "dr*[8 <8 8 16 [32 16 32 16]>]")
$ midiOn "^43" (fast 2 . (>| "~ hh ~ hh ~ hh ~ hh"))
$ midiOff "^43" (<| "dr*[8 <8 8 16 [32 16 32 16]>]")
$ "dr"
-- d4 $ gF2 $ gM3
-- -- $ note "<c3 c3 e3 c3>"
......@@ -36,8 +36,8 @@ d4 $ gF2 $ gM3
# "bassWarsaw"
# gain 1.6
-- # cut 4
# crushbus 41 (range 16 4.5 "^53")
# octersubbus 42 (range 0 3.5 "^33")
# crushbus 41 (range 16 4.5 "^32")
# octersubbus 42 (range 0 3.5 "^52")
d5
$ arp "up"
......@@ -51,7 +51,7 @@ d8 $ gF1 $ gM2 $ chop 8
$ loopAt 2
$ midiOn "^60" (mask "t(4,8,1)" . chop 2
)
$ midiOn "^56" (loopAt 0.5 . (# "breaks165"))
$ midiOn "^36" (loopAt 0.5 . (# "breaks165"))
$ "jungle_breaks:45"
# cut 8
# hpf 500
......
......@@ -5,14 +5,14 @@ let width = pF "width"
let dMask = (whenmod 8 7 (mask "t t <t [f t]> f"))
d1 $ gF1 $ gM1
-- $ midiOn "^41" (fast "<1!8 1 2 2 1 2 4 4 [4 8]>" )
$ midiOn "^42" (<| "k k k <k <k*2 [~ k]>>")
$ midiOff "^42" ((<| "k . ~ k ~ ~"))
$ midiOn "^41" (<| "k k k <k <k*2 [~ k]>>")
$ midiOff "^41" ((<| "k . ~ k ~ ~"))
$ "[808bd:3,jazz]"
# gain 1.4
-- # room 0.3 # dry 1.1 # sz 0.8
d2 $ gF1 $ gM2
$ midiOn "^43" (fast "<1!8 4!24>" . (<| "~ s*<1!7 [4 <2 4>]>"))
$ midiOff "^43" (<| "~ s ~ s")
$ midiOn "^42" (fast "<1!8 4!24>" . (<| "~ s*<1!7 [4 <2 4>]>"))
$ midiOff "^42" (<| "~ s ~ s")
$ "snare:40"
-- # note "-4"
-- # gain 1.8
......@@ -31,16 +31,16 @@ d4 $ gF2 $ gM3
$ note ("<c c f c g f g f>" - 24)
# "bassWarsaw"
# gain 1.3
# crushbus 41 (range 16 3.5 "^53")
# crushbus 41 (range 16 3.5 "^32")
d3 $ gF1 $ gM2
$ midiOn "^44" (fast 2 . (<| "~ hh ~ hh ~ hh ~ hh"))
$ midiOff "^44" (<| "dr*[8 <8 8 16 [32 16 32 16]>]")
$ midiOn "^43" (fast 2 . (<| "~ hh ~ hh ~ hh ~ hh"))
$ midiOff "^43" (<| "dr*[8 <8 8 16 [32 16 32 16]>]")
$ "dr" # "h2ogmsn:4"
# gain 1.3
d4 $ gF2 $ gM3
$ midiOn "^89" (ply 8)
$ midiOn "^57" (fast 4)
$ midiOn "^76" (ply 8)
$ midiOn "^44" (fast 4)
$ arp "up"
-- $ (off "0.125" (|+ note "12"))
$ note (
......@@ -51,8 +51,8 @@ d4 $ gF2 $ gM3
-- $ slice 4 "<0 1 2 3>"
# "bassWarsaw" |- note 24
# gain 1.6
# crushbus 41 (range 16 4.5 "^53")
# octersubbus 42 (range 0 3.5 "^33")
# crushbus 41 (range 16 4.5 "^32")
# octersubbus 42 (range 0 3.5 "^52")
# pan 0.9
d5 $ gF3 $ gM3
$ fast 4
......@@ -69,7 +69,7 @@ d5 $ gF3 $ gM3
# room 0.9
# gain 1.3
-- # cut 4
# modIndex (range 0 4.5 "^53")
# modIndex (range 0 4.5 "^33")
-- # octersubbus 42 (range 0 3.5 "^33")
d7 $ gF3 $ gM3 $ "vocalOoh1/2" # n "<4 5>" # cut 7
# gain 1.2
......
......@@ -3,27 +3,27 @@
do
setcps(140/60/4)
d1 $ gF1 $ gM1
$ midiOn "^30" (# "hardkick_rha:29")
$ midiOn "^42" (<| "k k k <k!3 <[~ k] k*2>>")
$ midiOff "^42" (<| "<k ~>")
$ midiOn "^29" (# "hardkick_rha:29")
$ midiOn "^41" (<| "k k k <k!3 <[~ k] k*2>>")
$ midiOff "^41" (<| "<k ~>")
$ "[techno:0,808bd:2,909,kick:4]"
-- $ "[jazz,kick:4]"
-- # octersub 0.5 # lpf 4000
d2 $ gF1 $ gM2
$ fix (# lpf 1300) "cp"
$ midiOn "^43" (<| "~ cp*<1!3 <2 [4 2]>> ~ cp" )
$ midiOff "^43" (<| "~ . cp")
$ midiOn "^42" (<| "~ cp*<1!3 <2 [4 2]>> ~ cp" )
$ midiOff "^42" (<| "~ . cp")
$ "[snare:32,cp]"
d3 $ gF1 $ gM2
$ fix (|* gain (slow 16 $ range 0.5 1 saw)) "ccc"
$ "hh(3,8) hh(<3!3 <4 5>>,8)" # "[ccc:0,h2ogmhh:3]" # n "3!3 [<3!3 5> <3 5>]"
# cut 3
d4 $ gF2 $ gM3 -- Caring bass
$ midiOn "^57" (|+ note "[0,12]")
$ midiOn "^89" ((struct "<[t t . t*[4 <4 8>]]!3 t*[<8 4> 8]>") . (# rel 0.5))
$ midiOn "^44" (|+ note "[0,12]")
$ midiOn "^76" ((struct "<[t t . t*[4 <4 8>]]!3 t*[<8 4> 8]>") . (# rel 0.5))
$ superimpose (
(# cut 41) .
(# crushbus 41 (range 10 3.5 "^53"))
(# crushbus 41 (range 10 3.5 "^32"))
)
$ note (
"<b5!3 <g d>>@7 <c6 c6 cs6 a6>" -- This is caring
......@@ -33,30 +33,32 @@ d4 $ gF2 $ gM3 -- Caring bass
# legato 1
# bandf 500
# bandq 0
# octerbus 42 (range 0 0.9 "^33")
# octerbus 42 (range 0 0.9 "^52")
# cut 7
# gain 1.4
d5 $ gF2 $ gM3 -- V2 PLN's "Je peux ptet faire une basse acide moi meme"
$ midiOff "^58" (
$ midiOff "^57" (
-- (|+ note "<0 12>") .
mask "<[t f]!0 t(<1!3 [1 4]>,4)!0 t([<8!3 <4 16>> <8!3 16>],16)>")
-- FIXME(#54) d5 drives more controls than the grid gives it (B5 + C5). ^53 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^53 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.
$ stack [
n "<30!16 31!16>" # "vec2_synth_acid" # gain (range 1.1 0 ("^54" + "^34")),
"vec1_acid:40" # hpf 200 # gain (range 0.6 1.1 "^54"),
"vec1_acid:39" # hpf 200 # gain (range 0 1.1 "^34"), -- TODO BONUS ACID
n "<30!16 31!16>" # "vec2_synth_acid" # gain (range 1.1 0 ("^33" + "^53")),
"vec1_acid:40" # hpf 200 # gain (range 0.6 1.1 "^33"),
"vec1_acid:39" # hpf 200 # gain (range 0 1.1 "^53"), -- TODO BONUS ACID
-- # octer 1.1
-- ,
""
]
# crushbus 41 (range 16 1 "^53")
-- # legato 1
# legato (range 0.39 0.7 (1 - "^17"))
>| note ("[b d6 b cs6 d6 b cs6 b]*2"
- "<0!32 12!32>" -- Alternance
-- + "<0!24 7!8 0!48 1!16>" -- Note variation tension???
)
-- # att 0.1 # sus 0.2 # rel 4
-- # cut 4
-- FIXME(#54) d5 drives more controls than the grid gives it (B5 + C5). ^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 d5's own control.
-- # legato (range 0.39 0.7 (1 - "^17"))
-- >| note ("[b d6 b cs6 d6 b cs6 b]*2"
-- - "<0!32 12!32>" -- Alternance
-- -- + "<0!24 7!8 0!48 1!16>" -- Note variation tension???
-- )
-- -- # att 0.1 # sus 0.2 # rel 4
-- -- # cut 4
# octersub 2
-- # octerbus 41 (range 0 1 "^17")
-- # crushbus 42 (range 16 4.2 "^53")
......@@ -82,7 +84,7 @@ d7 $ gF1 $ gM3
. (# room 0)
)
$ midiOff ("^59" + "^91") (ply "t(<4!3 <6 [4 <8 16>]>>,8,1)") -- TECHNOO
$ midiOn "^55" ((loopAt 1) . (# "jungle_breaks:60")) -- Clochettes?
$ midiOn "^35" ((loopAt 1) . (# "jungle_breaks:60")) -- Clochettes?
$ chop 16
$ loopAt 2
$ "jungle_breaks:45"
......
......@@ -9,7 +9,7 @@ setcps (160/60/4)
d1 $ gM1 $ gF1 -- Kick solide
$ fix ((|* gain 0.9) . (# lpf 1000)) "jazz"
$ fix ((# att 0.02) . (# rel 0.5) . (# lpf 5000)) "kick:4"
$ midiOn "^30" ((# "hardkick_rha:40") . (|- note 1) . (|* gain 0.8))
$ midiOn "^29" ((# "hardkick_rha:40") . (|- note 1) . (|* gain 0.8))
$ midiOn "^41" (struct "t t t t*<1!6 2 2>")
$ midiOff "^41" (<| "k . ~ k ~ <~!3 <k ~>>")
$ "[jazz,kick:4]"
......@@ -22,7 +22,7 @@ d2 $ gM2 $ gF1 -- snare contretemps variable
# pan 0.65
-- # legato 0.22
d3 $ gM2 $ gF1
$ midiOn "^44" (ply "1 1 2 <1 2>")
$ midiOn "^43" (ply "1 1 2 <1 2>")
$ "~ d ~ d ~ d ~ <d!12 [~ d]!3 [d d]>"
# "snare:34"
# hpf 7000
......@@ -44,9 +44,9 @@ d8 $ gF1 $ gM2
# octersub 0.5
# gain 1.2
d4 $ gF2 $ gM3 -- BASSLINE
$ midiOn "^89" (|+| note "[0,12*4]")
$ midiOff "^89" (|+| note "[0,[<7 7 4 7>(3,8,1)]]" )
$ superimpose ((# hpf 200) . (# crushbus 41 (range 16 3.5 "^53")))
$ midiOn "^44" (|+| note "[0,12*4]")
$ midiOff "^44" (|+| note "[0,[<7 7 4 7>(3,8,1)]]" )
$ superimpose ((# hpf 200) . (# crushbus 41 (range 16 3.5 "^32")))
$ note ("<e3 fs3 <gs3 d4> <a3 df4>>" - 12)
# "bassWarsaw"
# gain 1.12
......@@ -58,18 +58,19 @@ d7 $ gF2 $ gM3 -- ACID BASS TODO REWORK WITH RAPH
mask "<[t f]!0 t(<1!3 [1 4]>,4)!0 t([<8!3 <4 16>> <8!3 16>],16)>")
$ stack [
-- n "<30!16 31!16>" # "vec2_synth_acid" # gain (range 1.1 0 ("^55" + "^35")),
"vec1_acid:40" # hpf 200 # gain (range 0.6 1.1 "^55"),
"vec1_acid:40" # hpf 200 # gain (range 0.6 1.1 "^35"),
-- "vec1_acid:39" # hpf 200 # gain (range 0 1.4 "^35"), -- TODO BONUS ACID
-- # octer 1.1
-- ,
""
]
# crushbus 71 (range 16 1 "^53")
# crushbus 71 (range 16 1 "^55")
-- # legato 1
# legato (range 0.39 0.7 (1 - "^17"))
>| note ("[e gs e fs gs e fs e]*2"
- 12
)
-- FIXME(#54) d7 drives more controls than the grid gives it (B7 + C7). ^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 d7's own control.
-- # legato (range 0.39 0.7 (1 - "^17"))
-- >| note ("[e gs e fs gs e fs e]*2"
-- - 12
-- )
# gain 1.12
# room 0.7
# dry 1 # sz 0.8
......@@ -88,10 +89,10 @@ d6 $ gF1 $ gM3 -- HAWKS
# gain 1.5
# dry 1.025
d5 $ gM3 $ gF3
$ midiOn "^18" (# n "6")
$ midiOn "^58" (mask "<t f f f>" . (# n "<4 5!2 4!6>") . (|* speed 1.05))
$ midiOn "^90" (struct "f(3,8)" . ply 4 . chop 2)
$ someCyclesBy (1 - "^34") (mask "<t f f f>")
$ midiOn "^33" (# n "6")
$ midiOn "^57" (mask "<t f f f>" . (# n "<4 5!2 4!6>") . (|* speed 1.05))
$ midiOn "^89" (struct "f(3,8)" . ply 4 . chop 2)
$ someCyclesBy (1 - "^53") (mask "<t f f f>")
$ "ghost" # n (slow 4 $ "<0 1 2 3>")
# cut 5
# lpf 3000
......
......@@ -11,24 +11,26 @@ let dec = pF "dec"
let sus = pF "sus"
let cutoff = pF "cutoff"
d1 $ gF $ gMute
$ someCyclesBy "^30" (ply "2 <2!3 4>")
$ someCyclesBy "^29" (ply "2 <2!3 4>")
$ midiOn "^74" (# "[kick:5,kick:4]")
$ midiOn "^42" (<| "k k k <k [<k ~> k]>")
$ midiOn "^41" (<| "k k k <k [<k ~> k]>")
-- $ midiOff "^42" (struct "~ <t!3 ~>") -- L'attente
$ midiOff "^42" (struct "t . ~ t ~ ~")
$ midiOff "^41" (struct "t . ~ t ~ ~")
$ "[kick:5,kick:4,808bd:8]"
# att 0.015
# rel 0.125
# lpf 2000
# midiG' "^78" 0 1.3
d2 $ gF $ gMute -- Clap timer
$ midiOn "^43" (<| "~ c ~ c")
$ midiOff "^43" (<| "~ c")
$ midiOn "^42" (<| "~ c ~ c")
$ midiOff "^42" (<| "~ c")
$ drumFrom "[sakatadpm48,rolandr8]" "cp"
# lpf 2000
# midiG' "^79" 0 1.3
d3 $ gF $ gM2
$ midiOn "^44" (mask "t([8 . 4 <4 <8 16>>],16)")
$ midiOn "^43" (mask "t([8 . 4 <4 <8 16>>],16)")
-- FIXME(#94) d3 drives more controls than the grid gives it (BT3 only — BL1-3 are the family mutes). ^76 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^76 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 d3's own control with gSel.
-- FIXME(#94) d3 drives more controls than the grid gives it (BT3 only — BL1-3 are the family mutes). ^76 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^76 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 d3's own control with gSel.
$ midiOn "^76" (struct "t*[8 <8 16> <16 8 8 16> <16 [32 <64 128>]>]")
$ fix ((|* gain (slow 32 $ range 0.3 1.3 saw))) "oh"
$ "~ h ~ h ~ h*<1!3 2 1 1 2 2> ~ h*<1!7 2>" # drumFrom "sakatadpm48" "[hh,oh]"
......@@ -41,17 +43,20 @@ d4 $ gF2
$ "fbass:4"
# cut 4
# pan 0.1
# crushbus 41 (range 16 2.5 "^53")
# crushbus 41 (range 16 2.5 "^32")
# midiG' "^81" 0 1.4
d6 $ gF3
$ midiOn "^91" (ply "4 <4 8>")
$ 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.
$ midiOn "^59" (slice 8 ("0 <0 [0 <0 1 2 3>]>") . chop 8)
$ midiOff "^59" (slice 4 ("<0 1 2 3>"))
$ loopAt 16
$ "shiloh:7"
# pan 0.8
# room 0.2 # sz 0.8 # dry 1
# crushbus 81 (range 16 2.5 "^55")
-- FIXME(#54) d6 drives more controls than the grid gives it (B6 + C6). ^34 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 d6's own control.
-- # crushbus 81 (range 16 2.5 "^34")
# midiG' "^83" 0 1.2
# cut 6
......@@ -73,22 +78,22 @@ d7 $ gF3 $ gM3 -- High Dauphin
# cut 7
# room 0.2
# pan 0.9
# crushbus 71 (range 16 2.5 "^55")
# crushbus 71 (range 16 2.5 "^35")
# midiG' "^83" 0 1
d3 $ gF $ gM2
$ midiOn "^44" (mask "t([8 4 <4 <8 16>>],16)")
$ midiOn "^43" (mask "t([8 4 <4 <8 16>>],16)")
$ midiOn "^76" (struct "t*[8 <8 16> <16 8 8 16> <16 [32 <64 128>]>]")
$ fix ((|* gain (slow 32 $ range 0.3 1.3 saw))) "oh"
$ "~ h ~ h ~ h*<1!3 2 1 1 2 2> ~ h*<1!7 2>" # drumFrom "sakatadpm48" "[hh,oh]"
# n "0!3 <0!3 1>"
# midiG' "^80" 0 1.6
d4 $ gF2 $ slow 2 -- Basse Baleine
$ midiOn "^89" (struct "t*<16 32>") -- Basse folle
$ midiOn "^44" (struct "t*<16 32>") -- Basse folle
$ (0.125 <~) -- Calage :)
$ someCyclesBy "^17" (
$ someCyclesBy "^52" (
(mask "<t!2 f t f f t t> f t@14") . (|* room 1.2)
) --
$ fix ((midiOff "^57" (# silence)) . (|* gain 0.8) . (|+ note 24) . (|* gain "<0.93!3 [0.92 0.85]>") . (# cut 5))
$ fix ((midiOff "^76" (# silence)) . (|* gain 0.8) . (|+ note 24) . (|* gain "<0.93!3 [0.92 0.85]>") . (# cut 5))
"bass2"
$ note (
"<[g4 c ef@14] [<c g> ef g@14] <[g4 c ef@14] [c5 bf5 g5@14]> [c ef d@13 ~]>"
......@@ -97,12 +102,14 @@ d4 $ gF2 $ slow 2 -- Basse Baleine
# "[bass2:1,bassWarsaw]" -- TODO: Autre basse moins venere?
# room 0.2
# pan 0.4
# crushbus 41 (range 16 2.5 "^53")
# crushbus 41 (range 16 2.5 "^32")
# midiG' "^81" 0 1.3
d6 $ gF3 $ gM3 -- Leads reponse
$ midiOn "^90" (struct "t*<16 32>") -- Basse folle
-- 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)
$ sometimesBy "^18" (bite 4 "[0, [~ 2]]")
-- FIXME(#54) d6 drives more controls than the grid gives it (B6 + C6). ^54 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^54 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.
$ sometimesBy "^34" (bite 4 "[0, [~ 2]]")
$ someCyclesBy "<f!3 t>" (mask "t f!15". (# legato 2))
-- $ (0.125 <~) -- Calage :)
-- $ someCyclesBy "^17" (
......@@ -117,10 +124,10 @@ d6 $ gF3 $ gM3 -- Leads reponse
- 12
)
# "FMRhodes1"
# room 0.2
-- # room 0.2
# pan 0.8
# modIndex (range 0 16 "^34")
# crushbus 61 (range 16 2.5 "^54")
# modIndex (range 0 16 "^54")
# crushbus 61 (range 16 2.5 "^34")
# midiG' "^82" 0 1.3
d8 $ gM $ gF3 -- Breaks divins
$ midiOn "^92" (off "e" id)
......
......@@ -3,17 +3,17 @@ resetCycles
do
setcps (120/60/4)
d1 $ gM1 $ gF1
$ midiOn "^42" (<| "k k k k*<1!3 2>")
$ midiOff "^42" (<| "k . <~!8 k!8 k(<3!3 [3 5]>,8)!16>")
$ midiOn "^41" (<| "k k k k*<1!3 2>")
$ midiOff "^41" (<| "k . <~!8 k!8 k(<3!3 [3 5]>,8)!16>")
$ "kick:5"
d2 $ gM2 $ gF1
$ fix (# lpf 2500) "h2ogmsn"
$ midiOff "^43" (slow 2)
$ midiOff "^42" (slow 2)
$ "~ s ~ <s!3 s*[<4 4 2 4> <2!3 4>]>"
# "[db:11,h2ogmsn:12]"
# "[dr55:3]"
d3 $ gM2 $ gF1
$ midiOn "^76" (ply "2 <2 4>")
$ midiOn "^43" (ply "2 <2 4>")
$ someCyclesBy "<0 0.4>" (jux $ swing 2)
$ "<hh(<3!3 [3 5]>,8)!3 [hh(3,8) hh(<3!3 5>,8)]>"
# "rampleA4:6" # gain 0.5
......@@ -22,11 +22,11 @@ d3 $ gM2 $ gF1
# dry 0.9
# pan (range 0.2 0.8 (slow 4 perlin))
d4 $ gM3 $ gF2
$ midiOn "^57" (>| note ("<d d <d g> <a d d a>>" - 2 - 12))
$ midiOn "^44" (>| note ("<d d <d g> <a d d a>>" - 2 - 12))
$ note ("d" - 2 - 12)
# "90s_synatm:2"
# crushbus 41 (range 12 1.4 "^53")
# octerbus 42 (range 0 1.4 "^33")
# crushbus 41 (range 12 1.4 "^32")
# octerbus 42 (range 0 1.4 "^52")
# cut 4
# room 0.4
# pan (slow 32 $ range 0.98 0.7 saw)
......@@ -35,7 +35,7 @@ d5 $ gM3 $ gF2
$ fix (|* gain 0.7) (n 10)
$ note "<<d!16 g!16> <d!16 g!16> d g [a@3 <~ bf>]>"
# n "<5!24 10!8>" # "cbow"
# crushbus 51 (range 12 2.4 "^54")
# crushbus 51 (range 12 2.4 "^33")
# cut 5
# gain 0.6
d7 $ gM3 $ gF3 -- Keys of Paradise
......@@ -48,8 +48,8 @@ d8 $ gF1 $ gM2 -- Train break train wreck
$ chop 16
$ midiOff "^36" (loopAt 2)
$ midiOff "^56" (loopAt 2)
$ midiOn "^60" (loopAt 0.5)
$ midiOn "^92" (ply "2 1 4 <2 1>")
$ midiOn "^92" (loopAt 0.5)
$ midiOn "^60" (ply "2 1 4 <2 1>")
$ chop 4
$ loopAt 4
$ "jungle_breaks:45"
......
do
d1 $ gM1 $ gF1
$ midiOn "^42" (struct "t t t <t [~ t] t t*2>")
$ midiOff "^42" (struct "t t(3,8)")
$ midiOn "^41" (struct "t t t <t [~ t] t t*2>")
$ midiOff "^41" (struct "t t(3,8)")
$ "jazz"
# lpf 400
d2 $ gM2 $ gF1
$ midiOff "^43" (struct "~ t")
$ midiOn "^43" (struct "~ t ~ t")
$ midiOff "^42" (struct "~ t")
$ midiOn "^42" (struct "~ t ~ t")
$ "vec1_snare:30"
d3 $ gM2 $ gF1 $ "hh*16" # "h2ogmhh"
d4 $ gM3 $ gF2
......@@ -15,8 +15,8 @@ d4 $ gM3 $ gF2
# s "bassWarsaw"
# octave 2
# gain 1.3
# crushbus 41 (range 16 2.5 "^53")
# octersubbus 42 (range 0 5 "^53")
# crushbus 41 (range 16 2.5 "^32")
# octersubbus 42 (range 0 5 "^32")
# leslie 0.85
# lrate (slow 16 $ range 2 16 saw)
# lsize 0.7
......@@ -24,15 +24,15 @@ d4 $ gM3 $ gF2
# pan 0.3
# room 0.2 # sz 0.8 # dry 0.8
d5 $ gM3 $ gF3
$ midiOff "^58" (mask "t(<1 2 3 4 5 6 7 8>,16)" . chop 16)
$ midiOn "^90" (ply "4 <4 8 8 16>")
$ midiOff "^57" (mask "t(<1 2 3 4 5 6 7 8>,16)" . chop 16)
$ midiOn "^89" (ply "4 <4 8 8 16>")
$ slice 8 (slow 2
$ ply "<1!8 2!3 4 2!3 8>"
$ "<0 1 2 3 4 5 6 7>")
$ "gfunk_lead:5"
# gain 1.2 # cut 5
# pan 0.8
# octersubbus 51 (range 0 2.5 "^54")
# octersubbus 51 (range 0 2.5 "^33")
d8 $ gM2 $ gF1
$ midiOff "^60" (mask "t(4,8,1)" . chop 16)
$ chop 8
......
......@@ -11,13 +11,13 @@ let chordsRoot = whenmod 128 64 (const $ jroot chords2) (jroot chords1)
setcps (81/60/4)
d1 $ gF1 $ gM1 -- KICK TECHNO KICK TO DNB
$ fast 2
$ midiOn "^42" (<| "k k k*<1 2 2 [4 2]> k*<1 <2 <4 [4 2]>>>")
$ midiOff "^42" (<|"k . ~ k ~ <~ k>" )
$ midiOn "^41" (<| "k k k*<1 2 2 [4 2]> k*<1 <2 <4 [4 2]>>>")
$ midiOff "^41" (<|"k . ~ k ~ <~ k>" )
$ "[808bd:13,jazz]"
# gain 1
# lpf 300
d2 $ gF1 $ gM2
$ midiOn "^43" (fast 2)
$ midiOn "^42" (fast 2)
$ "~ s ~ [s*<1!3 2> <~ <s s*[4 2]>>]"
# "hh27:12"
# cut 2
......@@ -26,7 +26,7 @@ d2 $ gF1 $ gM2
# legato 0.5
d3 $ gF1 $ gM2
$ degradeBy (slow 32 $ range 0.8 "-0.2" sine)
$ midiOff "^44" (degradeBy "0 0.2 0.4 0.8 0 <0!4 0.5!4> 0.1 0")
$ midiOff "^43" (degradeBy "0 0.2 0.4 0.8 0 <0!4 0.5!4> 0.1 0")
$ "dr*[<32!3 16> . 16 <32 [8 32]>]"
# "h2ogmsn:4"
# gain (0.8 * "1 1 0.9 1 0.8 0.9 0.8 <0.9 0.8 0.9 [1.1|1]>")
......@@ -43,17 +43,17 @@ d4 $ gF2 $ gM3
# room 0.3 # sz 0.4 -- Tighter reverb for punch
# gain (1.3 * "<1 [0.9|1] 1 0.9>") -- Consistent power with subtle variation
# legato (slow 8 $ range 0.5 1 perlin) -- Not always full
# crushbus 41 (range 16 3.5 "^53")
# crushbus 41 (range 16 3.5 "^32")
d5 $ gF3 $ gM3
-- $ struct "<[t ~ ~ t? ~ t ~ ~] [t ~ t? ~ ~ ~ t ~]>" -- Alternating patterns + random hits
-- $ struct "t ~ [~|t] t ~ <t t?> ~ ~" -- Alt: More random variation
$ superimpose (id -- TODO ARPEGIATE PLZ)
(midiOn "^90" (stut 4 "e" 0.9)) .
(midiOn "^89" (stut 4 "e" 0.9)) .
struct "t(12,8)" .
slow 4
. arp "up"
. (# cut 51)
. (|* gain (1.4 * "^34"))
. (|* gain (1.4 * "^33"))
. (|+ octave 1)
. (# pan 0.8)
. (# modIndex 0)
......@@ -70,7 +70,7 @@ d5 $ gF3 $ gM3
# pan ("<0.3 0.7 [0.5|0.6]>" + (slow 32 $ range (-0.1) 0.1 sine)) -- Drift + variation
# attack (0.01 + (rand * 0.02)) -- Slight timing humanization
# release (slow 16 $ range 0.8 1.5 sine)
# crushbus 41 (range 16 3.5 "^54")
# crushbus 41 (range 16 3.5 "^53")
d7 $ gF3 $ gM3
$ slow 16 $ chordsRoot -- Very slow, ambient
-- |+| n "[0,7] ~ ~ ~ [7,12]? ~ ~ ~" -- Fifth chords, sparse hits
......
......@@ -5,14 +5,14 @@ setcps (112/60/4)
let width = pF "width"
let dMask = (whenmod 8 7 (mask "t t <t f> f"))
d1 $ gF1 $ gM1
$ midiOn "^42" (<| "k k k <k k*2 k <k [~ k] k*2 [~ . k*2 k*<1 2>]>>")
$ midiOff "^42" (<| "k . <~!8 k!8> ~ ~ k")
$ midiOn "^41" (<| "k k k <k k*2 k <k [~ k] k*2 [~ . k*2 k*<1 2>]>>")
$ midiOff "^41" (<| "k . <~!8 k!8> ~ ~ k")
-- $ fix (|* gain 0.6) "jazz"
$ "[jazz]"
# gain 0.9
d2 $ gF1 $ gM2
$ midiOn "^43" ((whenmod 4 3 (superimpose (("e" <~) . ply "<1 2 [4 2] [8 4]>" . (|* gain 0.95)))) . (<| "~ s ~ s*<1 <2 [2 4]>>") . (# legato 0.5))
$ midiOff "^43" (<| "~ <s <~ [~ s]>>")
$ midiOn "^42" ((whenmod 4 3 (superimpose (("e" <~) . ply "<1 2 [4 2] [8 4]>" . (|* gain 0.95)))) . (<| "~ s ~ s*<1 <2 [2 4]>>") . (# legato 0.5))
$ midiOff "^42" (<| "~ <s <~ [~ s]>>")
$ "vec1_claps"
# gain 1
# room (slow 16 $ range 0 0.8 perlin)
......@@ -21,13 +21,13 @@ d2 $ gF1 $ gM2
# gain 0.8
-- # att 0.03 # rel 2
d3 $ gF1 $ gM2
$ midiOff "^44" (mask "t(4,8,1)")
$ midiOff "^43" (mask "t(4,8,1)")
$ "h*[<12 16 32 8> <8 [4 16]>]"
# "drum:2"
# gain 1.2
# room 0.3 # dry 0.8
d4 $ gF2 $ gM3
$ midiOn "^57" (
$ midiOn "^44" (
|+ note (arp "up" "<c'maj'4!8 g'maj'4!8> c'maj'4")
)
$ struct "t. t(<3 5 8>,8)"
......@@ -36,7 +36,7 @@ d4 $ gF2 $ gM3
# gain 0.8
# room 0.4 # sz 0.4
d5 $ gF3 $ gM3
$ midiOn "^90" (ply "8 <8 16>")
$ midiOn "^89" (ply "8 <8 16>")
$ slice 8 ("<0 1 2 3 4 5 6 7>")
-- $ loopAt 4
$ "cricri:7"
......
......@@ -3,28 +3,28 @@ setcps (114/60/4)
-- resetCycles
d1 $ gF1 $ gM1 -- Kick
$ midiOff "^78" (# silence)
$ midiOn "^42" (<| "k k k <k <[~ k] k*2>>")
$ midiOff "^42" (<| "k . ~ k ~ ~ ")
$ midiOn "^41" (<| "k k k <k <[~ k] k*2>>")
$ midiOff "^41" (<| "k . ~ k ~ ~ ")
$ "[kick:4]"
# gain 1.8
# lpf 400
d2 $ gF1 $ gM2
$ midiOff "^79" (# silence)
$ midiOff "^43" (slow 2 . (<| "~ ~ ~ s"))
$ midiOn "^43" (<| "~ s ~ s*<1 2 [2 1] [4 <2 8>]>" )
$ midiOff "^42" (slow 2 . (<| "~ ~ ~ s"))
$ midiOn "^42" (<| "~ s ~ s*<1 2 [2 1] [4 <2 8>]>" )
$ "cp" # hpf 1400 # gain 1.3
d3 $ gF1 $ gM2
$ midiOff "^44" (mask "t(4,8,1)")
$ midiOff "^43" (mask "t(4,8,1)")
$ "o([8 . 8 <8 16> 4],8,1)"
# "ho"
# gain 1.2
# att 0.1 # rel 0.9
# room 0.5
# drybus 31 (range 1 0 "^51")
# legato (range "s" 2 "^52")
# legato (range "s" 2 "^31")
d5 $ gF2 $ gM3
$ midiOn "^90" (ply 4)
$ midiOn "^58" (# n 1)
$ midiOn "^89" (ply 4)
$ midiOn "^57" (# n 1)
-- $ slice 4 (ply 2 $ "<0 1 2 3>" + "0 0*2")
$ slice 4 (ply 2 $ "<0 0 0 3>")
$ "aux_heart"
......@@ -32,21 +32,21 @@ d5 $ gF2 $ gM3
# gain 1.4
# room 0.4
# pan 0.8
# crushbus 51 (range 16 2.5 "^54")
# octerbus 52 (range 0 1 "^34")
# crushbus 51 (range 16 2.5 "^33")
# octerbus 52 (range 0 1 "^53")
# gain 1.7
d4 $ gF2 $ gM3
$ midiOn "^89" (chop "<8 8 8 8 8 7 8 7>")
$ midiOn "^76" (chop "<8 8 8 8 8 7 8 7>")
$ note ("<a <a [a@7 b]> fs <fs [fs@7 e]>>"
-- + "[0,<0 7>,7,12]"
- "[24]"
)
# "bassWarsaw"
# gain 1.5
# crushbus 41 (range 16 2.5 "^53")
# octersubbus 42 (range 0 2.5 "^33")
# crushbus 41 (range 16 2.5 "^32")
# octersubbus 42 (range 0 2.5 "^52")
d7 $ gF3 $ gM3
$ midiOn "^91" ((ply "8 <16 [16 32]>"))
$ midiOn "^59" ((ply "8 <16 [16 32]>"))
$ slow 2
$ slice 4 ("<0 1 2 3>")
$ "aux_heart:3"
......
......@@ -2,16 +2,16 @@ do
setcps (120/60/4)
-- resetCycles
d1 $ gF1 $ gM1
$ midiOn "^42" (<| "k <k!6 ~ ~> <k!7 ~> <k k*2>")
$ midiOff "^42" (<| "<k <~ [~!7 k]>>")
$ midiOn "^41" (<| "k <k!6 ~ ~> <k!7 ~> <k k*2>")
$ midiOff "^41" (<| "<k <~ [~!7 k]>>")
$ "[reverbkick,808bd:4]" -- Profond
# gain 1.8
# lpf 400
# octersub 2
# cut 1
d2 $ gF1 $ gM2
$ midiOn "^43" (<| "~ s ~ s*<1!3 2>")
$ midiOff "^43" (<| "~ . <~ <s [s*2 . ~ <~ s>]>>")
$ midiOn "^42" (<| "~ s ~ s*<1!3 2>")
$ midiOff "^42" (<| "~ . <~ <s [s*2 . ~ <~ s>]>>")
$ "[snare:70]"
# note "-5"
# gain 1.4
......@@ -30,7 +30,7 @@ d4 $ gF2 $ gM3 -- BASSLINE SYNTH
$ chop 2
$ superimpose (
(
# crushbus 41 (range 10 4.5 "^53")
# crushbus 41 (range 10 4.5 "^32")
) . (# hpf 500) . (# lpf 10000)
)
$ slow 2
......@@ -44,7 +44,7 @@ d4 $ gF2 $ gM3 -- BASSLINE SYNTH
# room 0.4 # sz 0.8
# octersub 2 # octersubsub 1
d5 $ gF3 $ gM3
$ midiOn "^58" (superimpose ( -- Echoes
$ midiOn "^89" (superimpose ( -- Echoes
(# pan 0.8)
. (0.25 ~>)
. (|* gain "<0 1> 0.9 0.8 0.8")
......@@ -72,15 +72,15 @@ d7
d8 $ gF1 $ gM2
$ midiOn "^92" ( -- BREAK ME
splice 4 "<0!3 [0 1] 0 0 [0 1] [0 1]*2> 1 2 3*<4 <2 8>>")
$ midiOn "^56" (loopAt 0.5 . (# "break:15"))
$ midiOn "^36" (loopAt 0.5 . (# "break:15"))
$ loopAt 2
$ chop 8
$ "jungle_breaks:101"
# gain 1.2
d4 $ gF2 $ gM3 -- Cello bass
$ midiOn "^89" (|+| note "[0 12 0]")
$ midiOn "^57" (|+| note "0 0 <7 [7 9](3,8) 7 [7 9 12 7]> 0")
$ midiOn "^44" (|+| note "[0 12 0]")
$ midiOn "^76" (|+| note "0 0 <7 [7 9](3,8) 7 [7 9 12 7]> 0")
$ juxBy 0.6 (|+| note ("7([3 1],8)"))
$ note ("<[fs@7 <~ bf>] [fs@7 <~ cs>] <bf ef> <cs!3 bf>>")
|* gain "<[1@7 0.9] 1 1 1>"
......@@ -113,7 +113,7 @@ d8 $ gF1 $ gM2
$ midiOn "^92" (ply 4)
$ loopAt 2
$ chop 8
$ midiOn "^56" (>| "jungle_breaks:10")
$ midiOn "^36" (>| "jungle_breaks:10")
$ "jungle_breaks:11"
# cut 8
# room 0.4 # dry 1.1
......
......@@ -9,8 +9,8 @@ setcps (114/60/4)
d1 $ gM1 $ gF1 -- Kick solide
$ fix ((|* gain 0.9) . (# lpf 1000)) "jazz"
$ fix ((# att 0.02) . (# rel 0.5) . (# lpf 5000)) "kick:4"
$ midiOn "^42" (struct "t*4")
$ midiOff "^42" (<| "k ")
$ midiOn "^41" (struct "t*4")
$ midiOff "^41" (<| "k ")
$ "[jazz,kick:4,909]"
-- # midiG' "^78" 0 1.2
# gain 1.2
......@@ -27,18 +27,18 @@ d3 $ gM2 $ gF1
-- # midiG' "^80" 0 1.6
# gain 1.6
d4 $ gF2
$ midiOn "^89" (ply "<4 8>" . slow 2)
$ midiOff "^57" (mask "f(4,8,1)")
$ midiOn "^76" (ply "<4 8>" . slow 2)
$ midiOff "^44" (mask "f(4,8,1)")
$ note ((slow 2 $ ("<e3 e3 b3 <b3 b3 a3 a3>>" + "[0,0(4,8,1)*2]"))
-- "<[d,f,a,c6,e6,g6] [ef, gf, bf, df6,f6,af6]>"
)
# crushbus 41 (range 16 2.5 "^53")
# crushbus 41 (range 16 2.5 "^32")
# "bassWarsaw"
# pan 0.25
-- # midiG' "^81" 0 1.5
# gain 1.5
d5 $ gM3 $ gF3
$ midiOn "^58" (mask "t(<1 2>,4)")
$ midiOn "^57" (mask "t(<1 2>,4)")
-- c e d b / c a d b / a c b g / c a g b
$ note ("<[c@2 e@2 d@1 b4@3]!2 [c@2 a4@2 d@1 b4@3]!2 [a4@2 c@2 b4@1 g4@3]!2 [c@2 a4@2 c@1 b4@3]!2>" - 3)
# att 0.8
......@@ -49,8 +49,8 @@ d5 $ gM3 $ gF3
-- # velocity 0.45
-- # midiG' "^82" 0 2.5
# gain 2.5
# crushbus 51 (range 16 4.5 "^54")
# roombus 52 (range 0 0.5 "^54") # sz 0.5 # dry 1.3
# crushbus 51 (range 16 4.5 "^33")
# roombus 52 (range 0 0.5 "^33") # sz 0.5 # dry 1.3
d8 $ gF1
$ midiOn "^92" (ply "1 <2 4 4 8>")
$ chop 16
......@@ -108,8 +108,8 @@ setcps (120/60/4)
$ "[jazz,kick:4]" # lpf 3000
# midiG' "^78" 0 1.5
d2 $ gM2 $ gF1 -- snare contretemps variable
$ midiOn "^43" (<| "~ cp ~ cp")
$ midiOff "^43" (<| "~ cp")
$ midiOn "^42" (<| "~ cp ~ cp")
$ midiOff "^42" (<| "~ cp")
$ "[cp]"
# pan 0.65
# legato 0.22
......
......@@ -5,15 +5,15 @@ let modIndex = pF "modIndex"
d1 $ gM1 $ gF1 -- Kick solide
$ fix ((|* gain 0.9) . (# lpf 1000)) "jazz"
$ fix ((# att 0.02) . (# rel 0.5) . (# lpf 5000)) "kick:4"
$ midiOn "^42" (struct "t t t t*<1!6 2 2>")
$ midiOff "^42" (<| "k . ~ <~!3 k> ~ ~")
$ midiOn "^41" (struct "t t t t*<1!6 2 2>")
$ midiOff "^41" (<| "k . ~ <~!3 k> ~ ~")
$ "[jazz,kick:4]"
# gain 1.2
-- # midiG' "^78" 0 1.5
d2$ gM2 $ gF1 -- snare contretemps variable
$ fix ((|* gain 0.8) . (# legato 0.05)) "cp"
$ midiOn "^43" (<| "~ cp ~ cp*<1 1 2 <1 2>>")
$ midiOff "^43" (<| "~ [cp*<1!3 <2 <4 [4 2]>>> ~]")
$ midiOn "^42" (<| "~ cp ~ cp*<1 1 2 <1 2>>")
$ midiOff "^42" (<| "~ [cp*<1!3 <2 <4 [4 2]>>> ~]")
$ "[vec1_claps:10]"
-- # pan 0.65
# gain 1.5
......@@ -28,13 +28,13 @@ d4 $ gF1 $ gM3
$ note ("<e3 b3 e3 g3>" - 12)
# "bassWarsaw"
# gain 1.3
# crushbus 41 (range 16 3.5 "^53")
# octersubbus 42 (range 0 1.5 "^33")
# crushbus 41 (range 16 3.5 "^32")
# octersubbus 42 (range 0 1.5 "^52")
d5 $ gF1 $ gM3
-- $ midiOn "^90" (ply "4")
$ midiOn "^90" (stut 4 0.9 "q")
$ midiOn "^58" (slice 8 "<4 4 <4 5> 6>") -- Phase 2
$ midiOff "^58" (slice 16 "<[1 2] [1 2] [1 2] [3 4]>") -- Phase1
$ midiOn "^89" (stut 4 0.9 "q")
$ midiOn "^57" (slice 8 "<4 4 <4 5> 6>") -- Phase 2
$ midiOff "^57" (slice 16 "<[1 2] [1 2] [1 2] [3 4]>") -- Phase1
$ "latin:0"
# cut 5
# gain 1.2 # room 0.3 # sz 0.9 # lpf 4000
......
......@@ -3,22 +3,24 @@ resetCycles
do
setcps(120/60/4)
d1 $ gF1 $ gM1
$ midiOn "^42" (<| "k k k <k!3 <[~ k*<1!3 2>]!3 k*2>>")
$ midiOff "^42" (<| "k . ~ k ~ ~")
$ midiOn "^41" (<| "k k k <k!3 <[~ k*<1!3 2>]!3 k*2>>")
$ midiOff "^41" (<| "k . ~ k ~ ~")
$ fix (|* gain 0.9) "kick:5"
$ "[h2ogmbd:1,kick:5]" -- TODO: Meilleur kick?
# gain 1.2
d2 $ gF1 $ gM2
$ midiOn "^43" (<| "~ c ~ c*<1!3 2>")
$ midiOff "^43" (<| "~ . ~ c*<1!3 <2!3 4>>")
$ midiOn "^42" (<| "~ c ~ c*<1!3 2>")
$ midiOff "^42" (<| "~ . ~ c*<1!3 <2!3 4>>")
$ "cp"
# gain 0.9
# pan 0.6
# note "-3"
-- # room 0.84 # dry 0.95 # sz 0.1
d3 $ gF1 $ gM2 -- Highest hats
$ midiOff "^44" (slow 2)
$ midiOff "^43" (slow 2)
$ arp "up"
-- FIXME(#94) d3 drives more controls than the grid gives it (BT3 only — BL1-3 are the family mutes). ^76 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^76 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 d3's own control with gSel.
-- FIXME(#94) d3 drives more controls than the grid gives it (BT3 only — BL1-3 are the family mutes). ^76 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^76 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 d3's own control with gSel.
$ midiOn "^76" (ply 2)
-- $ "d(<8 10 12 <14 [16 32 [16 <16 32>]]>>,16,1)" -- FIXME IRREGULIER
$ "d([16 <16 [8 <8 32 16 32>]>],32,0)" -- REGULIER :)
......@@ -29,21 +31,21 @@ d3 $ gF1 $ gM2 -- Highest hats
# gain (0.7 * (range 0.85 1.05 (fast 4 perlin)))
# pan 0.3
d4 $ gM3 $ gF2
$ midiOn "^89" (superimpose (
$ midiOn "^76" (superimpose (
(struct "t(8,16)") . (# legato 0.2). (# cut 41))
. (|* gain 0.8)
)
$ note "<<e!3 e4> <~ [~!7 <g g g a g a bf b>]>>"
# "moog"
# crushbus 41 (range 16 2.5 "^53")
# octerbus 42 "^33"
# crushbus 41 (range 16 2.5 "^32")
# octerbus 42 "^52"
# cut 4 # gain 0.8
d5 $ gM3 $ gF3
$ midiOn "^90" (ply 2)
$ midiOn "^89" (ply 2)
$ note (arp "down" "c'min'2" + "<<e!3 e4> <b3 [~!7 <g g g a g a bf b>]>>")
# "FMRhodes1"
# crushbus 52 (range 16 2.5 "^54")
# modIndex (range 0 2.5 "^34")
# crushbus 52 (range 16 2.5 "^33")
# modIndex (range 0 2.5 "^53")
-- # cut 5
# pan 0.7
# gain 1.2
......@@ -58,7 +60,7 @@ d8 $ gF1 $ gM2 -- Break populaire
# pan "0.68 0.42 0.42 0.68"
d7 $ gF1 $ gM3 -- SECOND BREAK!!?!
$ midiOn "^91" (ply 2)
$ midiOn "^55" (loopAt 1 . (|> "jungle_breaks:19"))
$ midiOn "^35" (loopAt 1 . (|> "jungle_breaks:19"))
$ midiOn "^59" (slice 8 (run "8 <8!3 16>"))
$ chop 8
$ loopAt 2
......
......@@ -6,8 +6,8 @@ setcps (120/60/4)
d1 $ gF1 $ gM1
-- $ "k k k*<1!3 [4 1] 1!2 2 1> <k!3 <[~ k] k*2>>"
-- $ "k ~ <~ [~ k*<1 1 2 1>]> [<~!7 k> <~!3 k*<1 2>>]"
$ midiOn "^42" (<| "k k k k*<2 4>")
$ midiOff "^42" (<|"k . ~ k ~ ~")
$ midiOn "^41" (<| "k k k k*<2 4>")
$ midiOff "^41" (<|"k . ~ k ~ ~")
$ "[jazz,kick:5]"
-- # att 0.02
-- # rel 0.5
......@@ -20,21 +20,21 @@ d2 $ gF1 $ gM2 $ "~ s ~ s*<1 2>"
# gain 1.2
d3 $ gF1 $ gM2 $ "~ d ~ d ~ d ~ d*<1 <2 [2 4]>>" # "dr:2" # "hh27:3" # cut 3 # gain 1.8
d4 $ gF2 $ gM3
$ midiOn "^89" (ply 8)
$ midiOn "^76" (ply 8)
$ note ("<c <ef <[ef@7 g] [ef [g ef g]]>> f@2>" - 24)
# "bassWarsaw"
# crushbus 41 (range 16 2.5 "^53")
# octerbus 42 (range 0 0.85 "^33")
# crushbus 41 (range 16 2.5 "^32")
# octerbus 42 (range 0 0.85 "^52")
# room 0.4
# gain 1.5
d5 $ gF3 $ gM3
$ midiOff "^58" (mask "t f")
$ midiOff "^57" (mask "t f")
$ loopAt 2
$ chop 2
$ midiOn "^58" (# n 14)
$ midiOn "^57" (# n 14)
$ "nujazz_keys120:13"
# room 0.5
# crushbus 51 (range 10 1.8 "^54")
# crushbus 51 (range 10 1.8 "^33")
# sz 0.8 # dry 1.2
d7 $ gF3 $ gM3
$ midiOn "^91" (ply "2 <2 4 4 8>")
......@@ -48,7 +48,7 @@ d7 $ gF3 $ gM3
# gain 1.4
d8 $ gF1 $ gM2 $ chop 8
$ midiOff ("^60" + "^92") (mask "f(4,8)")
$ midiOn ("^56" - "^92") (chop 8 . loopAt 2 . (# "jungle_breaks:45"))
$ midiOn ("^36" - "^92") (chop 8 . loopAt 2 . (# "jungle_breaks:45"))
$ midiOn ("^92") ( -- Bouton Nassim <3
slice 8 "[0 .. 3] . <[0 .. 3]!1 [0 1 . 3*2]>"
. loopAt 1 . (# "breaks165")
......
......@@ -4,10 +4,10 @@ setcps (142/60/4)
let modIndex = pF "modIndex"
d1 $ gF1 $ gM1
$ whenmod 32 24 (# lpf (slow 8 $ range 50 500 saw))
$ midiOn "^30" ((# "gtkick:1") . (# bandf 993). (|* gain 1.2))
$ midiOn "^29" ((# "gtkick:1") . (# bandf 993). (|* gain 1.2))
-- $ mask "<f!16 t!4 f!8 t!36>"
$ midiOn "^42" (<| "k k*<1 1 2 <1 4>> k k*<1!3 2>")
$ midiOff "^42" (<| "k . ~ <k!12 ~!4> ~ <~!7 k>")
$ midiOn "^41" (<| "k k*<1 1 2 <1 4>> k k*<1!3 2>")
$ midiOff "^41" (<| "k . ~ <k!12 ~!4> ~ <~!7 k>")
-- $ superimpose ((# "hardkick_rha:3") . (# lpfbus 12 80))
$ stack [
"[techno:0,jazz]"
......@@ -16,8 +16,8 @@ d1 $ gF1 $ gM1
-- # room 0.2
d2 $ gM2 $ gF1 -- Snare contretemps DNB Techno-compatible
-- $ fix ((|- note 2) . (# lpf 1200)) ""
$ midiOn "^43" (<| "~ s ~ s*<1!3 2>")
$ midiOff "^43" (<| "~!3 s")
$ midiOn "^42" (<| "~ s ~ s*<1!3 2>")
$ midiOff "^42" (<| "~!3 s")
-- $ "[snare:35,<snare:43!4 snare:40!4>]"
$ "vec1_claps:45" # legato 0.25
# gain 1.44
......@@ -35,7 +35,7 @@ d6 $ gM3 $ gF1 -- HAWKS
# gain 1.4
# dry 1.02
d3 $ gM2 $ gF1-- DrumRoll
$ midiOn "^76" (ply 2)
$ midiOn "^43" (ply 2)
-- $ mask "<f!20 t!44>"
$ whenmod 8 "<7!4 6!3 4>" (juxBy 0.93 rev)
-- $ whenmod 4 2 (rarely (ply 2))
......@@ -58,41 +58,42 @@ d9 $ gF3 $ gM3 -- BASSLINE FONDEMENT
# gain 1.8
d4 $ gF2 $ gM3 -- LA BASSE REBONDISSANTE
$ superimpose (mask "[f t]*4" . (|+| note (12 + "0 12 <0!3 <12!3 0>>" + 3))
. (# "vec1_acid:6") . (|* gain (range 0.35 1 "^33")). (# cut 41))
$ midiOn "^57" (off "-0.125" (|- note 12))
. (# "vec1_acid:6") . (|* gain (range 0.35 1 "^32")). (# cut 41))
$ midiOn "^44" (off "-0.125" (|- note 12))
$ note ("~ f ~ f . ~ <f!3 ef> <~!3 f> <f!3 ~>" - 24)
# "bassWarsaw"
# gain 1.3
# octersubsubbus 42 (range 0 0.8 "^17")
# octerbus 43 (range 0 0.8 "^17")
# crushbus 41 (range 16 3.5 "^53")
# octersubsubbus 42 (range 0 0.8 "^52")
# octerbus 43 (range 0 0.8 "^52")
-- FIXME(#54) d4 drives more controls than the grid gives it (B4 + C4). ^53 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.
-- # crushbus 41 (range 16 3.5 "^53")
# room 0.4 # sz 0.5
d5 $ gF2 $ gM3 -- Keys
$ mask "t <f!4 t!12>"
$ midiOn "^90" (ply 8 . chop 4)
$ midiOn "^58" (slice 16 ("[~ <4!4 3!4 2!4 1!4>]*4"))
$ midiOn "^89" (ply 8 . chop 4)
$ midiOn "^57" (slice 16 ("[~ <4!4 3!4 2!4 1!4>]*4"))
-- $ someCyclesBy (slow 16 $ range 0 0.2 saw) (degradeBy "0 0.5!15")
$ slow 4
$ "sogood"
# n "<0!4 1!4 2!4 3!4>"
# cut 5
# octersubbus 51 (range 0 0.9 "^34")
# crushbus 52 (range 16 4.5 "^54")
# octersubbus 51 (range 0 0.9 "^33")
# crushbus 52 (range 16 4.5 "^53")
# gain 1.8
# lpf 2000
-- # room 0.4
d7 $ gF3 $ gM3 -- VOICES TODO Refine loops
-- $ midiOn "^91" (ply "<2>" . off 1 id . off 2 id . chop "<1!3 4>" . (# cut 7))
$ midiOn "^91" (ply "8 4" . chop "<1 2>". (# cut 7) . (# room 0.3))
$ midiOn "^19" ( -- Intro: Your love
$ midiOn "^35" ( -- Intro: Your love
(>| n "<~!3 11>") . (# end (slow 4 "<0.2 0.55>")))
$ midiOn ("^59"-"^19") ((>| n "<<7 8 9 10> ~ <~!7 11> ~>") . (|* gain 1.1)) -- CHORUS
$ midiOff ("^59"+"^19") (>| n "<<4 5 <5 6> 6> ~ ~ <~!3 11> ~>") -- LEAD
$ midiOn ("^59"-"^35") ((>| n "<<7 8 9 10> ~ <~!7 11> ~>") . (|* gain 1.1)) -- CHORUS
$ midiOff ("^59"+"^35") (>| n "<<4 5 <5 6> 6> ~ ~ <~!3 11> ~>") -- LEAD
$ "sogood"
# gain 1.6
-- # cut 7
-- # delay "<0!3 [0.5]>" # delayt 0.125 # delayfb 0.5
# octersubbus 71 (range 0 1.9 "^35")
# octersubbus 71 (range 0 1.9 "^55")
d11 $ gF2 $ gM3
$ note ("<gs4 f4 gs4 f4 c5 gs4 c5 gs4 f5 ef5 cs5 c5 bf4 gs4 g4 f4>"
+ "0 5@3 . 0 <-2 <2 5>>"
......
......@@ -4,15 +4,15 @@ setcps (166/60/4)
-- d1 $ gF1 $ gM2
d1 $ gF1 $ gM1
-- $ midiOff "^42" (<| "<k [~!7 k*<1 2>]>")
$ midiOff "^42" (<| "k . ~ k*<1 2> ~ <~ k k <~ k*4>>")
$ midiOn "^42" (<| "k k . k <k [~ k] k k*2>")
$ midiOff "^41" (<| "k . ~ k*<1 2> ~ <~ k k <~ k*4>>")
$ midiOn "^41" (<| "k k . k <k [~ k] k k*2>")
$ "[jazz]"
-- # lpf 300 -- TODO Sound design this kick <3
# cut 1
# gain 1.5
d2 $ gF1 $ gM2
$ midiOff "^43" (<| "~ s ~ [s*<1!3 2> ~]")
$ midiOn "^43" (<| "~ . s*<1!3 2> ~")
$ midiOff "^42" (<| "~ s ~ [s*<1!3 2> ~]")
$ midiOn "^42" (<| "~ . s*<1!3 2> ~")
$ "[snare:24,snare:51]"
# "h2ogmcp"
# gain (1.0 * "<[1]!16 [1 <1 <1 [1 0.93] 1 [0.9]>>]!16>")
......@@ -26,32 +26,32 @@ d3 $ gF1 $ gM2
# "h2ogmhh:2"
# gain 1.7
-- # att 0.03 # rel 0.9
# legato (range 0.05 0.9 "^32")
# legato (range 0.05 0.9 "^31")
d4 $ gF2 $ gM3
$ midiOn "^57" (
$ midiOn "^76" (
superimpose (("e" ~>) .(|+ note 12) . (# cut 41)))
$ note ("0(3,8) . 0(3,8)" + "f bs c . f bs c"
+ "<0 0 0 0 7 7 5 0>"
)
-- # "moog:1"
# "bassWarsaw" |- note 24
# crushbus 41 (range 16 3.5 "^53")
# crushbus 41 (range 16 3.5 "^32")
# pan 0.4
# cut 4
# gain 1.4
d5 $ gF3 $ gM3 -- Les ptites keys de fin de session tranquilou
$ midiOn "^90" (ply "4 <8 16>")
$ midiOn "^89" (ply "4 <8 16>")
$ slow 2
$ slice 8 "<0 1 2 3 4 5 6 7>"
$ "gfunk_lead:10" # cut 4
# gain 1.8
# crushbus 51 (range 16 3.5 "^54")
# crushbus 51 (range 16 3.5 "^33")
# pan 0.9
# room 0.3
d8 $ gF1 $ gM2
$ midiOff "^60" (mask "t(4,8,1)") -- Techno drum mask
$ 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
slice 16 "[0 .. 7] . <[0 .. 7]!3 [0 1 . [2 3]]>"
. loopAt 1 . (# "breaks165")
......
......@@ -4,8 +4,8 @@ setcps (110/60/4)
let modIndex = pF "modIndex"
d1 $ gF1 $ gM1
-- $ midiOn "^30" (# "hardkick_rha")
$ midiOn "^42" (struct "t*<1!4 2 1!3> t t*<1!6 2 1> t*<1!7 2>")
$ midiOff "^42" (struct "t . ~ t*<1!3 2> ~ <~!3 t*<2 [2 1] [4 2] [2 4]>>")
$ midiOn "^41" (struct "t*<1!4 2 1!3> t t*<1!6 2 1> t*<1!7 2>")
$ midiOff "^41" (struct "t . ~ t*<1!3 2> ~ <~!3 t*<2 [2 1] [4 2] [2 4]>>")
$ stack [
"kick" # lpf 10000 # cut 1,
"rumble" |* gain 1.3
......@@ -16,8 +16,8 @@ d1 $ gF1 $ gM1
# "[techno:1,jazz]"
# gain 1.4
d2 $ gF1 $ gM2
$ midiOn "^43" (<|"~ s ~ s*<1 2>")
$ midiOff "^43" (<| "~ s")
$ midiOn "^42" (<|"~ s ~ s*<1 2>")
$ midiOff "^42" (<| "~ s")
$ "[vec1_snare:5]"
# note "<-0!12 -2 -2 -3 0>"
# gain 1.3
......@@ -30,25 +30,27 @@ d3
d6 $ gF1 $ gM3
$ "~ clap:2"
d4 $ gF2 $ gM3
$ midiOn "^89" (ply 4)
$ midiOn "^76" (ply 4)
$ chop 4
$ loopAt 2
$ "blues_guitar_rock_110" # n "<9 <9 13> 11 12>"
# cut 4
# room 0.3
# crushbus 41 (range 16 2.5 "^53")
# octersubbus 42 (range 0 4 "^33")
# tremdpbus 43 "^17"
# tremrbus 44 (range 0.2 8 "^18")
# crushbus 41 (range 16 2.5 "^32")
# octersubbus 42 (range 0 4 "^52")
-- 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.
-- # tremdpbus 43 "^17"
-- FIXME(#54) d4 drives more controls than the grid gives it (B4 + C4). ^18 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.
-- # tremrbus 44 (range 0.2 8 "^18")
d5 $ gF3 $ gM3 -- YOUR VALUES ARE WRONG
$ midiOff "^58" (mask "t(4,8,1)")
$ midiOn "^90" (ply 2)
$ midiOff "^57" (mask "t(4,8,1)")
$ midiOn "^89" (ply 2)
$ note ("[ef f gs ef f gs ef f]*2"
- 12
+ "<0!4 12!4>"
)
# "FMRhodes1"
# squizbus 51 (range 0 4 "^54")
# squizbus 51 (range 0 4 "^33")
# modIndex "<2 4 8 16>"
# gain 1.5
d7 $ gF3 $ gM3
......@@ -72,11 +74,11 @@ d12 $ gF3 $ gM3
d8 $ gF1 $ gM2 -- DRUM N BASS AS A SERVICE
$ chop 8
$ midiOn "^60" (mask "t(8,16,1)" . chop 16)
$ midiOn "^56" (
$ midiOn "^36" (
-- slice 8 "0 <1 <~ 1*2>> 2 3? 4 5? <6 6?> <7 7*2>" .
loopAt 2 .
(# "jungle_breaks:63"))
$ midiOn "^36" ( -- Bouton Nassim <3
$ midiOn "^56" ( -- Bouton Nassim <3
(loopAt 2) . (# "jungle_breaks:45")
)
$ loopAt 1 $ "breaks165"
......@@ -109,7 +111,9 @@ d8 $ loopAt 4 $ "break:5" # cut 8
d3 $ gF1 $ gM2
$ (0.125 ~>)
$ slow 2
$ midiOn "^76" (ply "1 <2!3 4>")
$ midiOn "^43" (ply "1 <2!3 4>")
-- FIXME(#94) d3 drives more controls than the grid gives it (BT3 only — BL1-3 are the family mutes). ^44 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^44 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 d3's own control with gSel.
-- FIXME(#94) d3 drives more controls than the grid gives it (BT3 only — BL1-3 are the family mutes). ^44 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^44 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 d3's own control with gSel.
$ midiOn "^44" (
(# delay "<0 0.2 0.3 0.5 0.6 0.7 0.8 0.9>") .
(# delayt "s") .
......@@ -137,8 +141,8 @@ d8 $ gF1 $ gM2 -- Break discret face à une telle idole
-- $ midiOn "^60" (mask "t(4,8,<1!3 0>)" . chop 8)
-- $ midiOn "^36" (id . (loopAt 0.5 . (# "jungle_breaks:130")))
$ midiOn "^60" (mask "t(16,32)" . ply "2 2 <4 8 16 16> 2")
$ midiOn "^36" (loopAt 0.5 . (# n 45) . (|* gain 1.1)) -- Orleanaise
$ midiOn "^56" (loopAt 2 . (# n 12))
$ midiOn "^56" (loopAt 0.5 . (# n 45) . (|* gain 1.1)) -- Orleanaise
$ midiOn "^36" (loopAt 2 . (# n 12))
$ chop 16
$ loopAt 4
$ "jungle_breaks:12" # cut 8
......@@ -151,7 +155,7 @@ d4 $ gF2 $ gM3
# room 0.2
# octersub 0.5
# sz 0.8
# crushbus 41 (range 15 4 "^53")
# crushbus 41 (range 15 4 "^32")
-- d5 $ n "e fs g a b g a e" # s "FMRhodes1"
-- d3 $ n "d cs c b a g fs e" # s "superpiano"
d9 $ gF3 $ gM3 -- CHOEUR INTRO TODO ALIGNER MELODIQUEMENT
......@@ -161,8 +165,8 @@ d9 $ gF3 $ gM3 -- CHOEUR INTRO TODO ALIGNER MELODIQUEMENT
# note "-2"
d6 $ gF1 $ gM3
$ midiOn "^43" (<|"~ s ~ s*<1 2>")
$ midiOff "^43" (<| "~ s")
$ midiOn "^58" (<|"~ s ~ s*<1 2>")
$ midiOff "^58" (<| "~ s")
$ "clap:2"
# hpf 2500
# room (slow 16 $ range 0 0.8 saw)
......@@ -182,16 +186,16 @@ d4 $ gF2 $ gM3 -- BASS <3
# cut 4
# gain 1.1
# room 0.3 # sz 0.3 # dry 1.3
# crushbus 41 (range 16 4 "^53")
# octerbus 42 (range 0 0.93 "^33")
# crushbus 41 (range 16 4 "^32")
# octerbus 42 (range 0 0.93 "^52")
d5 $ gF3 $ gM3 -- Rain piano <3
$ midiOn "^58" ((>| n "5/2"))
$ midiOn "^57" ((>| n "5/2"))
$ slow 4 $ ply "4 . 2 0" -- Slowly, loop 4 times each
$ n "<5 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"
# cut 5
-- # octersubbus 51 (range 0 2 "^18")
-- # octerbus 52 "^34"
# crushbus 53 (range 16 5 "^54")
# crushbus 53 (range 16 5 "^33")
# room 0.3 # sz 0.4
# gain (slow 32 $ range 0.6 1.2 saw)
d7 $ gF2 $ gM3
......
......@@ -4,8 +4,8 @@ setcps (80/60/4)
let modIndex = pF "modIndex"
d1 $ gF1 $ gM1
-- $ midiOn "^30" (# "hardkick_rha")
$ midiOn "^42" (fast 2 . struct "t*<1!4 2 1!3> t t*<1!6 2 1> t*<1!7 2>")
$ midiOff "^42" (struct "t . ~ t*<1!3 2> ~ <~!3 t*<2 [2 1] [4 2] [2 4]>>")
$ midiOn "^41" (fast 2 . struct "t*<1!4 2 1!3> t t*<1!6 2 1> t*<1!7 2>")
$ midiOff "^41" (struct "t . ~ t*<1!3 2> ~ <~!3 t*<2 [2 1] [4 2] [2 4]>>")
$ stack [
"kick" # lpf 10000 # cut 1,
"rumble" |* gain 1.3
......@@ -16,8 +16,8 @@ d1 $ gF1 $ gM1
# "[techno:1,jazz]"
# gain 1.4
d2 $ gF1 $ gM2
$ midiOn "^43" (<|"~ s ~ s*<1 2>")
$ midiOff "^43" (<| "~ s")
$ midiOn "^42" (<|"~ s ~ s*<1 2>")
$ midiOff "^42" (<| "~ s")
$ "[vec1_snare:5]"
# note "<-0!12 -2 -2 -3 0>"
# gain 1.3
......@@ -31,25 +31,27 @@ d3
d6 $ gF1 $ gM3
$ "~ clap:2"
d4 $ gF2 $ gM3
$ midiOn "^89" (ply 4)
$ midiOn "^76" (ply 4)
$ chop 4
$ loopAt 4
$ "bass_commodore:8"
# cut 4
# room 0.3
# crushbus 41 (range 16 2.5 "^53")
# octersubbus 42 (range 0 4 "^33")
# tremdpbus 43 "^17"
# tremrbus 44 (range 0.2 8 "^18")
# crushbus 41 (range 16 2.5 "^32")
# octersubbus 42 (range 0 4 "^52")
-- 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.
-- # tremdpbus 43 "^17"
-- FIXME(#54) d4 drives more controls than the grid gives it (B4 + C4). ^18 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.
-- # tremrbus 44 (range 0.2 8 "^18")
d5 $ gF3 $ gM3 -- YOUR VALUES ARE WRONG
$ midiOff "^58" (mask "t(4,8,1)")
$ midiOn "^90" (ply 2)
$ midiOff "^57" (mask "t(4,8,1)")
$ midiOn "^89" (ply 2)
$ note ("[c ef f c ef f c <ef <gs c5> <gs b5> ef>]*2"
- 12
+ "<0!4 12!4>"
)
# "FMRhodes1"
# squizbus 51 (range 0 4 "^54")
# squizbus 51 (range 0 4 "^33")
# modIndex "<2 4 8 16>"
# gain 1.5
d7 $ gF3 $ gM3
......@@ -71,10 +73,10 @@ d12 $ gF3 $ gM3
d8 $ gF1 $ gM2 -- DRUM N BASS AS A SERVICE
$ chop 8
$ midiOn "^60" (mask "t(8,16,1)" . chop 16)
$ midiOn "^56" (
$ midiOn "^36" (
slice 8 "0 <1 <~ 1*2>> 2 3? 4 5? <6 6?> <7 7*2>"
. loopAt 2 . (# "jungle_breaks:63"))
$ midiOn "^36" ( -- Bouton Nassim <3
$ midiOn "^56" ( -- Bouton Nassim <3
(loopAt 2) . (# "jungle_breaks:45")
)
$ loopAt 0.5 $ "breaks165"
......@@ -107,7 +109,9 @@ d8 $ loopAt 4 $ "break:5" # cut 8
d3 $ gF1 $ gM2
$ (0.125 ~>)
$ slow 2
$ midiOn "^76" (ply "1 <2!3 4>")
$ midiOn "^43" (ply "1 <2!3 4>")
-- FIXME(#94) d3 drives more controls than the grid gives it (BT3 only — BL1-3 are the family mutes). ^44 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^44 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 d3's own control with gSel.
-- FIXME(#94) d3 drives more controls than the grid gives it (BT3 only — BL1-3 are the family mutes). ^44 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^44 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 d3's own control with gSel.
$ midiOn "^44" (
(# delay "<0 0.2 0.3 0.5 0.6 0.7 0.8 0.9>") .
(# delayt "s") .
......@@ -135,8 +139,8 @@ d8 $ gF1 $ gM2 -- Break discret face à une telle idole
-- $ midiOn "^60" (mask "t(4,8,<1!3 0>)" . chop 8)
-- $ midiOn "^36" (id . (loopAt 0.5 . (# "jungle_breaks:130")))
$ midiOn "^60" (mask "t(16,32)" . ply "2 2 <4 8 16 16> 2")
$ midiOn "^36" (loopAt 0.5 . (# n 45) . (|* gain 1.1)) -- Orleanaise
$ midiOn "^56" (loopAt 2 . (# n 12))
$ midiOn "^56" (loopAt 0.5 . (# n 45) . (|* gain 1.1)) -- Orleanaise
$ midiOn "^36" (loopAt 2 . (# n 12))
$ chop 16
$ loopAt 4
$ "jungle_breaks:12" # cut 8
......@@ -149,7 +153,7 @@ d4 $ gF2 $ gM3
# room 0.2
# octersub 0.5
# sz 0.8
# crushbus 41 (range 15 4 "^53")
# crushbus 41 (range 15 4 "^32")
-- d5 $ n "e fs g a b g a e" # s "FMRhodes1"
-- d3 $ n "d cs c b a g fs e" # s "superpiano"
d9 $ gF3 $ gM3 -- CHOEUR INTRO TODO ALIGNER MELODIQUEMENT
......@@ -159,8 +163,8 @@ d9 $ gF3 $ gM3 -- CHOEUR INTRO TODO ALIGNER MELODIQUEMENT
# note "-2"
d6 $ gF1 $ gM3
$ midiOn "^43" (<|"~ s ~ s*<1 2>")
$ midiOff "^43" (<| "~ s")
$ midiOn "^58" (<|"~ s ~ s*<1 2>")
$ midiOff "^58" (<| "~ s")
$ "clap:2"
# hpf 2500
# room (slow 16 $ range 0 0.8 saw)
......@@ -180,16 +184,16 @@ d4 $ gF2 $ gM3 -- BASS <3
# cut 4
# gain 1.1
# room 0.3 # sz 0.3 # dry 1.3
# crushbus 41 (range 16 4 "^53")
# octerbus 42 (range 0 0.93 "^33")
# crushbus 41 (range 16 4 "^32")
# octerbus 42 (range 0 0.93 "^52")
d5 $ gF3 $ gM3 -- Rain piano <3
$ midiOn "^58" ((>| n "5/2"))
$ midiOn "^57" ((>| n "5/2"))
$ slow 4 $ ply "4 . 2 0" -- Slowly, loop 4 times each
$ n "<5 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"
# cut 5
-- # octersubbus 51 (range 0 2 "^18")
-- # octerbus 52 "^34"
# crushbus 53 (range 16 5 "^54")
# crushbus 53 (range 16 5 "^33")
# room 0.3 # sz 0.4
# gain (slow 32 $ range 0.6 1.2 saw)
d7 $ gF2 $ gM3
......
......@@ -4,8 +4,8 @@ resetCycles
setcps (135/60/4)
let modIndex = pF "modIndex"
d1 $ gM1 $ gF1 -- Kick solide
$ midiOn "^42" (struct "t t*<1!3 <1!4 2!4>> t <t <t!4 [~ t]!4> t t*2>")
$ midiOff "^42" (<| "k . ~ k ~ <~!3 k*[4 1]>")
$ midiOn "^41" (struct "t t*<1!3 <1!4 2!4>> t <t <t!4 [~ t]!4> t t*2>")
$ midiOff "^41" (<| "k . ~ k ~ <~!3 k*[4 1]>")
$ stack [
"kick" # cut 11 # gain 1.2 # lpf 10000 # delaybus 11 0,
"rumble" # cut 12 # gain 2 # lpf 200 # delaybus 12 0.25 # delayt "q" # delayfb 0
......@@ -19,8 +19,8 @@ d1 $ gM1 $ gF1 -- Kick solide
# gain 1
-- # cut 1
d2 $ gF1 $ gM2 -- Basic clap ma gueule
$ midiOn "^43" (<| "~ <~!8 cp!8> . cp*<1!3 2> <~!8 [~ cp]!8>" )
$ midiOff "^43" (<| "~ <cp!3 <~ [cp*<2 4>]>>")
$ midiOn "^42" (<| "~ <~!8 cp!8> . cp*<1!3 2> <~!8 [~ cp]!8>" )
$ midiOff "^42" (<| "~ <cp!3 <~ [cp*<2 4>]>>")
$ "cp"
# note "0!3 -1"
# lpf 4000
......@@ -33,7 +33,7 @@ d3 $ gF1 $ gM2
# "rampleP3:19"
# delay 0.5 # delayt 0.25 # delayfb 0.2
# pan 0.7 # cut 3
# legato (range 0.2 0.8 "^52")
# legato (range 0.2 0.8 "^31")
d10 $ gF3 -- Self-destruction riser
$ (stack [
n "<<55!8 ~!54> ~!3>"
......@@ -58,35 +58,36 @@ d9 $ gF3
# bandf 400
# gain 1.3
d4 $ gF2 $ gM3 -- V2 PLN's "Je peux ptet faire une basse acide moi meme"
$ midiOff "^57" (
$ midiOff "^44" (
-- (|+ note "<0 12>") .
mask "<[t f]!0 t(<1!3 [1 4]>,4)!0 t([<8!3 <4 16>> <8!3 16>],16)>")
$ stack [
n "<30!16 31!16>" # "vec2_synth_acid" # gain (range 1.1 0 ("^53" + "^33")),
"vec1_acid:40" # hpf 200 # gain (range 0.6 1.1 "^53"),
"vec1_acid:39" # hpf 200 # gain (range 0 1.1 "^33"), -- TODO BONUS ACID
n "<30!16 31!16>" # "vec2_synth_acid" # gain (range 1.1 0 ("^32" + "^52")),
"vec1_acid:40" # hpf 200 # gain (range 0.6 1.1 "^32"),
"vec1_acid:39" # hpf 200 # gain (range 0 1.1 "^52"), -- TODO BONUS ACID
-- # octer 1.1
-- ,
""
]
# crushbus 41 (range 16 1 "^53")
# crushbus 41 (range 16 1 "^32")
-- # legato 1
# legato (range 0.39 0.7 (1 - "^17"))
>| note ("[b d6 b cs6 d6 b cs6 b]*2"
- "<0!32 12!32>" -- Alternance
-- + "<0!24 7!8 0!48 1!16>" -- Note variation tension???
)
-- # att 0.1 # sus 0.2 # rel 4
-- # 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.
-- # legato (range 0.39 0.7 (1 - "^17"))
-- >| note ("[b d6 b cs6 d6 b cs6 b]*2"
-- - "<0!32 12!32>" -- Alternance
-- -- + "<0!24 7!8 0!48 1!16>" -- Note variation tension???
-- )
-- -- # att 0.1 # sus 0.2 # rel 4
-- -- # cut 4
# octersub 2
-- # octerbus 41 (range 0 1 "^17")
-- # crushbus 42 (range 16 4.2 "^53")
d5 $ gF3 $ gM3 -- Piano lead acidule
$ fix (# bandf 800) "FMRhodes1"
-- $ fix (# bandf 1050) "FMRhodes2"
$ midiOn "^90" (struct "t(<8 <8 16>>,64)")
$ midiOn "^58" ((stutWith 4 0.125 (|- note 12)) . (|+ note 12))
$ superimpose (# modIndex (range 0 16 "^34"))
$ midiOn "^57" (struct "t(<8 <8 16>>,64)")
$ midiOn "^89" ((stutWith 4 0.125 (|- note 12)) . (|+ note 12))
$ superimpose (# modIndex (range 0 16 "^33"))
$ note ("b ~ ~ b ~ ~ <d!7 e6> <~ d>"
+ "[0,<~!4 7!4>]"
-- + "[0,12]"
......@@ -101,7 +102,7 @@ d7 $ gF2 $ gM3 -- Caring bass
$ midiOn "^91" ((struct "<[t t . t*[4 <4 8>]]!3 t*[<8 4> 8]>") . (# rel 0.5))
$ superimpose (
(# cut 71) .
(# crushbus 71 (range 10 3.5 "^55"))
(# crushbus 71 (range 10 3.5 "^35"))
)
$ note (
"<b5!3 <g d>>@7 <c6 c6 cs6 a6>" -- This is caring
......@@ -119,8 +120,8 @@ d8 $ gF1 $ gM2
. (|* gain 0.8)
)
$ midiOff ("^60" + "^92") (mask "t(4,8,1)" . chop 16)
$ midiOn "^56" (# "jungle_breaks:40")
$ midiOn ("^36" - "^92") (chop 8 . loopAt 4 . (# "trance_loops:4") . (|* gain 1.1))
$ midiOn "^36" (# "jungle_breaks:40")
$ midiOn ("^56" - "^92") (chop 8 . loopAt 4 . (# "trance_loops:4") . (|* gain 1.1))
$ chop 8
$ loopAt 2
$ "jungle_breaks:45"
......
......@@ -3,27 +3,27 @@ setcps (80/60/4)
-- let gMask = (midiOn "^41" (mask "t . <f t f <f t>> <t f f <t f>>"))
d1 $ gF1 $ gM1
$ fast 2
$ midiOn "^42" (<| "k*4")
$ midiOff "^42" (<| "k . ~!3 <~!3 k>")
$ midiOn "^41" (<| "k*4")
$ midiOff "^41" (<| "k . ~!3 <~!3 k>")
$ "[kick:5,clubkick]"
# cut
1
d2 $ gF1 $ gM2
$ fast 2
$ midiOn "^43" (<|"~ s ~ s*<1 2>" )
$ midiOff "^43" (<| "~ s/2")
$ midiOn "^42" (<|"~ s ~ s*<1 2>" )
$ midiOff "^42" (<| "~ s/2")
$ "rampleM9:4"
# gain 0.9
d3 $ gF1 $ gM2
$ fast 2
$ midiOn "^76" (fast 2)
$ midiOn "^43" (fast 2)
$ superimpose ((# "hh") . (# cut 31) . (# pan 0.8))
$ "~ d ~ d ~ d ~ d*<1 <2 [4 2]>>"
# "rampleA4:9"
# cut 3
# pan 0.2
d4 $ gF2 $ gM3
$ midiOn "^89" (ply "2 4")
$ midiOn "^76" (ply "2 4")
$ note ("[c4@2 c5 ~ [bf4 c5]@2 ~ bf4 c5 bf4 g4 fs4 f4@4]" - 12)
# "bassWarsaw"
# cut 4
......@@ -31,7 +31,7 @@ d4 $ gF2 $ gM3
# octersub 0.8
# gain 0.8
# pan 0.6
# crushbus 41 (range 16 2.5 "^53")
# crushbus 41 (range 16 2.5 "^32")
d9 $ "90s_matrix:0/4"
# cut 9
-- # room 0.4
......@@ -42,15 +42,15 @@ d5 $ gF3 $ gM3
$ whenmod 8 7 (>| note "c@2 c ef@2 ef f g")
$ fast 4 $ note ("[c <c!3 f> c <g fs ef b4>]")
# "FMRhodes1"
# modIndex (range 0 64 "^54")
# modIndex (range 0 64 "^33")
# pan 0.2
# gain 1.2
# room 0.2 # sz 0.9
# cut 5
|- note 12
d8 $ gF1 $ gM2
$ midiOn "^60" (ply 2)
$ midiOn "^92" (ply 2)
$ midiOn "^60" (ply 2)
$ chop 16
$ midiOn "^36" (loopAt 4 . (# "jungle_breaks:24") . (|* gain 1.1)) -- Legerete orleanaise
$ midiOn "^56" ((# "jungle_breaks:45")) -- Legerete orleanaise
......
do
setcps (128/60/4)
d1 $ gF1 $ gM1
$ midiOn "^42" (<| "k k k <k <k*2 [<~!3 k> k*<1 2>]>>")
$ midiOff "^42" (<| "k . ~ k")
$ midiOn "^41" (<| "k k k <k <k*2 [<~!3 k> k*<1 2>]>>")
$ midiOff "^41" (<| "k . ~ k")
$ "kick:5"
# gain 1.8
d2 $ gF1 $ gM2
$ "~ s ~ [s*<1 2> <~ s*<2 [4 2]>>]"
# "vec1_snare" # gain 1.4
d3 $ gF1 $ gM2
$ midiOn "^44" (sometimes rev . stut 3 0.8 "s")
$ midiOn "^43" (sometimes rev . stut 3 0.8 "s")
$ "~ h ~ h ~ h ~ h"
# "ho:2" # gain 1.1 # cut 3
d4 $ gF2 $ gM3 -- LA ACID BASS DOUBLE AMOUR
$ midiOn "^57" (superimpose (
$ midiOn "^76" (superimpose (
(0.25 ~>) . (|+ note "[7 12 7 <7 12>]")
. (# pan 0.7)
. (# squizbus 41 (range 0 4 "^53"))
. (# squizbus 41 (range 0 4 "^32"))
. (|* gain 1.3)
))
$ note (
......@@ -26,7 +26,7 @@ d4 $ gF2 $ gM3 -- LA ACID BASS DOUBLE AMOUR
# "vec1_acid:0" |+ note 3 # legato 0.7
# room 0.3
-- # cut 4
# octersubbus 42 (range 0 2.5 "^33")
# octersubbus 42 (range 0 2.5 "^52")
-- |+ note 3
d9 $ gF3 $ gM3
$ sometimesBy "^18*4" (ply 4)
......
......@@ -6,14 +6,14 @@ d1 $ gM1 $ gF1 -- Kick solide
-- $ fast 2
$ fix ((|* gain 0.9) . (# lpf 1000)) "jazz"
$ fix ((# att 0.02) . (# rel 0.5) . (# lpf 5000)) "kick:4"
$ midiOn "^42" (struct "t t t t*<1!6 2 2>")
$ midiOff "^42" (<| "k . ~ <~!3 k> ~ ~")
$ midiOn "^41" (struct "t t t t*<1!6 2 2>")
$ midiOff "^41" (<| "k . ~ <~!3 k> ~ ~")
$ "[jazz,kick:4]"
d2
$ gM2 $ gF1 -- snare contretemps variable
$ fix ((|* gain 0.8) . (# legato 0.05)) "cp"
$ midiOn "^43" (<| "~ cp ~ cp*<1 1 2 <1 2>>")
$ midiOff "^43" (<| "~ cp")
$ midiOn "^42" (<| "~ cp ~ cp*<1 1 2 <1 2>>")
$ midiOff "^42" (<| "~ cp")
$ "[cp,snare:24]"
# pan 0.65
# legato 0.22
......@@ -24,14 +24,15 @@ d3 $ gM2 $ gF1
# hpf 7000
-- # midiG' "^80" 0 1.5
d4 $ gF2
$ midiOn "^89" (ply "<2 4> <2 4 4 8>")
$ midiOn "^76" (ply "<2 4> <2 4 4 8>")
$ arp "up"
$ note ("<g f ef d>" + "[0 12 0 12*<1 2>]")
# "giorgio_syn:23"
# room 0.5 # sz 0.6
# crushbus 42 (range 16 1.4 "^53")
# relbus 43 (range 2 0.02 "^33")
# octerbus 44 (range 0 1.4 "^17")
# crushbus 42 (range 16 1.4 "^32")
# relbus 43 (range 2 0.02 "^52")
-- 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.
-- # octerbus 44 (range 0 1.4 "^17")
# att 0.22
# gain 0.8
-- # cut 4
......@@ -39,9 +40,10 @@ d5 $ gF3 $ gM3
$ note ("<g d ef d>" + "0(3,8)")
# "trance_blips:12"
# room 0.5 # sz 0.6
# crushbus 52 (range 12 1.4 "^54")
# relbus 53 (range 2 0.02 "^34")
# octerbus 54 (range 0 1.4 "^18")
# crushbus 52 (range 12 1.4 "^33")
# relbus 53 (range 2 0.02 "^53")
-- FIXME(#54) d5 drives more controls than the grid gives it (B5 + C5). ^18 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.
-- # octerbus 54 (range 0 1.4 "^18")
# att 0.22
# cut 5
d6 $ gF2
......@@ -64,11 +66,11 @@ d7
-- # gain 0.8
d8 $ gF1 $ gM2
$ midiOn "^92" (ply "1 <2!3 4>")
$ midiOff ("^56" + "^36") (mask "t(4,8,1)")
$ midiOff ("^36" + "^56") (mask "t(4,8,1)")
$ chop 16
$ loopAt 2
$ midiOn "^36" ((|* gain 0.7) .(# "jungle_breaks:42"))
$ midiOn "^56" (# "jungle_breaks:43")
$ midiOn "^56" ((|* gain 0.7) .(# "jungle_breaks:42"))
$ midiOn "^36" (# "jungle_breaks:43")
$ "jungle_breaks:45"
# cut 8
-- # midiG' "^84" 0 1.5
......@@ -94,7 +96,8 @@ d4 -- Basse convaincante
$ gM3 $ gF2
$ whenmod 64 32 (# drybus 41 (slow 32 $ range 1.9 1 saw))
-- $ midiOn "^89" (ply "<[4@5 2 4 2] 1>")
$ midiOn "^57" (segment "<4 [4 <8 8 16 16>]>")
-- $ midiOn "^44" (segment "<4 [4 <8 8 16 16>]>")
-- FIXME(#54) d4 drives more controls than the grid gives it (B4 + C4). ^17 now belongs to another orbit, so this step STILL FIRES ACROSS COLUMNS — turning ^17 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 d4's own control with gSel.
$ someCyclesBy (1 - "^17") (struct "<t [t t]>")
$ rarely (ply "1@5 1 <1!3 2> [<1 2> <1 1 1 2>]")
$ note "<c3 c3 c3 c3 gs2 gs2 b2 b2>@5 ef3 d3 <ef3!4 c3!3 b2>"
......@@ -104,7 +107,7 @@ d4 -- Basse convaincante
# pan 0.4
|* gain ("1@5 0.95 0.98 0.95" * 1.1 )
d5 $ gF3 -- Appel oiseau joyeux oiseau joyaux
$ midiOn "^58" ( -- Oiseau de nuit
$ midiOn "^57" ( -- Oiseau de nuit
rev . (|+ note "<<0 0 [0 -7] [0 -7]>!3 [0!3 -12]>")
)
$ mask "<[[t <f!4 t!4>] <f!8 t!8>]!8 t!24 t!96>"
......@@ -114,8 +117,8 @@ d5 $ gF3 -- Appel oiseau joyeux oiseau joyaux
-- g c ef g / gsc ef f / gs c g f / gs c f ef
$ note ("<[<g4 <g4!3 gs4> gs4 gs4>@3 <c!13 gs4 c c>@2 <ef!14 g f>@3] <g f <f gs f f> <g g g ef>>>")
# "FMRhodes1"
# modIndex (range 0 50 "^54")
# delaybus 51 (range 0 0.8 "^34")
# modIndex (range 0 50 "^33")
# delaybus 51 (range 0 0.8 "^53")
# delayt "<h>"
# delayfb 0.25
# pan 0.7
......
......@@ -11,8 +11,8 @@ d1 $ gM1 $ gF1 -- Kick solide
. (# legato 0.25)
. (# lpf 400) -- Low-pass show
)
$ midiOn "^42" (struct "t t*<1!3 <1!4 2!4>> t <t <t!4 [~ t]!4> t t*2>")
$ midiOff "^42" (<| "k . ~ k ~ <~!3 k*[4 1]>")
$ midiOn "^41" (struct "t t*<1!3 <1!4 2!4>> t <t <t!4 [~ t]!4> t t*2>")
$ midiOff "^41" (<| "k . ~ k ~ <~!3 k*[4 1]>")
$ "[techno:1,jazz]"
-- $ "[hardkick_rha:1]"
# lpf 400
......@@ -23,17 +23,17 @@ d2 $ gF1 $ gM2 $ "~ . s*<1!3 2 1 2 1 2> ~"
# note "-14"
# room 0.14 # dry 1 # gain 1.7
d3 $ gF1 $ gM2
$ midiOn "^44" (<| "~ h ~ h ~ h*<1 2 2 1> ~ h*<1 1 2 <2 4>>")
$ midiOff "^44" (<| "h h ~!5 h*<1 2>" )
$ midiOn "^43" (<| "~ h ~ h ~ h*<1 2 2 1> ~ h*<1 1 2 <2 4>>")
$ midiOff "^43" (<| "h h ~!5 h*<1 2>" )
$ "h2ogmhh"
# delay 0.4 # delayt 0.125 # delayfb 0.2
# gain 1.2
d4 $ gF2 $ gM3 -- TODO REWORK
$ midiOn "^57" (struct "t([16@3 <16!3 8 16 16 8 4>],8)")
$ midiOff "^57" (|+| note"0([5 <2!16 <3!16 5!16>>],8,1)")
$ midiOn "^44" (struct "t([16@3 <16!3 8 16 16 8 4>],8)")
$ midiOff "^44" (|+| note"0([5 <2!16 <3!16 5!16>>],8,1)")
$ superimpose (
(# cut 41)
. (# crushbus 41 (range 16 1.5 "^53"))
. (# crushbus 41 (range 16 1.5 "^32"))
. (# hpf 200)
. (# lpf 10000)
)
......@@ -44,9 +44,10 @@ d4 $ gF2 $ gM3 -- TODO REWORK
-- + 12 -- Octave: -1
)
# "giorgio_syn:6"
# octerbus 42 (range 0.25 1.2 "^33")
# octerbus 42 (range 0.25 1.2 "^52")
# cut 4
# scram (range 0 0.72 "^17")
-- 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
$ note ((scale "phrygian" "0 2@2 3@3 <2!3 5 6 6 7 [9 9]>@2")
- 1 -- Fondamentale: re
......@@ -55,7 +56,7 @@ d7 $ gF3 $ gM3 -- Apollo call
# "FMRhodes1"
# gain 2
d5 $ gF3 $ gM3
$ midiOn "^58" (stut 4 0.9 "e")
$ midiOn "^89" (stut 4 0.9 "e")
$ note (
-- "<b <b fs b <d d6 d6>>@7]>"
"<b [~ . bf ~ ~ <~ bf g g>]>"
......
This diff is collapsed. Click to expand it.
This diff is collapsed. Click to expand it.
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