223 Commits

Author SHA1 Message Date
L'électron rare 7f44ee527c feat: step editor and preset naming
CI build oscope-of / build-check (push) Has been cancelled
2026-06-27 23:58:57 +02:00
L'électron rare 82ac0181a3 feat: selectable melody and rhythm sequencers
CI build oscope-of / build-check (push) Has been cancelled
Add melseq (1 Pdef, 8 melodic sequences, /seq/melody) and rhythmseq
(3 sub-Pdefs rsk/rss/rsh, 8 16-step patterns, /seq/rhythm) to the
launchpad OSC bank.  ~lpArm special-cases "rhythmseq" to arm/disarm
all three voices together.  Web surface gets a Séquenceurs section
with arm pads, selector rows (.sel highlight), and vol sliders.
2026-06-27 23:42:08 +02:00
L'électron rare 73432a0c96 feat: launchpad sync, vol faders, more patterns
CI build oscope-of / build-check (push) Has been cancelled
- ~lpClock helper: use concert TempoClock when concert is running,
  fall back to ~lp[\clock] otherwise; /launch/tempo syncs both clocks
- ~lpVol per-name volume dict (0..1.5); /launch/vol OSCdef; all 10
  existing Pdef \amp wrapped in Pfunc { base * ~lpVol.(name) }
- 6 new SynthDefs + Pdefs: lp_ride, lp_rim, lp_tom (drums),
  lp_reese (Reese bass, Env.asr), lp_bells (additive FM),
  lp_sweep (noise riser, Env.asr)
- UI: 16 pat-cells each with pad button + vol range slider wired
  to /launch/vol; CSS .pat-cell flex column layout
