20 Commits
Author SHA1 Message Date
lucianoandClaude Opus 5.5 ab1ab89127 Phone remote: LAN web page + WebSocket, QR pairing, blackout/freeze
remote-server.js: http + ws server (off by default, started from the panel,
port 8787 or next free), every request gated by a secret key embedded in a
QR code; the key persists in userData/remote.json so a phone's home-screen
shortcut survives restarts, 'Nuovo codice' revokes it. Phones send commands
that the panel executes through its own functions (transport, track pick,
effect next/prev/random/family/sequence, Auto VJ, pads, mapping on + visible
zones, blackout, freeze) and the panel pushes a compact live state at ~6 Hz
while a phone is connected (track + progress, effect, sequence, pads,
zones, meters, BPM). New panic controls in output and aux windows: blackout
(fade to black above every layer) and freeze (hold the last frame); also
available as panel buttons. src/remote.{html,css,js} is the touch UI in the
Neon Grid style, installable to the home screen, auto-reconnecting.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XVMQ2JhsJ77pGKqcvvFHqc
2026-10-02 13:39:28 +02:00
lucianoandClaude Fable 5 c2709ff158 9:16 recording: positionable crop strip + on-screen guide frame
New controls in the Registra tab: a 'Posizione taglio' slider choosing WHICH
strip of the screen survives the cover-crop when the format differs from the
display (ffmpeg crop x/y driven by cropX 0..1), and a guide checkbox. The
guide is a dashed frame + dimmed surroundings drawn on the output window
(outside #stage, last in DOM, overlay only — composeFrame never captures
it), live-updated from slider/format and hidden when no crop applies.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XVMQ2JhsJ77pGKqcvvFHqc
2026-09-08 17:57:25 +02:00
lucianoandClaude Fable 5 51c6bca2c8 Recording: 60fps capture, remux when no rescale, CRF 16 slow otherwise
captureStream at 60fps with an 80 Mbps cap. When the requested frame equals
the source and the first pass is H.264, the MP4 is a pure remux (-c copy):
the hardware realtime encode is the only compression in the final file. The
re-encode path (vertical reels, VP9 fallback) moves to CRF 16 preset slow at
constant 60fps.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XVMQ2JhsJ77pGKqcvvFHqc
2026-09-08 17:48:52 +02:00
lucianoandClaude Fable 5 be33fb9e7b Recording quality: 30 Mbps intermediate, CRF 18 medium, CFR 30fps
The realtime VP9 first pass at 12 Mbps was the bottleneck on full-screen
abstract motion (visible blocking the MP4 pass could not recover), and the
x264 pass added its own loss at CRF 20 veryfast. The WebM intermediate is
deleted after muxing, so it can afford 30 Mbps; the MP4 pass is offline, so
it can afford CRF 18 preset medium, constant 30 fps and 256k AAC.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XVMQ2JhsJ77pGKqcvvFHqc
2026-09-08 17:41:34 +02:00
lucianoandClaude Fable 5 4dfa0fc993 Fix recording ENOENT: try absolute ffmpeg paths before bare 'ffmpeg'
ffmpegPath() short-circuited on the bare 'ffmpeg' candidate, so the absolute
Homebrew/system paths were never checked. From a terminal PATH covers it, but
the packaged app launched from Finder has a minimal PATH: stopping a
recording failed with 'spawn ffmpeg ENOENT'. Absolute candidates now win;
bare 'ffmpeg' is the last resort.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XVMQ2JhsJ77pGKqcvvFHqc
2026-09-08 17:34:51 +02:00
lucianoandClaude Fable 5 203efe3333 True multi-output: one aux window per extra display, assignable content
New 'Uscite multiple' section in the Schermo tab: every display that hosts
neither the panel nor the main output gets a row with an on/off toggle and a
content mode — follow the main effect, a dedicated effect (family+preset,
camera/3D families excluded), a fullscreen image, or black. Aux windows are
lightweight visual-only renderers (aux.html/aux.js) fed with the audio
analysis relayed from the main output at ~30 Hz over the new 'afr' channel,
with a drift-corrected clock. Display hot-plug is now detected (list refresh
+ stale aux windows dropped); config persists per display id in localStorage.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-05 15:16:25 +02:00
lucianoandClaude Fable 5 7414dbe2ec Windows support: cross-built NSIS installer
- toFileURL and path-basename handling made Windows-safe (backslashes,
  drive letters) so media/model loading works there
