223 Commits

Author SHA1 Message Date
L'électron rare 531363dea3 chore(main): sync working tree to feat/action-head
Apres cherry-pick des 14 commits action-head, le working tree main
divergeait encore de feat/action-head sur 21 fichiers a cause des
resolutions modify/delete qui avaient pris la mauvaise version
(c52271e botched merge avait drop ces fichiers, le cherry-pick
voyait alors "modify in feat / deleted in main" et conservait la
mauvaise version dans certains cas).

Cette commit synchronise le working tree main vers feat/action-head
en checkout-ant tous les fichiers depuis feat. Equivalent fonctionnel
a un fast-forward merge sans toucher l'historique.

Files restored : Skeleton3DRenderer.swift, FaceHandOverlay.swift,
test_multihmr_coreml.py, test_pose_bridge_*.py (4 test files).
Files updated : action_head.py, action_head_pub.py, multi.py,
pose_bridge.py, state.py, extract_j3d_offline.py, training/*.py,
SettingsPanel.swift, data_feeds.scd, et plus.

Result : main == feat/action-head sur le working tree, historique
granulaire preserve via les cherry-picks precedents.
2026-05-14 00:09:54 +02:00
L'électron rare b052d09d2e merge: feat/action-head into main
CoreML FP32 fix, hybrid mesh rigging, action-head v3, mirror webcam, Apple Vision body pose, MediaPipe offline extract.
2026-05-14 00:06:14 +02:00
L'électron rare 4717da385c feat(sound-algo): action-head live FX scene
Add scene_pose_action.scd to map real-time action-head pose metrics
to live effect parameters. Reads ~poseState and ~poseKin dicts
(populated by data_feeds.scd OSC handlers) and drives:
- speed -> drive amount (0..1)
- accel -> filter cutoff (200 Hz..6 kHz)
- symmetry -> stereo width (0..1)
- label argmax -> reverb/compressor presets (debout/assise/danse)

Manual load only (eval block-by-block in SC IDE). Validates P:0 B:0.
2026-05-13 23:45:05 +02:00
L'électron rare dfafd23d5a feat(sound-algo): action-head pose OSC handlers
Add OSCdef handlers for /pose/action, /pose/kin, /pose/enter,
/pose/leave routes emitted by data_only_viz pose_bridge. Store
person state and kinematics in ~poseState and ~poseKin dicts.
2026-05-13 22:23:17 +02:00
L'électron rare e0cf814e72 feat(sound-algo): pont OSC web data-only
Nouveau fichier control/web_bridge.scd, charge par
boot.data-only.scd apres data_feeds.scd. Ferme la boucle :

Entrants (port 57121, depuis data_only_viz/web /control.html) :
- /control/master_gain f      master amp sur ~mainGroup
- /control/cutoff f           LPF sur ~fxGroup
- /control/reso f             resonance LPF
- /control/reverb_mix f       mix reverb
- /control/delay_time f       delay time
- /control/delay_feedback f   delay feedback (clamp ~0.95)
- /control/tempo f            TempoClock.default.tempo_(bpm/60)
- /scene/play  s              ~dataScene.(name) — meme contrat
                              que les keymaps qsdfghjklm
- /xy/x f   /xy/y f           pad XY -> ~fxGroup.set(\xyMod, ...)

Sortants (port 57125 -> server.js -> WS clients) a 4 Hz :
- /sync/bpm f                 TempoClock.default.tempo * 60
- /sync/beat i                compteur monotone
- /sync/rms f                 ~rmsLevel.value si dispo
- /sync/voices i              ~activeVoiceCount.value si dispo

State partage dans ~webState pour debug REPL.

Le pont est best-effort cote SC : si ~mainGroup / ~fxGroup ne
sont pas encore crees, les set() sont silencieusement skip.
2026-05-13 19:32:27 +02:00
L'électron rare 1ed006966c fix(sound-algo): merge 00_load into single TLB
BASE PATH block (TLB:1) and CHARGER TOUT block (TLB:2) shared the
same ~base auto-detect preamble. Merged into one block so .load
evaluates the full loader, not just the base-path setter.
2026-05-13 13:45:59 +02:00
L'électron rare 300d501f67 docs(sound-algo): SynthDef count 90 to 1099 2026-05-13 13:44:32 +02:00
L'électron rare c924847dfc docs(osc): document dual /data/pose listeners 2026-05-13 13:42:58 +02:00
L'électron rare 1ec57ae3f9 fix(sound-algo): remove hardcoded user paths 2026-05-13 13:38:35 +02:00
L'électron rare ee434b4b96 feat(sound-algo): data-only mode engine
Add boot.data-only.scd and data_only/ scene engine.
Add data_only_program.scd to live/ folder.
Update data_feeds.scd and example 16 for new OSC paths.
2026-05-13 09:33:56 +02:00
L'électron rare 02de5302c9 feat: add realart web application with Hydra, WebGL, and OSC data feeds
- Implemented Hydra visualizations in `web_realart/public/hydra/app.js` and `index.html`.
- Created WebGL visualizer using Three.js and WebGPU in `web_realart/public/webgl/app.js` and `index.html`.
- Developed main landing page in `web_realart/public/index.html` to showcase different visualizations.
- Set up WebSocket server in `web_realart/server.js` to relay OSC messages to web clients.
- Added health check API endpoint for monitoring server status.
2026-05-11 07:21:04 +02:00
L'électron rare 0d189a2139 feat: add real-time data feeds for various sources
- Implemented new data feeds for Blitzortung, Bluesky, GCN, GitHub, Mempool, Netzfrequenz, OpenSky, RTE éCO2mix, SWPC, USGS.
- Introduced utility functions for rate limiting and hashing.
- Established OSC communication for data reception and processing.
- Created SuperCollider definitions for handling incoming data and generating audio output based on real-time data.
- Added configuration management for API credentials and polling intervals.
2026-05-11 06:59:44 +02:00
L'électron rare d60dc11309 feat(sc): album signatures + osc humanity
15 albums utilises par les demoparties recoivent une SIGNATURE
distinctive plutot que reecrire 225 .scd individuellement :

palette/album_signatures.scd defines per-album :
- humanize tunables specifiques (timing/vel/detune)
- rotation pool restreint (ex: T = kicks gabber only)
- rotationEvery rate adapte (V=2 glitch fast, S=64 drone slow)
- auto_layer config (timbres + amp + octaves)

Signatures (A H M G L P J I Q T V U R S F) :
  A acid 303+sub  H acid trance saw  M chiptune square
  G detroit rhodes warmpad  L garage vocalpad
  P industrial growl hardlead  J ambient choir drone
  I liquid pluck  Q neurofunk reese  T gabber hoover growl
  V glitch fmbell stab fast rotation
  U vocal trance choir vocalpad  R synthwave rhodes warmpad
  S drone doom drone subboom -2oct  F trance supersaw pad

~playAlbum est wrappe pour appliquer ~applyAlbumSig.(letter)
avant le lancement original. Conservation de ~playAlbum_orig.

OSC handlers added in web_bridge.scd :
- /control/setHumanize <0|1>     toggle humanize global
- /control/setRotation <0|1>     toggle synth rotation
- /control/setLayer <0|1>        toggle auto layer
- /control/humanizeTiming <f>    fine-tune timing 0..0.05s
- /control/humanizeVelocity <f>  fine-tune vel 0..0.5
- /control/humanizeDetune <f>    fine-tune detune 0..0.5
- /control/layerSet <inst...>    full layer config update

Permet de piloter humanity depuis oscope-of par demo.
2026-05-07 21:10:02 +02:00
L'électron rare 985d3708d1 feat(sc): humanize + synth rotation + auto layer
User : "tu refait aussi les tracks avec toutes les possibilité
de synth disponible pour plus de variation et d'humanité dans
ces créations". Niveau choisi : subtil.

3 axes implémentés en helpers globaux qui s'appliquent à TOUS
les 345 tracks existants sans les réécrire :

1) HUMANIZE (engine.scd, opt-in via ~humanizeOn défaut true)
   - Timing offset Pwhite ±3.5ms par note (1.4% sur dur 0.25)
   - Velocity Pwhite ±10% par note
   - Micro-detune ±3 cents sur acid/melody/harmony midinote
   - Appliqué aux 7 Pdef (kickSeq/hatSeq/snareSeq/clapSeq/percSeq/
     acidSeq/melodySeq/harmonySeq) via Pfunc factories ~hTime
     ~hVel ~hDet déclarées dans ~reload
   - Désactivable : ~humanizeOn = false; ~reload.value
   - Tunables : ~humanizeTiming, ~humanizeVelocity, ~humanizeDetune

2) SYNTH ROTATION (palette/synth_rotation.scd, opt-in défaut OFF)
   - 8 rotators (acid/bass/lead/pad/pluck/kick/hat/snare/melody)
   - Pool de 19 versions par catégorie (acid_v1..v19 etc.)
   - Cycle toutes les ~rotationEvery=8 notes (configurable)
   - Vérifie SynthDescLib avant de switcher pour éviter crash
   - Activation : ~setRotationOn.(true)

3) AUTO LAYER (palette/auto_layer.scd, opt-in défaut OFF)
   - 3 layers parallèles à melody/harmony/acid
   - Mirror Pdef qui rejouent le même score avec instrument
     différent (warmPad/choir/sub_boom par défaut)
   - Octave offset configurable, amp réduit (0.20-0.30)
   - Pan opposé, attack/release plus mou, cutoff moins ouvert
   - Activation : ~setAutoLayer.(true)

Hook chargement dans live/_load.scd après scales/melodies/
harmonics. Les modules sont silencieux jusqu'à activation.
2026-05-07 21:05:24 +02:00
L'électron rare 41aab8227d fix(bridge): var hoisting in rebootWeb
SC requires var declarations at the very start of a function block.
The /control/rebootWeb handler had a postln before the var, which
sclang reported as 'syntax error, unexpected VAR, expecting }' and
silently dropped the entire web_bridge.scd load — leaving sclang
NOT listening on :57121, so every /control/* from the browser was
black-holed. Rearrange : declare var sentinel first, then assign
and use.

Verified with awk balance P:0 B:0 and the followup boot test that
will now register the OSCdef set including rebootWeb / rebootSclang
/ triggerSynth / snareFill / tomFill / randomTweak handlers.
2026-05-07 18:12:47 +02:00
L'électron rare 3e82d81ffc feat(web): Live tab — 30 pads + reboot web
Context: live performance needs immediate, single-key triggers for the
common moves (intro / drop / breakdown / fills / mute a voice / random
tweak), AND mid-set the operator may need to reboot just the Node web
server without touching sclang or the audio engine. The previous
commit added scsynth and sclang reboots but not web.

Approach: a new Live tab dedicated to performance. 30 pads laid out
on a 10x3 grid that mirrors the QWERTY rows physically — top row
(qwertyuiop) = chains, home row (asdfghjkl;) = one-shots, bottom row
(zxcvbnm,./) = mutes + FX. Each pad shows a big label, a small kind
hint and the bound key in a kbd-style badge at the bottom right.
When the Live tab is active a capture-phase keydown listener wins
against the global keymap, so 'r' fires Buildup ×4 instead of
'refresh catalogues' etc. — non-Live tabs keep the global behavior.
Mute pads are stateful : they toggle /control/mute and /control/unmute
based on a local Set, and visually invert (red, 🔇 prefix) when active.
The ⟳ web button writes ~/.av-live-restart-web ; the launcher's
sentinel watcher restarts the Node server without touching sclang.

Changes:
- web/public/control/index.html :
  * new tab Live between Transport and Album
  * new tabpane #livePads (filled by JS), with header hint listing the
    three sections
  * three reboot buttons in the topbar (⟳ sc small / ⟳ web small / ⟳ sclang big)
- web/public/control/app.js :
  * LIVE_PADS array (30 entries, key/label/sub/kind/arg/voice)
  * firePad(pad, padEl) dispatcher : chain / playAll / stopAll / synth
    / fn / tap / ping / unsolo / muteToggle
  * initLivePads() builds the 30 buttons, attaches click + capture-phase
    keydown listener that only fires when Live tab is active, with
    .hit pulse animation feedback
  * makeArmedButton binding for #btnRebootWeb sending /control/rebootWeb
- web/public/control/style.css :
  * .live-grid 10-col CSS grid (5-col under 1200px, 2-col under 720px)
  * .live-pad with hover/active microinteractions and section-coloured
    .live-pad-{chain,shot,mute} variants
  * .live-pad.muted state (red tint, 🔇 prefix)
  * .live-pad-key kbd-style badge bottom-right
- web_bridge.scd :
  * /control/rebootWeb : writes ~/.av-live-restart-web sentinel
  * /control/triggerSynth <name> : safe Synth(<name>, [\decay 2, \amp 0.5])
  * /control/snareFill : ~snareFill.value
  * /control/tomFill : ~tomFill.value
  * /control/randomTweak : ~randomTweak.value
- launcher/ProcessManager.swift :
  * webWantsRestart flag + restartWeb() helper
  * web terminationHandler now respawns 0.4s later if wantsRestart
  * startSentinelWatcher() now also watches ~/.av-live-restart-web

Impact: switch to the Live tab and trigger any of the 30 commands by
clicking or by tapping the corresponding key on the keyboard. Mute
toggles persist visually. ⟳ web restarts the Node server in ~1 second
without disturbing sclang/scsynth or the WS clients (which auto-
reconnect).
2026-05-07 18:03:53 +02:00
L'électron rare b608a50c38 feat(reboot): split scsynth vs sclang reboot
Context: previous commit's REBOOT button only restarted scsynth (the
audio engine), keeping the sclang interpreter alive with all its
loaded modules. The user clarified they want a real 'reboot sclang' :
kill the whole interpreter and reload everything from boot.scd. That
needs cooperation between the web bridge (which can only reach sclang)
and the launcher (which controls the sclang process).

Approach: a sentinel-file pattern lets the bridge signal the launcher
without sharing a port. The bridge handler /control/rebootSclang
writes ~/.av-live-restart-sclang then pkills sclang. The launcher's
new sentinel watcher fires every 1s ; on detection it removes the
sentinel and calls restartSclang(), which sets a wantsRestart flag
and terminates the current process — the existing terminationHandler
sees the flag and respawns sclang 0.6s later (so scsynth can be
reaped). Two distinct buttons in the topbar : ⟳ scsynth (small,
existing /control/rebootServer) and ⟳ sclang (big, new path).

Changes:
- web_bridge.scd : new /control/rebootSclang OSCdef writes the
  sentinel file then unixCmd's pkill -TERM -f 'sclang.*boot.scd'
  after a 0.5s delay
- launcher/ProcessManager.swift :
  * sclangWantsRestart flag
  * restartSclang() : sets the flag, calls stopSclang, re-sets the
    flag (since stopSclang clears it for normal stops)
  * startSentinelWatcher() : 1s Timer that checks for the sentinel
    file in /Users/electron, removes it and calls restartSclang() on hit
  * maybeRestartSclang() : called from terminationHandler, respawns
    if wantsRestart is set, with 0.6s delay so scsynth pkill finishes
- launcher/AVLiveLauncherApp.swift : startSentinelWatcher() invoked
  in applicationDidFinishLaunching
- web/public/control/index.html :
  * #btnReboot split into #btnRebootScsynth (small ⟳ scsynth) and
    #btnRebootSclang (full ⟳ sclang)
- web/public/control/app.js : two makeArmedButton bindings, one per
  reboot path
- web/public/control/style.css : .btn.warn.small variant for the
  scsynth button

Impact: ⟳ sclang now does a full engine restart (kills sclang,
launcher respawns it, ~albums and all wrappers reload). ⟳ scsynth
keeps the lighter path that just bounces the audio server. Both
follow the same two-click armed pattern as TEARDOWN.
2026-05-07 17:56:36 +02:00
L'électron rare 16752b17a0 feat(web): hamburger + help modal + reboot
Context: with 17 tabs the bar overflowed on anything narrower than
1440px and there was no on-screen reference for the keyboard
shortcuts the previous commit had implicitly enabled (the operator
had to read the source). On top of that the user asked for a way to
reboot scsynth from the browser without going through TEARDOWN +
relaunch — useful when the audio graph degrades but the engine state
(catalogues, dicts) is still valuable.

Approach: under 1200px viewport width, hide the horizontal tab bar
and slide a vertical drawer in from the left, gated by a fixed
hamburger button top-left that morphs into a close X when open.
Floating ? button bottom-right opens a dialog listing every keyboard
shortcut. Refactor the TEARDOWN two-step armed pattern into a
makeArmedButton helper so a new 'REBOOT' button (yellow warn variant)
shares the same UX. The bridge gets a /control/rebootServer handler
that quits Server.default, waits 2s, then re-runs ~setupAll — clients
re-fire listAlbums/Sections through the persistent retry from the
previous commit.

Changes:
- web/public/control/index.html :
  * #tabMenuBtn (3-line hamburger)
  * #helpBtn (floating ? in bottom-right)
  * #helpModal with kbd table : ← → / 1-9,0 / r / s / ? h / Esc / m
  * REBOOT button between the status badges and TEARDOWN
- web/public/control/app.js :
  * tabMenuBtn click toggles .open on #tabs, also closes when a tab
    is picked
  * help modal : open/close handlers, click on backdrop closes
  * keydown handler : skips when input/textarea focused, ignores
    modifier combos ; ←/→ jumps to prev/next tab, 1-9/0 selects tab
    by index, r refreshes catalogues, s sends stopAll, ?/h opens
    help, Esc closes, m toggles drawer
  * makeArmedButton(btn, opts) factored out — used by both REBOOT
    (yellow, sends /control/rebootServer) and TEARDOWN (red, sends
    /control/teardown)
- web/public/control/style.css :
  * .tab-menu-btn fixed-position with animated lines morph
  * .help-btn floating bottom-right
  * .help-modal with backdrop blur, .help-modal-card card style
  * .kbd-table + kbd styling
  * .btn.warn variant + .btn.warn.armed pulse
  * @media (max-width: 1199px) : tabs become left drawer 240px wide,
    transformX -100% closed / 0 open, vertical alignment, padding-left
    on .topbar to clear the hamburger ; @media (max-width: 720px)
    further tightens the topbar
- web_bridge.scd : new OSCdef /control/rebootServer that runs
  Server.default.quit + 2s wait + ~setupAll() inside an AppClock
  Routine

Impact: tested via SSH tunnel at 1100px viewport. Hamburger opens a
clean vertical drawer, all 17 tabs accessible. ? button opens a kbd
modal. ←/→ keys cycle tabs, 1-9/0 jumps directly. REBOOT armed +
confirm pattern works identically to TEARDOWN, fires the bridge's
new /control/rebootServer handler.
2026-05-07 17:52:14 +02:00
L'électron rare 26b9757ff3 fix(web): persistent album catalog retry
Context: when sclang restarts (e.g. operator relaunches the launcher),
the browser tab's WS reconnects to the new bridge but the local
albums map still holds the old data from before. The previous
albumRetryDone flag fired only once 4s after WS open, so a
mid-session sclang reboot left the Album tab silently stale until the
operator manually clicked Refresh. Worse, if sclang's first listAlbums
response was lost (race during scsynth zombie cleanup), the tab stayed
empty forever.

Approach: drop the once-only flag. setInterval re-fires
listAlbums + listSections every 5s as long as the bridge is alive,
sclang heartbeat is fresh (< 4s old), AND the local catalog is still
empty. Self-stops as soon as any album lands.

Changes:
- web/public/control/app.js : remove albumRetryDone, replace with a
  permanent setInterval(5000) that re-queries when state.albums is
  empty and lastSyncAt is recent

Impact: refreshing the browser tab after a sclang restart now repopulates
the Album / Sections tabs within 5s without manual Refresh.
2026-05-07 17:48:26 +02:00
L'électron rare d35f913469 feat(web): UX polish
Context: from the UX audit run on /control/ with Playwright. The
single 'online' dot was misleading — it lit up as soon as the WS bridge
was alive even when sclang was silent (no /sync/* coming back), so the
operator couldn't tell at a glance if the engine was actually
responding. TEARDOWN had a confirm() dialog that's brittle on touch
and steals focus mid-set. There was no general feedback channel for
async actions, so failed OSC sends were invisible. listAlbums fired
once at WS open but if sclang booted slowly the tab stayed empty.

Approach: split the status badge into 'bridge' (WebSocket health) and
'sclang' (heartbeat from any /sync/* message in the last 4s). Add a
fixed-position toast container with three variants. Replace the
confirm() dialog on TEARDOWN with a two-click arming pattern.
Auto-retry listAlbums + listSections at +4s if state.albums is still
empty (handles slow sclang boots).

Changes:
- web/public/control/index.html : second hud-item scDot/scLabel,
  #toasts container above the tabs
- web/public/control/app.js : toast() helper, lastSyncAt heartbeat
  with 4s window, markSync() on every WS message, albumRetryDone gate,
  TEARDOWN two-step arming with 2s reset, data-pill-group click
  delegate
- web/public/control/style.css : .toasts column top-right,
  .toast variants, .btn.danger.armed pulse, [data-pill-group].active
  cyan glow

Impact: re-tested via SSH tunnel to MBP. Header shows two green dots
(bridge + sclang), Album tab populates with 23 cards, TEARDOWN
arming with 2s window verified end-to-end.
2026-05-07 17:43:17 +02:00
L'électron rare fa5c9bb36d fix: sclang auto-boot via boot.scd
Context: launching sclang with 00_load.scd as argument was a no-op —
the file is split into ~32 IDE-friendly Cmd+Enter blocks and sclang's
parser only accepts ONE top-level expression per .load. So nothing
actually ran, the engine never came up on the MBP, and every web tab
that depends on /sync/* (Album, Mélodies, Kicks, Mixer real values,
…) was empty. Same problem hit tracks/_index.scd which has shortcut
blocks at the bottom : 'ERROR: syntax error, unexpected (, expecting
end of file' at line 104, which aborted the load and never populated
~albums.

Approach: a tiny single-block boot.scd that derives ~base from
thisProcess.nowExecutingPath and just .load's live/_load.scd (which
runs the whole engine + tracks + web_bridge chain). The launcher's
default soundAlgoLoadFile picks boot.scd if it exists, falls back to
00_load.scd otherwise. tracks/_index.scd's IDE shortcut blocks at the
bottom are wrapped in /* */ block comment so the file is .load-clean
while staying useful in the IDE (uncomment to use). stopSclang()
also runs pkill scsynth as a safety net so the next boot can grab
:57110 — sclang.terminate() doesn't reliably kill its scsynth child.

