Commit Graph

533 Commits

Author SHA1 Message Date
L'électron rare 495c5680bf feat: tosc sections page for song build
CI build oscope-of / build-check (push) Has been cancelled
Add SECTIONS (page 4): 8 slot launch+save buttons, PREV/NEXT nav,
/scene/state receive on the GROUP so sections.lua colors slots
(green=current, blue=filled, dark=empty). Update pager to 4 pages,
add 4 new tests (26 pass), rebuild dist/av-live-control.tosc.
2026-06-28 16:16:14 +02:00
L'électron rare 7b90acf80e feat: web sections tab for live song build
CI build oscope-of / build-check (push) Has been cancelled
2026-06-28 16:10:02 +02:00
L'électron rare 1990fc692f fix: guard scene clear bounds and lparm nil
CI build oscope-of / build-check (push) Has been cancelled
2026-06-28 16:05:55 +02:00
L'électron rare d7c1049661 fix: valueArray for melody state echo
CI build oscope-of / build-check (push) Has been cancelled
2026-06-28 15:56:42 +02:00
L'électron rare ab88b0f6df feat: load sections after touchosc feedback
Adds boot step 6h: sections.scd loaded after touchosc_feedback.scd
so ~toscSend is available. Net-zero paren balance change (P:-8 B:0).
2026-06-28 15:56:42 +02:00
L'électron rare ca21a4216d feat: live section scene slots in sc
8 snapshot slots (clips armed + seq presets + harmony).
Quantized recall via ~lpArm diff, next/prev chaining,
/scene/state feedback via ~toscSend. Headless test passes.
2026-06-28 15:56:42 +02:00
clement bb11311720 Merge remote-tracking branch 'origin/main'
CI build oscope-of / build-check (push) Has been cancelled
2026-06-28 15:18:44 +02:00
L'électron rare 6ec864ed7d fix: reset clip state on web clear
CI build oscope-of / build-check (push) Has been cancelled
2026-06-28 14:59:12 +02:00
L'électron rare 16f68efe01 feat(tosc): clip quantize and queued blink
CI build oscope-of / build-check (push) Has been cancelled
Add 4 /launch/quant buttons (1/2, 1, 1BAR, 2BAR) with constf args
0.5/1/4/8 to LIVE page top bar. Extend pad.lua: onReceiveOSC reads
state int 0-3 (off/playing/queued-launch/queued-stop); onFrame pulses
amber when blinking=true. Test: test_live_page_quant_buttons asserts
CONSTANT/FLOAT args. 22 tests pass; dist rebuilt (8482 bytes).
2026-06-28 14:52:12 +02:00
clement 57abc2ae0f docs: document finger gesture env vars 2026-06-28 14:50:05 +02:00
clement 463bab7665 feat: pinch arms launchpad clips
Pinch toggles launchpad patterns via ~lpArm (concert sounds,
clock sync, per-voice vol) instead of ad-hoc loops. Adds
~fpMode (clips/piano/both) and /control/fp reload.
2026-06-28 14:50:05 +02:00
clement b8f5cc0b2e feat: thumb-finger pinch detection
PinchDetector (hysteresis + refractory, normalized by hand
size) emits /pose/pinch. Publisher picks iPhone Vision hands
when fresh (FINGER_SOURCE). 4 pinch tests.
2026-06-28 14:50:05 +02:00
L'électron rare b071c31b86 feat: web clip quantize and queued states
CI build oscope-of / build-check (push) Has been cancelled
Add /launch/quant selector (0.5/1/4/8 beats, default 1 mes)
to the LIVE tab. Update /armed/ handler to read 4-state int
(0=off 1=playing 2=queued-launch 3=queued-stop), apply .armed
and .queued classes accordingly, sync clipState map. Pad tap
now toggles based on last-known state. CSS blink animation for
.queued (600 ms ease-in-out infinite).
2026-06-28 14:46:52 +02:00
L'électron rare 582d955522 fix: bump clip gen only in active branches
CI build oscope-of / build-check (push) Has been cancelled
Move ~lp[\clipGen] increment inside the four transitions that
schedule or cancel a closure (s==0 launch, s==3 cancel-stop,
s==1 stop, s==2 cancel-launch). No-op re-taps (s==1/2 on launch,
s==0/3 on stop) no longer clobber the pending generation counter.