2026-06-27 23:22:57 +02:00
L'électron rare 3ec306fdb2 feat(sound): harmony and fx control OSC
Add 10 OSCdefs to launchpad.scd: /control/harmony/{root,scale,octave,
phrase} mutate ~ccHarmony; /control/fx/{filter,stutter,crash,kick,swell,
breakdown} dispatch to ~ccMaster / ~ccFire. All nil-guarded; scale name
validated against ~ccScales. P:0 B:0.
2026-06-27 22:42:00 +02:00
L'électron rare e23b97f048 feat(sound): launchpad bass melody chord patterns
Add lp_sub/acid/pluck/pad SynthDefs plus lpNote helper and six
pitched Pdefs (sub, acid, arp, lead, stab, pad) armable by name
via the existing /launch OSCdef.
2026-06-27 22:39:52 +02:00
L'électron rare abfe950c25 feat(sound): launchpad drum patterns
Add launchpad.scd with 4 drum SynthDefs (kick/hat/clap/perc) and an
OSC-armable Pdef bank controlled via /launch, /launch/tempo,
/launch/clear. Patterns run on a dedicated TempoClock (~lp[\clock]).
Load it last in boot.scd, after concert_gestures.scd.
2026-06-27 22:35:16 +02:00
L'électron rare 3d33719f2b feat(sound): trance, psytrance, punkcore morceaux
CI build oscope-of / build-check (push) Has been cancelled
Adds morceaux 12-14 to the concert setlist. 12_trance: supersaw
pad (7-saw chord, gated) + rolling 16th bass + plucky lead arp +
offbeat hat @ 138 BPM. 13_psytrance: interlocking kick+bass (bass
on the 3 off-kick 16ths) + squelchy acid lead + psy zaps @ 145
BPM. 14_punkcore: power chords root+5th (8th downstroke) + d-beat
drums + lead riff @ 156 BPM. All use ~ccNote, ~ccHarmony, wrist
arm mappings, nil-guarded pose reads. boot.scd updated. 3/3 pass
headless tests.
2026-06-27 22:23:26 +02:00
L'électron rare 3b3b1fe51b feat: morceau button; drop gesture + auto-chain
CI build oscope-of / build-check (push) Has been cancelled
2026-06-27 21:37:37 +02:00
L'électron rare c7f98c24af feat: spacebar advances concert morceau 2026-06-27 21:14:03 +02:00
L'électron rare 24613cd809 feat(sound): trance, industrial, detroit morceaux
CI build oscope-of / build-check (push) Has been cancelled
Add 3 new concert morceaux (09-11) to the data_only setlist.
09_trance_pluck: plucky 16th arp, arm-height filter, speed density.
10_industrial: distorted stab + rumble, speed drive, ropen noise.
11_detroit: warm detuned pad triad, string stab on rspeed, hat.
All three headless-tested: 20/20 assertions OK, zero SC errors.
2026-06-27 20:36:45 +02:00
L'électron rare 0d467da088 feat(sound): random morceau chaining + auto-chain
CI build oscope-of / build-check (push) Has been cancelled
2026-06-27 20:13:30 +02:00
L'électron rare c3fdb11e65 fix(sound): filter sweep + edge-trigger gestures
CI build oscope-of / build-check (push) Has been cancelled
2026-06-27 20:09:22 +02:00
L'électron rare cdee717d51 fix(sound): squat empty-skel + stop restore
CI build oscope-of / build-check (push) Has been cancelled
2026-06-27 20:01:20 +02:00
L'électron rare 031bb16e0f feat(sound): melodic body gestures
Add armRaise, headUp, headDown to family:melody in concert_gestures.scd.
armRaise cycles ccHarmony phrase 0-3; headUp/Down toggle octave 1/0.
Nil-guard applied: (s[\joint] ? ())[\coord] everywhere.
2026-06-27 19:47:22 +02:00
L'électron rare abedc53a4c feat(sound): harmonic body gestures
Add 5 harmony-family gestures (stepR/L, leanFwd/Back, tilt) that
mutate ~ccHarmony root/pad/scale. Also fix latent skel nil-deref in
existing FX gestures (stomp, squat, spin, tpose): `(s[\joint]?())[\y]`
pattern prevents doesNotUnderstand on empty skel Event.
2026-06-27 19:42:04 +02:00
L'électron rare 245edacd4f feat(sound): morceaux read ccHarmony for pitch
The 6 pitched concert morceaux now source their notes from the
global ~ccNote / ~ccHarmony instead of baked roots and scale arrays,
so the body's harmonic conducting drives their pitch. Each morceau
keeps its own rhythm, structure, SynthDefs and degree sequence; only
the pitch source changes. Acid line/storm gain a 4-entry phrase table
selected by ~ccHarmony[phrase]; hypno drift's drone base cutoff tracks
~ccHarmony[pad] brightness.
2026-06-27 19:30:50 +02:00
L'électron rare 337f791b7a feat(sound): global harmony state ccHarmony
Add ~ccScales Event, ~ccHarmony idempotent init, and ~ccNote
quantizer (degree + octave offset → midinote). All three tests pass.
2026-06-27 19:16:45 +02:00
L'électron rare a9ce3d58f5 feat(sound): fx dramatic body gestures
Register 5 body-gesture detectors (jump/stomp/squat/spin/tpose) in
sound_algo/data_only/concert_gestures.scd wired to ccFire/ccMaster FX
sinks. boot.scd loads the file after the morceaux block (step 6e).
2026-06-27 19:13:58 +02:00
L'électron rare 1660640d48 feat(sound): concert master event-FX layer
Add concert_fx.scd providing ~ccMaster (filterTo/dip/stutterOn),
one-shot event synths cc_ev_crash/kick/swell, and ~ccFire helper.
Loaded in boot.scd after engine.scd so ~doFilter/~doMaster exist.
2026-06-27 19:10:27 +02:00
L'électron rare 114ebbd99e feat(sound): ccGesture trigger framework 2026-06-27 19:05:41 +02:00
L'électron rare 6b6be7bff2 feat(viz): skeleton joints to SC via pose/skel
Add /pose/skel OSC route emitting nose, shoulders, hips,
knees and ankles (18 floats) from _emit_person. Add
\poseSkel OSCdef in data_feeds.scd storing the 9 joint
positions per pid; cleanup on \poseLeave.
2026-06-27 18:59:49 +02:00
L'électron rare 4285d160c3 feat(sound): wrist-backed hands for morceaux
CI build oscope-of / build-check (push) Has been cancelled
At full-body concert distance MediaPipe cannot detect the hands
(/pose/hands all zero), muting every morceau hand mapping. ~ccPose now
fills pose[hands] from the body wrists (~poseWrist) when the hands are
not live, shaped exactly like ~handFeat (wrist height/x, arm spread ->
openness, per-tick wrist motion -> speed). All 8 morceaux are driven by
the arms at distance with NO per-morceau change (they read pose[hands]).
Verified headless.
2026-06-27 17:58:44 +02:00
L'électron rare 883ada7d61 fix(sound): concert advance via body wrists
CI build oscope-of / build-check (push) Has been cancelled
The hand-based arms-crossed gesture could never fire: hand L/R is
position-sorted (rx>=lx always), and at full-body distance MediaPipe
doesnt detect the hands at all (crossing also occludes them). Detect
the advance from the body wrists instead: new /pose/wrist OSCdef ->
~poseWrist, and detectCross fires when the right wrist swaps clearly
left of the left wrist (a clear X), performer centered, wrists at chest
height. Verified headless (wrist-cross advance 1->2).
2026-06-27 17:48:23 +02:00
L'électron rare 1cd8c2e259 fix(sound): dub chords delay tail rings out
CI build oscope-of / build-check (push) Has been cancelled
2026-06-27 17:31:32 +02:00
L'électron rare bcfb86ae53 feat(sound): dub space morceau
Adds 08_dub_space.scd — sub + sparse clicks + reverb outro.
Registers cc_space_sub (gated asr) and cc_space_click (one-shot).
Wires depth->space-amount, rspeed->click trigger. Loaded in boot.scd.
2026-06-27 17:20:16 +02:00
L'électron rare d8ea115a1b feat(sound): dub chords morceau
Add 07_dub_chords.scd: sustained sub (gated asr), dub chord
with CombL delay, deep kick on half notes. Register via
~concertAdd. Wire into boot.scd load list after 06_hard_rave.
2026-06-27 17:17:28 +02:00
L'électron rare 66a16d263b feat(sound): hard rave morceau
Add 06_hard_rave.scd: hoover stabs, hard break, crash on accel spike.
Register in boot.scd load list after 05_hard_pump.
2026-06-27 17:14:38 +02:00
L'électron rare abccc1c7b3 feat(sound): hard pump morceau 2026-06-27 17:11:43 +02:00
L'électron rare 0a3798ea38 feat(sound): acid storm morceau
Add 04_acid_storm.scd: overdriven 303 + hard kick + screech.
Right hand controls cutoff/res/drive; both arms high triggers
screech fill (once per raise). Registered in boot.scd load list.
2026-06-27 17:08:58 +02:00
L'électron rare 79842c8bc0 feat(sound): acid line morceau 2026-06-27 17:05:52 +02:00
L'électron rare 0080cc489f feat(sound): hypno roll morceau 2026-06-27 17:02:02 +02:00
L'électron rare 0cfaa0451c fix(sound): concert gesture without inRange
CI build oscope-of / build-check (push) Has been cancelled
inRange is not defined in the installed SuperCollider (Message not
understood) -> the arms-crossed detector errored at runtime and the
gesture never fired. Replace with explicit >= / <= comparisons.
Verified headless: the gesture now fires (advance/clamp logged).
2026-06-27 16:48:13 +02:00
L'électron rare c4e4511262 feat(sound): concert engine + hypno drift morceau
Sequential techno setlist engine with crossed-arms gesture to advance
tracks. Adds ~poseCenter OSCdef, scene_concert.scd engine, morceaux/
directory, first morceau (Hypno Drift), and wires into boot/scenes.
2026-06-27 16:36:11 +02:00
L'électron rare 0757450648 feat(sound): boot data-only to body-play scene
CI build oscope-of / build-check (push) Has been cancelled
The data-only boot started the \all scene (all data-web scenes). Boot
directly to \play (body-play) so a body-play session has no data-web
synths at startup. \all and the individual data scenes remain available
via /control/doScene <name>.
2026-06-27 16:03:04 +02:00
L'électron rare 8d09ae555b fix(sound): stop play-scene via doStopAll
CI build oscope-of / build-check (push) Has been cancelled
Final whole-branch review caught a cross-task defect: ~doScenePlay
started ~bpEngine but registered no cleanup, so ~doStopAll (run by
~doScene at every scene switch, and by \stop) never stopped the
engine -- body-play kept playing over any other scene, breaking the
"\stop coupe tout" contract. Register the stop via ~doRegisterPriv
(name, killFn) like every other scene. Verified on macm1: doScene(\play)
starts the engine, doScene(\stop) stops it.
2026-06-27 13:32:54 +02:00
L'électron rare 8954198648 feat(sound): wire body-play into data-only boot
Load synthdefs_play.scd (after synthdefs.scd + s.sync) and
scene_pose_play.scd (after scene_pose_action.scd + 0.5.wait) in
boot.scd. Add \play case to scenes.scd switch dispatching to
~doScenePlay — calls ~bpEngine[\start]. Integral-boot test on
macm1: 3/3 PASS (bp_lead loaded, ~bpEngine present, engine started).
2026-06-27 13:15:14 +02:00
L'électron rare 8c8de924db fix(sound): free clock on stop, drop dead callback
- stop: call clock.stop + nil to prevent TempoClock leak per cycle
- remove unused ~doScene !? / ~bpRegisterPlay dead block
- clarify ~bpCtlDur comment: period is in beats, not seconds
2026-06-27 13:00:51 +02:00
L'électron rare 2ec59571c9 feat(sound): body-play engine clock arp crossfade 2026-06-27 12:48:24 +02:00
L'électron rare 83ea2be4e6 feat(sound): body-play mapping functions 2026-06-27 12:42:15 +02:00
L'électron rare c2c9753c8c feat(sound): body-play modes and scale quantizer 2026-06-27 12:35:10 +02:00
L'électron rare 2e484ed2ed feat(sound): bp_* SynthDef palette for body-play 2026-06-27 12:21:27 +02:00
L'électron rare 83dc910624 fix(sound): recover port 57121 from zombie on boot
CI build oscope-of / build-check (push) Has been cancelled
The data-only boot opened the OSC receive port 57121 but fell back
silently to the lang port when it was busy — so /pose (data_only_viz)
and /data (data_feeds bridge), both sent to 57121, never reached
sclang and the patch looked alive but reacted to nothing. The port is
typically squatted by a zombie: a scsynth or data_feeds bridge launched
by a previous boot via unixCmd inherits the 57121 socket FD and outlives
its sclang parent, so a fresh boot can't bind it. Instead of falling
back, free the stale holder (lsof -ti UDP:57121 | xargs kill -9) and
retry openUDPPort. Verified: a planted zombie on 57121 is killed and the
port recovered on boot ("57121 recupere — sclang listening on 57121").
2026-06-26 19:43:57 +02:00
L'électron rare 480aa79ef4 fix(sound): fix pose-FX underscore closure trap
CI build oscope-of / build-check (push) Has been cancelled
scene_pose_action's Routine died on its first tick with "Non Boolean in
test", killing the whole pose->FX mapping (base scenes still played).
Root cause in ~mapPoseToFx: `avgProbs.collect { _ / n }`. The underscore
inside an explicit { } block does NOT build {|x| x/n} — it builds a
function that RETURNS that function, so collect fills avgProbs with
Functions instead of numbers. The next line, avgProbs.maxIndex, then
compares Functions with `>` (a BinaryOpFunction) inside a boolean test
-> MustBeBooleanError. Replace with the idiomatic element-wise
`avgProbs / n`. Verified in isolation (headless sclang): ~mapPoseToFx
and ~mapHandsToFx now pass with both empty and populated pose dicts.
2026-06-26 17:38:00 +02:00
L'électron rare 8a4a0e688d fix(sound): boot data-only patch output-only
CI build oscope-of / build-check (push) Has been cancelled
scsynth failed to boot under the data-only patch with "AudioDeviceStart
failed" because it opened a default input device that was unavailable
(an iPhone Continuity mic showed up in the device list) and needed a mic
TCC grant. The patch is output-only, so pin numInputBusChannels = 0; the
server now boots cleanly with no mic prompt.