Changes:
- sound_algo/boot.scd : new entry point, single block, sets ~base
  from disk location and loads live/_load.scd
- sound_algo/tracks/_index.scd : 9 IDE shortcut lines (lines 104-114)
  wrapped in /* */ so .load no longer hits 'syntax error unexpected (,
  expecting end of file'
- launcher/ProcessManager.swift :
  * default soundAlgoLoadFile prefers <avLive>/sound_algo/boot.scd
    over <avLive>/sound_algo/00_load.scd when both exist
  * stopSclang() runs /usr/bin/pkill -f scsynth after sclang.terminate()

Impact: end-to-end verified on the Big Sur Intel MBP via SSH tunnel.
After launcher start the Album tab shows the 23 expected cards
(Acid Journey, Deep to Hard, …, Dub Techno) with working ▶ Album /
▶ Tracks buttons. scsynth :57110 is alive, web bridge is healthy
(3 WS clients), oscope-of receives /sync/album in its HUD.
2026-05-07 17:38:19 +02:00
L'électron rare bbf7c5dc75 feat: import hydra-sc + portable ~base
Context: while inspecting the MBP we found ~/hydra-sc/, an earlier
prototype the user had built before AV-Live existed. It contained
working pieces we needed (Hantek firmware loader, OSC scope bridges,
SC↔Hydra ws relay, hydra patch). We also discovered that 00_load.scd
hard-coded ~base to the GrosMac dev path, which silently broke the
whole sclang engine on the MBP — every (~base ++ '...').load was
hitting a non-existent path and quietly failing. The user's existing
control/midi.scd is comprehensive but split into 5 IDE-friendly
top-level blocks, so it isn't .load-compatible and never auto-runs at
boot.