Also clamp /launch/quant to clip(0.125, 64) instead of max(0.125)
to prevent a runaway large value from locking out launches.
2026-06-28 14:42:59 +02:00
L'électron rare 714c5988c2 feat: emit 4-state clip feedback
~toscArmedPush now iterates all 16 pads plus melseq and rhythmseq,
sending 0/1/2/3 (off/playing/queued-launch/queued-stop) from clipState
with fallback to armed membership for concert-driven clips. Test
extended with clipState in dummy ~lp and clipState read assertion.
2026-06-28 14:31:36 +02:00
L'électron rare ebe15d0804 feat: quantized clip launch stop with queue
Add 4-state machine (off/playing/queued-launch/queued-stop) to ~lpArm.
Launch and stop are quantized to ~lp[\quant] beats (default 4) via
clock.schedAbs(clock.nextTimeOnGrid(q)). Per-clip generation counter
cancels superseded callbacks on re-tap. New env fields: ~lp[\quant],
~lp[\clipState], ~lp[\clipGen]. New /launch/quant OSCdef. ~lp[\armed]
semantics preserved so /launch/clear and concert logic keep working.
2026-06-28 14:31:25 +02:00
L'électron rare 0fa6cac2bf fix: guard suppressEmit and filter feedback relay
CI build oscope-of / build-check (push) Has been cancelled
2026-06-28 14:21:01 +02:00
L'électron rare 91c4c5c599 fix: accent on sequenceurs web tab label 2026-06-28 14:12:42 +02:00
clement 6a286b4f0e feat: prefer iphone vision hands for air-piano
iPhone Vision hands (on-device, .right upright, y already
top-left, rotation-invariant) are stored in a dedicated state
field and used by the strike detector when fresh (FINGER_SOURCE
auto/iphone/mediapipe). More stable than MediaPipe on the
rotated downscaled video. Adds FINGER_DEBUG strike logging.
2026-06-28 14:12:34 +02:00
L'électron rare 6566e7e410 feat: web control 3-tab layout and live feedback
Reorganize control surface into LIVE / FX-HARMONIE-CONCERT /
SEQUENCEURS tabs with pure CSS/JS tab switching.
Default tab is LIVE.

Add engine feedback rendering via WS onmessage:
- /armed/<name>: reconcile armed CSS class from engine state
- /sync/beat: 80 ms flash on beat-dot indicator in header
- /sync/rms: drive master VU bar width from float 0..1
- /seq/rhythm/state: load k/s/h step grid + preset name; guard
  suppressEmit to prevent echo back as /seq/rhythm/set
- /seq/melody/state: load degree inputs; same no-echo guard

All pre-existing OSC sends preserved unchanged.
2026-06-28 14:11:07 +02:00
clement 154db324cf fix: fallback scales for data-only air-piano
data-only boot does not load palette/scales.scd, so
~scaleMinorPent was nil and ~fpResolve crashed on wrapAt.
Embed fallback scale arrays so notes resolve headless.
2026-06-28 14:03:13 +02:00
L'électron rare 8530f92c15 feat: relay engine feedback to web clients
Add a second osc.UDPPort bound to FEEDBACK_PORT_IN (default
9000, matches ~toscPort in SC) that receives engine feedback
OSC (/armed/*, /sync/beat, /sync/rms, /seq/*/state) from SC
and relays each message to all WS clients using the existing
{address,args} JSON shape. Does not update the snapshot cache
(feedback is transient). Existing data port, control-send
path, and WS logic are untouched.

node --check: SYNTAX OK.
2026-06-28 14:02:51 +02:00
L'électron rare 2213b4e53d feat: multicast tosc feedback to clients
Replace single ~tosc NetAddr with ~toscClients Dictionary
(keyed by ip) so feedback OSC reaches all connected clients
(web bridge + iPad) simultaneously. ~toscTouch deduplicates
by IP and logs only on first connection. ~toscSend iterates
the dictionary; no-op when empty.