- Blender discovery scans Program Files\Blender Foundation; ffmpeg
  candidates include common Windows paths
- build config: win/nsis target (x64, custom install dir), build/icon.ico
  generated from the 1024 png, dist:win script
Cross-compiled from macOS: dist/DJ Visualizer Setup 1.6.0.exe (95MB) with
scripts unpacked and models/MediaPipe bundled. Untested on real Windows.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 14:44:47 +02:00
lucianoandClaude Fable 5 26dea77c70 Control panel default size 980x1180
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 11:50:43 +02:00
lucianoandClaude Fable 5 dd061949da Control panel opens 200px wider (580 -> 780)
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 11:36:16 +02:00
lucianoandClaude Fable 5 d329759961 Load FBX characters directly: in-app conversion to GLB
The model button now accepts .fbx too: a new model:convert IPC runs
Blender with scripts/fbx2modelglb.py (mesh + skin kept, animations
dropped, embedded diffuse recovered even when the FBX references
missing external textures) into userData/models3d, then the resulting
GLB loads as usual. anim/model conversion share one convertFbx helper.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 11:31:26 +02:00
lucianoandClaude Fable 5 97376b22c9 Dance library: bundled clips bind to any rigged model + repertoire + manual BPM
- models/dance_library.glb: skeleton-only GLB with the 13 Mixamo dances,
  loaded at startup and bound BY BONE NAME to whatever rigged GLB the
  user loads — new models dance immediately, no baking needed.
- Repertoire UI (Media tab): checkbox chips of the available clips, the
  director only picks the ticked ones (none = all); persisted.
- 'Aggiungi animazioni': extra .glb clips load directly; .fbx are
  converted on the fly by Blender via a new anim:convert IPC and the
  bundled scripts/fbx2animglb.py (asarUnpacked for packaged builds).
- Manual BPM with TAP tempo: 0 = follow the detected beat, otherwise a
  pure metronome drives the dance clock.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 11:15:10 +02:00
lucianoandClaude Fable 5 722bce5036 Body tracking: head/hands/feet drive the interactive families
MediaPipe PoseLandmarker (BlazePose lite) integrated fully offline: the
WASM runtime and the bundled .task model are served to the renderer over
a new djvres:// protocol (fetch does not work on file://), with
'wasm-unsafe-eval' added to the output CSP. pose.js exposes PoseTracker;
interactive.js detects at ~30 Hz, maps landmarks into mirrored
cover-fitted screen space and smooths them with velocities.

Upgrades when a body is tracked (silent fallback to motion otherwise):
- all physical modes: moving head/hands/feet stamp precise motion blobs
- Sciame: the swarm follows your head
- Interattivo Modello: hand swipes spin the robot, it leans toward your
  head, raising a hand fast makes it jump