Approach: derive ~base from thisProcess.nowExecutingPath at load time
so the same project tree works from any absolute location. Migrate the
hydra-sc artifacts into AV-Live/{tools,sound_algo/control,
sound_algo/web/public/hydra} so everything lives in one repo. Add a
single-block live/midi_init.scd that does MIDIClient.init +
MIDIIn.connectAll + the default mapping in one .load-friendly chunk,
deferred 0.5s through AppClock so MIDI device discovery doesn't block
the main load chain. Old ~/hydra-sc/ on the MBP deleted, the orphan
hydra-sc-bridge node process (PID 41421 from a previous session)
killed.

Changes:
- sound_algo/00_load.scd : both ~base assignments now use
  thisProcess.nowExecutingPath.dirname with fallback to the legacy
  hard-coded path
- tools/hantek/{fx2_fwload,hantek_to_osc,hantek_osc_bridge}.py :
  imported as-is, plus a new README explaining the firmware-load /
  C++-or-sigrok choice and the macOS prerequisites (PulseView,
  sigrok-cli, python-osc)
- sound_algo/control/hantek_receiver.scd : OSCdef \hantek that
  exposes ~hPk1/~hRms1/~hPk2/~hRms2 from the Python bridge — kept as
  alternate path to oscope-of's C++ driver