Test: add assertion that two distinct IPs produce size==2.
Balance: P:0 B:0 on both files. Headless TEST PASS.
2026-06-28 14:02:41 +02:00
clement 217e41c632 feat: OSC remote control for air-piano
Add /control/fp (on/off/scale/inst/sens/octave/debug) so the
air-piano is controllable on a headless sclang, plus a debug
strike log gated by ~fpDebug.
2026-06-28 13:53:35 +02:00
L'électron rare 67fd253de5 fix: pad armed receive on group, lua guards
CI build oscope-of / build-check (push) Has been cancelled
Move /armed/<name> receive msg from arm BUTTON to parent GROUP so
pad.lua onReceiveOSC fires on the node that owns the message (FIX 1).
Remove feedback.lua from master RMS fader; native receive already
drives the VU, onFrame decay was pure downside (FIX 3).
Add Lua 5.1/LuaJIT compat shim for table.unpack in melody_faders
(FIX 2). Document deferred sequencer playhead in README (FIX 4).
Regression test: 16 pad GROUPs carry /armed/* receive; 21 tests pass.
Rebuild dist/av-live-control.tosc.
2026-06-28 13:49:00 +02:00
clement c1b567f116 feat: VIDEO_ROTATE to rotate source frame
Rotate the iPhone/webcam frame before MediaPipe and display
so detection, skeleton overlay and the shown video stay
aligned after the phone is physically rotated. ARKit 3D
world joints are orientation-invariant and untouched.
2026-06-28 13:44:09 +02:00
L'électron rare c90cbb103c docs: touchosc build validate and deploy guide
CI build oscope-of / build-check (push) Has been cancelled
2026-06-28 13:36:31 +02:00
L'électron rare a74d3fb402 fix: reload-safe tosc rms probe + portable test 2026-06-28 13:35:30 +02:00
clement 5c0007f961 docs: clarify fp modulation scope and inst gate 2026-06-28 13:26:56 +02:00
L'électron rare 1d62ff4347 feat: load touchosc feedback after launchpad 2026-06-28 13:23:56 +02:00
L'électron rare 73c17d41f7 feat: sc touchosc feedback sender
Adds sound_algo/data_only/touchosc_feedback.scd: captures the
controlling client IP from inbound /launch* OSC traffic, pushes
/armed/<name> for all 16 pads, /sync/beat each beat on ~lp[clock],
/sync/rms at 20 Hz (server-only, guarded), and echoes
/seq/rhythm/state + /seq/melody/state on preset select. Additive,
nil-guarded, safe to load headless without a booted audio server.

Also adds test/test_touchosc_feedback.scd: headless harness that
builds a dummy ~lp env, loads the feature, asserts the three public
API functions are wired, exercises ~toscArmedPush with nil ~tosc,
and prints TEST PASS.
2026-06-28 13:23:53 +02:00
clement e1cf2af339 fix: guard _vj against missing _vdmx attr
Pre-existing failure: test_pose_bridge_hands builds the
bridge via __new__, so _vj raised AttributeError on _vdmx.
Defensive getattr makes the full suite green.
2026-06-28 13:21:45 +02:00
clement 764bf02dc8 feat: load air-piano and hook hand modulation
Wire finger_piano.scd into both data-only boot paths so
OSCdef /pose/finger and ~fp* API are available at runtime.
Call ~fpModTick on every /pose/hands frame (~30 Hz) for
continuous air-piano modulation. Document FINGER_PIANO env
vars in CLAUDE.md.
2026-06-28 13:17:31 +02:00
clement 4cabf12eac test: assert fpModTick updates fpCut
Replace ghost isNil check with concrete one-pole assertion:
fpCut must equal 0.2 after one tick from dist=1.0, coeff=0.2.
2026-06-28 13:15:23 +02:00
L'électron rare 427341b8a1 test: harden tosc layout osc assertions 2026-06-28 13:12:42 +02:00
clement 858762fe39 feat: air-piano finger note engine in sc 2026-06-28 13:11:13 +02:00
clement 6b7cae277e feat: wire finger strikes into pose publisher 2026-06-28 13:05:21 +02:00
L'électron rare 2ad47c705e feat(touchosc): layout pages lua scripts and dist
Three-page pager (LIVE / FX-HARM-CONCERT / SEQ) with corrected
OSC mapping: scale sends string name not index, octave is absolute
(0/1/2), body-play is /control/doScene "play", arm-mel/rhy send
/launch "melseq"/"rhythmseq". Per-voice VU strip deliberately
omitted (engine sums to bus 0 only). Lua scripts embedded from
gen/lua/*.lua. Dist file committed as the deliverable.
18 tests pass.
2026-06-28 13:03:42 +02:00
L'électron rare 4414bbf168 feat(touchosc): typed partial helpers
Add consti/constf/vali/valf to schema.py so numeric OSC args
carry the right wire type. Partial already supported scale_min/
scale_max; helpers expose them cleanly. Existing API unchanged.
2026-06-28 13:03:31 +02:00
clement 85379be922 test: assert all send_finger osc args
Strengthen test_send_finger_emits_expected_osc to verify all seven OSC
arguments by value (z, tipx, tipy) and their types. Ensures OSC tags and
SC ~fpResolve reader get correct int/float types.
2026-06-28 13:03:10 +02:00
clement 211ee2b323 feat: emit /pose/finger over osc bridge 2026-06-28 13:00:12 +02:00
clement 2b41516a20 feat: add finger strike detector 2026-06-28 12:56:00 +02:00
L'électron rare 9e32e3afd8 feat: tosc xml generator schema + fidelity gate 2026-06-28 12:49:20 +02:00
L'électron rare 048403e92b docs: capture touchosc v3 tosc schema ground truth 2026-06-28 12:49:13 +02:00
clement 8ad309de33 docs: air-piano implementation plan
6 tasks (TDD): Python strike detector + bridge + publisher
wiring; SC note engine + modulation; loading + env docs.
Default instrument follows live ~melodyInst via \live.
2026-06-28 12:44:13 +02:00
clement 2e32dec51c docs: air-piano iphone fingers design spec
Hybrid architecture: Python detects finger strikes from
iPhone hand joints, SC owns musicality (scale, octave,
instrument) and continuous modulation from hand spacing.
2026-06-28 12:34:44 +02:00
L'électron rare 1101758719 docs: touchosc control surface impl plan 2026-06-28 12:21:56 +02:00
L'électron rare 2d05ac9372 docs: touchosc control surface design spec 2026-06-28 12:12:12 +02:00
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