Files
AV-Live/launcher/concert/launch_concert.sh
T
L'électron rare 720d566294
CI build oscope-of / build-check (push) Has been cancelled
feat(concert): portrait video + pinch on defaults
Session-validated setup becomes the launcher default so app-icon
launches match: VIDEO_ROTATE=ccw (iPhone portrait) and PINCH_ENABLE=1
(full gate chain validated live 2026-07-02).
2026-07-02 18:38:35 +02:00

98 lines
5.0 KiB
Bash
Executable File

#!/bin/zsh
# AV-Live Matrix launcher (runs the matrix arranger, not the concert).
# Boots the matrix stack in one shot:
# iPhone ARBodyTracker (camera + ARKit skeleton over USB)
# -> data_only_viz pose pipeline (feeds /pose/* for matrix capture-modulation)
# -> SuperCollider engine in MATRIX_ONLY (concert disabled, matrix arranger)
# -> web control surface, then load a preset and start the matrix playing.
# Used as the executable of "AV-Live Concert.app" (double-click to start).
# Re-running restarts cleanly (it kills any prior stack first).
set -u
REPO="$HOME/Documents/Projets/AV-Live"
DEV="AC1CDE5F-DDC4-5B2C-80D7-9953D8ABA0AC" # iPhone 16 Pro (xcrun devicectl list devices)
export PATH=/opt/homebrew/bin:$PATH
# MediaPipe delegate: CPU by default. The GPU (Metal) delegate is faster but
# CRASHES under sustained load -- gpu_buffer_storage_cv_pixel_buffer.cc fatal
# CVPixelBuffer alloc failure (-6662) in Image::ConvertToGpu() -- on M1 Max too,
# not just M5. The original choppiness it was meant to fix was CPU STARVATION
# (baby-brain + model servers hogging the box); those are now stopped, so the CPU
# delegate has headroom and stays fluid AND stable. Override with
# MEDIAPIPE_DELEGATE=gpu only for short sessions where you accept the crash risk.
export MEDIAPIPE_DELEGATE="${MEDIAPIPE_DELEGATE:-cpu}"
# Finger pinches drive the 8 matrix global actions. ENABLED by default
# since 2026-07-02: the full gate chain (plausibility, persistence, near,
# facing, open-hand, debounce) was validated live. PINCH_ENABLE=0 disables.
export PINCH_ENABLE="${PINCH_ENABLE:-1}"
# iPhone rides PORTRAIT since 2026-07-02 (better hand detection, ARKit
# body still tracks). The HEVC stream arrives sensor-landscape: rotate the
# displayed video ccw. The 2D landmark streams arrive already uprighted
# (see iphone_usb_source) and are not rotated.
export VIDEO_ROTATE="${VIDEO_ROTATE:-ccw}"
# Gestures use the iPhone Vision hands exclusively (stable, rotation-invariant);
# the Mac MediaPipe hand detector is skipped under --iphone-usb (multi.py).
export FINGER_SOURCE="${FINGER_SOURCE:-iphone}"
# ARKit is now the body source (built directly in multi.py under --iphone-usb),
# so arkit_fuse (which spliced ARKit into MediaPipe pose) is no longer needed.
export POSE_FILTER=median+kalman+lookahead+ik
# CONCERT_MIRROR=0 in the environment disables the video mirror.
PY="$REPO/data_only_viz/.venv/bin/python"
SCLANG="/Applications/SuperCollider.app/Contents/MacOS/sclang"
# matrix preset auto-loaded on boot (a sound_algo/.../matrix_presets/*.matrix name
# without extension); set MATRIX_PRESET="" to start from an empty grid.
MATRIX_PRESET="${MATRIX_PRESET:-techno_drive_live}"
notify() { osascript -e "display notification \"$1\" with title \"AV-Live Concert\"" 2>/dev/null; }
cd "$REPO" || { notify "repo introuvable"; exit 1; }
# 0) clean any prior run
pkill -9 -f "data_only_viz.main" 2>/dev/null
pkill -9 -f sclang 2>/dev/null
pkill -9 -f scsynth 2>/dev/null
lsof -ti UDP:57121 2>/dev/null | xargs kill -9 2>/dev/null
lsof -ti UDP:57123 2>/dev/null | xargs kill -9 2>/dev/null
sleep 2
notify "Demarrage..."
# 1) iPhone ARBodyTracker (camera + skeleton over USB)
xcrun devicectl device process launch --device "$DEV" cc.saillant.ARBodyTracker >/dev/null 2>&1
sleep 3
# 2) SuperCollider engine in MATRIX_ONLY (concert/body-play disabled; loads the
# matrix arranger + the launchpad voices). sclang needs a controlling TTY to
# boot scsynth reliably -> run it under `script` (gives a pseudo-TTY), detached
# via nohup. needs no Automation/TCC permission. Log -> /tmp/sc_boot.log.
( cd "$REPO/sound_algo/data_only" && MATRIX_ONLY=1 nohup script -q /tmp/sc_boot.log "$SCLANG" boot.scd >/dev/null 2>&1 & )
sleep 32
# 3) pose pipeline (iPhone USB HEVC -> MediaPipe -> OSC). Emits /pose/hands,
# /pose/center and /pose/sho_span -> matrix capture-modulation sources, and
# shows a live visual of the tracked pose.
nohup "$PY" -m data_only_viz.main --pose --iphone-usb > /tmp/concert_viz.log 2>&1 &
disown
sleep 11
# 4) (matrix mode: no "morceau" button — the matrix is driven from the web control
# surface below; the floating concert panel is intentionally not started.)
# 5) web OSC control surface server (browser drives the matrix + patterns).
# Only if its deps are installed (cd web_realart && npm install once). Reachable
# at http://supra-m1.local:4400/control/ from any LAN device.
if [ -d "$REPO/web_realart/node_modules" ]; then
( cd "$REPO/web_realart" && PATH=/opt/homebrew/bin:$PATH nohup node server.js > /tmp/websrv.log 2>&1 & )
fi
# 6) load a matrix preset and start the playhead (the matrix equivalent of
# switching to a scene). Skipped if MATRIX_PRESET is empty.
if [ -n "$MATRIX_PRESET" ]; then
"$PY" -c "from pythonosc.udp_client import SimpleUDPClient; SimpleUDPClient('127.0.0.1',57121).send_message('/matrix/load','$MATRIX_PRESET')"
sleep 1
fi
"$PY" -c "from pythonosc.udp_client import SimpleUDPClient; SimpleUDPClient('127.0.0.1',57121).send_message('/matrix/play',[])"
sleep 1
notify "Matrice lancee ($MATRIX_PRESET). Control: supra-m1.local:4400/control/ (onglet MATRICE)"