Also nil-guard the hand-coordinate reads in scene_pose_action's hand->FX
map (hf[\lx]/\ly/\rx/\ry could be nil when one hand is absent, matching
the existing ? 0 pattern on lopen/rspeed/dist).

Note: a separate "Non Boolean in test" error still kills the
scene_pose_action routine on its first tick (pose->FX mapping not yet
live); ~poseKin/~poseState/~handFeat are Dictionaries populated by
data_feeds OSCdefs — left to investigate.
2026-06-26 17:22:26 +02:00
L'électron rare a8c803403c docs(data-only): french comment in boot load step 2026-06-26 11:07:47 +02:00
L'électron rare fe69f99ba2 feat(data-only): neutral FX when hands absent
CI build oscope-of / build-check (push) Has been cancelled
2026-06-26 10:35:55 +02:00
L'électron rare 9ab238bd2d feat(data-only): map hand features to FX 2026-06-26 10:11:49 +02:00
L'électron rare 2a3fdb1d38 feat(data-only): global filter cutoff width drive 2026-06-26 10:05:00 +02:00
L'électron rare 088b233a48 feat(data-only): ingest /pose/hands into handFeat
Add OSCdef(\poseHands) to data_feeds.scd storing lx/ly/lopen/lspeed,
rx/ry/ropen/rspeed/dist into ~handFeat Dictionary (9 floats, pid=0).
Initialize ~handFeat alongside existing ~poseState/~poseKin.

Load scene_pose_action.scd in boot.scd after scenes.scd so ~mapPoseToFx
is defined at runtime (was silently dead before).

Document /pose/hands contract in data_only_viz/README.md.
2026-06-26 09:59:34 +02:00
L'électron rare 57da0670e6 feat(sound_algo): restore VELIB SYTADIN HUB'EAU feeds
Restore 166 lines of feed implementations (VELIB Paris, SYTADIN
trafic Ile-de-France, HUB'EAU water, GCN seismic, GDELT events,
SWPC space weather, RTE eco2mix) that existed in the local canon
but were missing from origin/main after the 2026-05-13 cherry-pick
recovery cycle. Verified unique via diff against fresh clone.
2026-05-14 11:47:40 +02:00