- Silhouette: neon skeleton (bones + joints + glowing head) over the
  electric outline

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 18:31:11 +02:00
lucianoandClaude Fable 5 134af5775c Output window can no longer be closed by accident
Cmd+W / the red button on the output window are ignored while the control
panel is open: the audio engine and all visual state live in that window,
so an accidental close killed the whole show with no way to reopen it.
If the window dies anyway (renderer crash) it is recreated automatically.
Quitting normally (closing the control panel or Cmd+Q) still works.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-29 23:40:01 +02:00
lucianoandClaude Fable 5 ea31d68350 Interactive camera family: webcam motion pushes physical balls on screen
New 'Interattivo Palle' family (interactive.js): frame-differencing motion map
from the webcam, ball physics (push-away forces, collisions, beat kicks),
palette-tinted rendering with motion mist. Camera is requested lazily and
released when switching preset; mouse/touch fallback when unavailable.
Excluded from Auto VJ so the camera never turns on by itself.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-29 21:35:38 +02:00
lucianoandClaude Opus 4.8 0c2f2b8190 Waveform: decode peaks in-renderer via Web Audio (no external ffmpeg needed)
The packaged app doesn't bundle ffmpeg, so on Macs without a system ffmpeg the
waveform stayed blank. Compute peaks by reading the file bytes (new file:read
IPC) and decoding with Web Audio's decodeAudioData in a low-rate AudioContext;
ffmpeg in main remains only as a fallback.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 18:03:29 +02:00
lucianoandClaude Opus 4.8 882dd4643a Playlist: per-track start/end trim, total/elapsed/remaining times, waveform cards
- Per-track start/end points (mm:ss inputs, 'set to current' buttons, draggable
  handles on the waveform). Trim applied via audio.setTrim (seek to start, stop
  at end) and pushed live to the playing track.
- Wider cards showing elapsed / total / remaining for the trimmed range.
- Waveform rendered per track: peaks computed in main via ffmpeg (mono 8kHz PCM
  -> 400 normalized buckets, cached), drawn on a canvas with trim region +
  playhead. New audio:peaks IPC + djv.peaks preload binding.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 16:36:54 +02:00
lucianoandClaude Opus 4.8 50b4223100 Playlist-video blend/opacity/fit controls + export/import playlist to file
- Blend mode, opacity and fit for videos played from the playlist (mix with visuals).
- Save/Load buttons to export/import a playlist (with scenes/cues) to a JSON file
  via native dialogs; the playlist already auto-persists between sessions.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 16:52:55 +02:00
lucianoandClaude Opus 4.8 e0856866d2 Timed scene cues per track + persistent playlist/scenes
- Each playlist track holds a timeline of cues (@time → effect/text/image);
  cues fire automatically as the track plays, driven by progress reports.
- Playlist (tracks, hotkeys, cues) is saved to userData and restored on startup,
  like the pad bank.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 16:15:40 +02:00
lucianoandClaude Opus 4.8 47728d0d2a Effects engine, SVG/VU/silhouette categories, pad bank, MP4 recording, dual-window UI
- Parametric effect engine: 23 shader families × palettes × variants (~2300 presets)
  with a filterable library and an effect sequence (auto-cycle by time or beat).
- Effect categories: fractals/abstract, dancing silhouettes, SVG/Image source
  (loads any SVG/image as a recolourable audio-reactive effect; 50+ bundled CC0 SVGs),
  and VU-Meter (32-band spectrum bars, analogue needle, stereo LEDs).
- Dual-window architecture: control panel + fullscreen output on an external display
  (reliable via simple-fullscreen); tabbed control UI (Audio, Effetti, Pad, Immagini,
  Testo, Registra, Schermo).
- Audio: file playback + live input + output device selection, per-band visual EQ,
  audio playlist (reorder, hotkeys, per-track play/pause, repeat).
- Pad bank: 5×4 launchpad with persistent assignments; pressing a pad stops the current.
- Overlays: slideshow images (resizable), two freely positioned/resizable logos,
  scrolling ticker text.
- MP4 recording of the composited output (visual + overlays + audio) via MediaRecorder
  + ffmpeg, with selectable aspect ratios (16:9, 9:16, 1:1, 4:3, 3:4, 21:9).
- App icon (.icns) and dock icon; author Dj LuZa.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 15:25:39 +02:00
lucianoandClaude Opus 4.8 b32ea47ae5 Initial commit: DJ Visualizer
Electron app with audio-reactive fractal/abstract visuals on an external
display. Dual-window setup (control panel + fullscreen output), 8 WebGL
scenes, audio from file/live input/system audio, image and scrolling-text
overlays.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 12:44:17 +02:00