- sound_algo/control/hydra_send.scd : SC→Hydra OSC sender (was
  sc_to_hydra.scd in hydra-sc) — analyzes SoundIn.ar(0) into rms /
  centroid / flatness and sends to 127.0.0.1:8000
- sound_algo/web/public/hydra/external_patch.js : Hydra patch the
  user pastes into hydra.ojack.xyz when running the external bridge
- sound_algo/live/midi_init.scd : single-block MIDI auto-init with
  the same CC/note bindings as control/midi.scd plus new note
  ranges for albums (notes 36-59 → ~playAlbum A-X), kicks
  (notes 60-71 → ~kkAt index 0..11), melodies (72-83 → ~mmAt),
  fx (84-95 → ~ffAt), CC 7 → master volume. Idempotent (frees
  previous MIDIFunc on re-load), graceful when no MIDI device is
  detected (skips mapping, prints note)

Impact: sclang now actually boots its engine on the MBP (~base path
was the silent killer). MIDI controllers connected at startup get
the default mapping automatically. The hydra-sc legacy is fully
absorbed into AV-Live so there's one place to find everything.

Note: live/midi_init.scd is NOT yet wired into live/_load.scd's
auto-load chain — that's a follow-up so we can verify the file
loads cleanly first.
2026-05-07 17:10:17 +02:00
L'électron rare de035a8596 Add 'sound_algo/' from commit '38b17c42a0b5d2c7f52a2ad600316282cc52a02d'
git-subtree-dir: sound_algo
git-subtree-mainline: b7940d650f
git-subtree-split: 38b17c42a0
2026-05-07 11:51:51 +02:00