Commit Graph
97 Commits
Author SHA1 Message Date
lucianoandClaude Fable 5 5d4747f780 Aux outputs: per-monitor overlay text (static or scrolling)
Each aux row gets a 🔤 toggle opening a sub-row: text, position
(top/middle/bottom), static or marquee, size, speed, color, bold. The text
renders as an overlay above whatever the window shows — effect, image or
plain black — so a monitor can be a dedicated message board. Scroll duration
scales with text length for constant apparent speed.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-05 15:25:52 +02:00
lucianoandClaude Fable 5 09bc0cc8cf Fix aux-row layout: pin select widths against the global 100% rule
The control panel's global 'select { width: 100% }' made the mode dropdown
swallow the whole row, pushing the family/preset selects off-screen.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-05 15:21:36 +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 b5dc0275c8 Playlist: rebuild DOM only on structural changes, patch progress in place
Every 400ms progress tick rebuilt the whole list (now heavy with per-track
waveforms), so nodes were replaced between mousedown and mouseup and row
buttons never received their click while a track was playing. renderPlaylist
now computes a skeleton signature and, when unchanged, refreshes times,
progress bar and waveforms on the existing nodes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-05 14:58:10 +02:00
lucianoandClaude Fable 5 e89213b8f9 Fix playlist freeze: self-healing drag guard + identity-based row actions
A lost dragend (dragged node removed from the DOM) left dragFrom/cueDragging
stuck, permanently deferring renderPlaylist: the list stopped redrawing and
row buttons acted on stale indexes (delete/play appeared dead). The guard now
unlocks itself when no .dragging element exists, and row actions resolve the
track index at click time by object identity.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-05 14:52:14 +02:00
lucianoandClaude Fable 5 b04fe01a1a v1.7.1
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-03 14:55:01 +02:00
lucianoandClaude Fable 5 26c9653668 Deactivate button for the 3D effect
'Disattiva' in the Animazioni 3D tab restores the last non-3D preset
(tracked by applyEffect), answering 'how do I turn the 3D output off'
without hunting through the effect library.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 17:15:38 +02:00
lucianoandClaude Fable 5 8b4b2cbfa8 Per-zone effects in projection mapping
New 'Zona Effetto': each zone runs its own preset on an independent
offscreen Visualizer (960x540, own WebGL context), stepped with the
shared clock and audio so every panel dances to the same music with a
different effect (fluid presets included; interactive/3D excluded).
Zone row gains family/preset selectors; engines are created/destroyed
as zones change and their canvases uploaded as zone textures each
frame. Guide updated with the performance note.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 17:09:20 +02:00
lucianoandClaude Fable 5 3d91806581 v1.7.0
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 16:43:17 +02:00
lucianoandClaude Fable 5 e156714378 Collapsible quick guide inside the Mappatura tab
A details/summary walkthrough: what mapping is, the three steps
(activate, create zones, drag corners on the output), every per-zone
option with a multi-panel Porzione example, and the persistence/
recording notes.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 16:36:28 +02:00
lucianoandClaude Fable 5 0daa89656f Projection mapping: warped zones for images and the live visual
New Mappatura tab + mapping.js engine: each zone is a quad warped with a
projective homography (square->quad closed form, inverted per fragment)
on a dedicated WebGL2 canvas above the visual, black outside. Sources:
the live visual (with a source sub-rect for multi-panel LED walls) or an
image file (corner-pin onto physical surfaces). Edit mode draws handles
ON THE OUTPUT: corners (or whole quads) are dragged while looking at the
real projection, edits flow back to the panel which persists them. Zone
list with name, source portion, opacity and delete; included in
recordings; re-sent when the output restarts.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 16:22:43 +02:00
lucianoandClaude Fable 5 a3991e0f92 Dark native controls: readable dropdowns on Windows
color-scheme: dark makes Chromium render the native select popups and
scrollbars dark on Windows (they defaulted to white with our light text
on top), plus explicit dark backgrounds on select/option as a fallback.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 15:09:43 +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 a869d5b969 Arm spread slider range up to 70 degrees
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 13:06:35 +02:00
lucianoandClaude Fable 5 7a8e71e170 v1.6.0
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 13:00:26 +02:00
lucianoandClaude Fable 5 054c00f51e Arm spread: pose-aware outward axis
The fixed front-axis rotation degenerated on poses with the arms bent
forward (vector nearly parallel to the axis — why the mannequin showed
no effect on salsa-like moves). The swing axis is now computed per
frame as cross(current arm direction, character outward side), so the
arm is always pushed away from the torso regardless of the pose, and
the rotation naturally vanishes once the arm already points outward.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 12:16:41 +02:00
lucianoandClaude Fable 5 a69cac0ebd Per-model arm spread against limb/body intersection
Dance clips are authored for the standard mannequin: on chunkier models
the same joint angles drive the arms through the torso (the ninja is
clean because its proportions match). New 'Apertura braccia' slider
(0-35deg, saved per model path): the upper arms get an extra outward
rotation about the world Z axis during clip playback (left +, right -),
solved back into each bone's local frame through the parent rotation.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 11:58:17 +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 a8da0a4c9d Model library: remembered GLBs with one-click switching
Every loaded model (GLB or converted FBX) is added to 'I miei modelli'
in the Animazioni 3D tab: click a name to switch the dancer instantly
(active one highlighted), x removes it from the list (file untouched).
Persisted in localStorage; the current model is seeded on first run.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 11:49:44 +02:00
lucianoandClaude Fable 5 06ae7bc422 Smooth hips: no horizontal root motion, tanh-saturated bounce
The hard clamp made out-of-scale clips ride its boundary and jerk the
model left/right. Hips translations now stay pinned horizontally (the
framing compensation cancelled that motion anyway — the moves live in
the legs and torso) and the vertical bounce saturates smoothly via tanh
at 0.8x the rest length. Same-rig baked clips render identically since
their root motion was already being compensated.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 11:46:22 +02:00
lucianoandClaude Fable 5 3d90c5b248 Keep dancing models in frame: clamped root motion + wider clip planes
New FBX models could periodically vanish: foreign clips with
out-of-scale hip translations threw them past the camera frustum, then
the loop brought them back. Three guards: the unit-rescale triggers at a
1.75x ratio (was 3x), the sampled translation offset is hard-clamped to
1.2x the bone rest length, the residual vertical bounce is capped at
half the model radius, and the near/far planes widened (0.02-8x dist).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 11:44:00 +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 bc3ad8cc20 Library clips: Hips-only translations to avoid distorting the model
Some Mixamo clips carry translation keyframes on every bone; bound to a
model with different proportions they stretch/crush the limbs (bone
lengths must come from the target skeleton). Library binding now keeps
translations only for the Hips (root motion); rotations drive the rest.
Clips baked into a model keep their full channels.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 11:34:22 +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 a5c0a8b297 3D families move from the effect library to the Animazioni 3D tab
'Modello 3D', 'Interattivo Modello' and 'Interattivo Avatar' no longer
appear in the Effetti family filter or the preset list: the new
'Effetto 3D' block in the Animazioni 3D tab has its own family/preset
selectors (palette · variant) and an Attiva button, applying through the
same applyEffect path. Saved pads/sequences/scenes keep working (preset
indices untouched).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 11:24:41 +02:00
lucianoandClaude Fable 5 a6728ec535 Repertoire as an aligned two-column checkbox list
The Auto VJ pill style (hidden checkbox, ragged flex wrap) didn't fit
the long clip names: #glb-anims now lays out as a two-column grid with
visible aligned checkboxes, ellipsis on overflow and green accent.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 11:20:42 +02:00
lucianoandClaude Fable 5 43e8125d3b Dedicated 'Animazioni 3D' tab in the control panel
The 3D model controls outgrew the SVG section: model load + backdrop,
dance repertoire, extra animations and manual BPM/TAP now live in their
own tab between Effetti and Pad. All element ids unchanged, wiring
untouched.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 11:18:42 +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 83fc655219 Any shader family as the 3D model backdrop
The uber-shader pass is now reusable (_renderUber): choosing 'fam:<i>'
in the Sfondo Modello 3D selector renders that family first (tinted with
the active preset's palette/hue/sat) and overlays the model on top. The
selector lists every family except fluids (already explicit options),
interactive and Modello 3D itself.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 11:03:55 +02:00
lucianoandClaude Fable 5 b45c7078dc Fluid backdrop behind the 3D model
New 'Sfondo Modello 3D' selector (Media tab): gradient or any of the
five fluid modes. The fluid sim paints the canvas first, then the model
renders on top clearing only the depth buffer (overlay mode skips its
own backdrop pass). Palette and speed are shared with the preset;
persisted and re-sent when the output restarts.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 10:59:19 +02:00
lucianoandClaude Fable 5 173d85b681 Half-time clips and beat double-count fix
Expressive choreographies (Thriller, breakdance, flair, spins, moonwalk)
are authored one count per TWO beats: a per-clip pace factor (name
heuristic) halves their count rate. The beat clock also gained a
refractory window (60% of a period) so energetic tracks firing on both
kick and snare no longer double the detected tempo, which made every
clip race.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 10:55:33 +02:00
lucianoandClaude Fable 5 d905146b13 Zero-lag beat lock: feed-forward timeline + latency lead
The pure exponential follower trailed the beat clock by its time
constant (~110ms), which read as the dancer being late on the kick. The
clip timeline now advances by itself at the metronome rate (feed-forward,
zero structural lag) while a gentler follower only corrects drift, with
a 50ms lead compensating beat-detection/display latency and a hard
resync when the error exceeds 1.5 beats.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 10:53:01 +02:00
lucianoandClaude Fable 5 d17cd42958 Fluid beat-lock: linear extrapolated phase + soft timeline chase
The phase-locked playback felt mechanical: the smoothstepped phase made
the clip accelerate/brake every beat, and the hard clamp at phase 1
stalled motion when the next beat ran late. The beat clock now exposes a
linear phase that keeps running past 1, and the director chases the
beat-locked timeline with an exponential follower (~110ms) that absorbs
metronome re-syncs. The procedural sway keeps its eased phase (there the
easing reads as groove).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 10:49:58 +02:00
lucianoandClaude Fable 5 cb2db1550c Phase-lock the dance clips to the beat
Clips used to play at their authored tempo, so the steps drifted against
the music. A shared beat clock (detected beats + free-running metronome
in the gaps) now drives the clip timeline directly: one choreography
count (0.5s of clip, ~120bpm authoring convention) per music beat, with
a smoothed phase inside each beat. Steps land on the kick at any track
BPM; the variant speed doubles the count rate; move switches and the
procedural dance reuse the same clock.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 10:45:16 +02:00
lucianoandClaude Fable 5 616e70a34d Dancers follow the music clock, not the visual-speed slider
The global speed control multiplies the visual time, which froze the
dance clips at low values (only max speed showed motion). Clip playback,
the dance director and the procedural dance now run on a real-time
clock — only the preset variant speed scales the moves. The translation
unit-rescale also samples the peak of the first keyframes (robust when a
clip starts near the origin) and clamps the factor.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 10:41:38 +02:00
lucianoandClaude Fable 5 14e5b48176 scripts/merge-mixamo.py: fuse a Mixamo character + N dance FBX into one GLB
Recovers the embedded diffuse when the FBX references missing external
textures, discards animation-file objects keeping only their actions,
retargets bone-name prefixes (mixamorig vs mixamorig1) so clips recorded
for another character land on the base rig, and exports all clips as NLA
tracks for the dance director.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 10:37:02 +02:00
lucianoandClaude Fable 5 43a3431532 Dance clips from foreign rigs: unit rescale + dynamic framing
Clips merged from other Mixamo FBX files can carry hip translations in
a different unit (cm vs m): translation channels are auto-rescaled
against the node's rest pose (first-keyframe ratio > 3x). The dancer
also stays framed: the clip's root motion is cancelled horizontally
(hips world position vs rest) keeping 40% of the vertical bounce, so
travelling moves like moonwalks don't slide out of the camera.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 10:33:17 +02:00
lucianoandClaude Fable 5 6529316bd9 Dance director: multi-clip GLBs switch moves in time with the music
GLBs can carry several animation clips (merged from Mixamo FBX files
with scripts/merge via Blender NLA tracks). The director loops the
current move and switches to a random different one every 16 beats (or
~14s without beats) with a 0.45s pose crossfade (per-node quaternion
nlerp + translation lerp).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 10:21:40 +02:00
lucianoandClaude Fable 5 31bfc96f12 Rigged models dance to the music (Modello 3D family)
Two paths for skinned GLBs with no live body driving them:
- animation clips in the GLB (e.g. Mixamo moves) are parsed (rotation/
  translation channels, nlerp sampling) and looped at the effect speed;
- without clips, a beat-locked procedural dance drives the FK targets:
  arms pump on alternate beats, hips sway, head nods, knees bounce, with
  a free-running metronome keeping the groove between detected beats and
  bass scaling the amplitude.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-31 00:47:41 +02:00
lucianoandClaude Fable 5 748d036ff6 GLB skinning + Mixamo retargeting: rigged models mirror the tracked body
The GLB loader now reads skins (JOINTS_0/WEIGHTS_0, inverseBindMatrices,
node hierarchy kept instead of baked); a skinned shader variant blends 4
joint matrices per vertex (up to 80 bones). _computeJoints solves FK
retargeting: for each mapped bone (mixamorig arms/forearms/up-legs/legs/
neck/spine) an extra local rotation aligns its chain child with the
world direction measured between the tracked landmarks — the user's
right side drives the character's Left bones (mirror). Interattivo
Avatar: when the loaded GLB has a skeleton it drives the rig (bounding
box from CPU-skinned samples, pelvis-follow track), else the procedural
armoured robot. Validated with a Mixamo Y-Bot: synthetic raised-arm pose
reproduced exactly.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 20:59:37 +02:00
lucianoandClaude Fable 5 88838792e1 Avatar redesign: armoured robot instead of primitive boxes
New primitives (tapered capsule with rounded caps, superellipsoid
rounded box) and a full body redesign: three-segment torso (chest plate,
dark abdomen, pelvis plate) with glowing core and belt light, helmet
with visor/jaw/ears/antenna, shoulder pads, tapered capsule limbs with
elbow/knee joints, hand plates with wrist lights, boots with toe lights.
Two-tone armour tinted by the palette, emissive details in colorB.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 20:44:43 +02:00
lucianoandClaude Fable 5 a0edb14d1e Avatar works seated: only shoulders required, bust mode without hips
Sitting at a desk the hips are rarely visible, which made the avatar
never appear. The pelvis is now synthesized below the shoulders when
hidden (torso/head/arms as a bust; legs return when actually visible).
The output also reports diagnostics to the panel: pose tracker failed,
or avatar active with no body detected for 5s.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 18:44:00 +02:00
lucianoandClaude Fable 5 08414070a9 Interattivo Avatar: a robot whose limbs mirror your tracked body 1:1
Raise your arm and the robot raises its arm. ModelSim gains primitive
meshes (cube/sphere) and renderAvatar(): parts placed by limb matrices
(basis aligned to each bone segment) with the same lighting as the GLB
renderer. interactive.js keeps the mirrored raw landmarks (with depth,
smoothed) and builds the robot every frame: torso sized from the
shoulders, head with accent visor and antenna, articulated arms/legs
with joint spheres, glowing hands, feet. Falls back to the motion mist
when no body is tracked.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 18:39:24 +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 7f0e8b94a7 Interattivo Modello: camera-driven 3D model puppet
New interactive mode 'model': the webcam motion drives the GLB model as
a physical puppet — a hand swipe spins it with inertia, it leans toward
the motion centroid, strong agitation makes it hop with squash & stretch
and a touch-glow rim. ModelSim.render accepts an optional pose (yaw,
leanX, hopY, squash, rim) and slows its auto-spin when driven live.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 18:18:11 +02:00
lucianoandClaude Fable 5 65fb6ae895 Modello 3D family: audio-reactive GLB model renderer
New model3d.js: minimal GLB loader (JSON+BIN chunks, accessors with
byteStride, node hierarchy baked into vertices, embedded PNG/JPEG base
colour textures) and a WebGL2 renderer on the shared canvas — palette
fill light, beat-pulsing fresnel rim, treble speculars, bass breathing
via normal displacement, orbiting camera auto-fitted to the bounding
box, gradient backdrop with a bass glow. A generated torus knot shows
before any GLB is loaded. 'Carica un modello .glb' button in the SVG
section; the path persists and is re-sent when the output restarts.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 18:12:28 +02:00
lucianoandClaude Fable 5 b90066de6a v1.5.1
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 18:04:34 +02:00
lucianoandClaude Fable 5 6e024efa29 Fix overlay-image blend (Fusione) broken by compositing isolation
Two culprits made mix-blend-mode silently stop compositing the overlay
images against the canvas: the translateZ(0) on the LED-area #stage and
the z-index on the overlay layer — both turn their element into an
isolated stacking context, so the images could only blend against the
(empty) layer itself and rendered as opaque rectangles (which also hid
the beat pulse). Stage children now use position:absolute (no transform
needed for containment) and the output layers carry no z-index at all,
stacking purely by DOM order (identical to the old z order). Verified
pixel-level: black square over red in 'difference' now reads red.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 18:01:40 +02:00
lucianoandClaude Fable 5 1c9bdd1d3c Drag & drop reordering: playlist tracks and timed-scene elements
Playlist reordering existed but was broken whenever a track was playing:
the ~400ms progress re-render replaced the dragged node and cancelled the
browser drag instantly. renderPlaylist now defers rebuilds until dragend,
drops show an insertion marker (top half = before, bottom half = after),
and internal drags no longer trigger the file-drop overlay.

Scene editor: elements get a drag grip; since the list is always shown
time-sorted, dropping an element between two others moves its appearance
time between theirs (before the first = half its time, after the last =
+5s). Grip-armed dragging keeps the sliders inside the cards working.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 17:51:15 +02:00
lucianoandClaude Fable 5 529cfcb9d8 v1.5.0
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 17:29:40 +02:00
lucianoandClaude Fable 5 65b4e7fa35 Metallo Liquido family: liquid-metal chrome tunnel with molten veins
Rounded-square tunnel sections (circle/Chebyshev mix, fbm-wobbled like
molten chrome) flying toward a blinding core; ridged-fbm facets catch a
cool wash from the depth with sparse speculars on periodic section
frames. Molten veins in the palette's complementary colour (Neon: cyan
walls + red veins, like the reference) pump with bass/beat. Shader
family index 58; in the Auto VJ peak pool.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 14:47:12 +02:00
lucianoandClaude Fable 5 de85639aaf LED wall active area: confine the output to a pixel-mapping rectangle
New 'Area LED' controls in the Schermo tab: W x H @ X,Y. Everything
(canvas, videos, images, logos, ticker) lives in a #stage box whose
transform makes it the containing block for the fixed layers, so resizing
it confines the whole show at once, black outside. The canvas resizes to
the stage, so shaders render at the wall's native resolution. Persisted
in localStorage and re-pushed when the output window (re)starts; the
recorder follows the canvas position.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 10:41:23 +02:00
lucianoandClaude Fable 5 c1b3f9c311 Onda 3D family: silk-ribbon wireframe of the live waveform
Two bands of fine strands (iso-lines of the band coordinate) flow across
the screen, compressing into moire at the folds like a 3D wireframe
surface. Hue ramps across each band through magenta (warm crest, cool
belly). The centre curve mixes drifting sines with the live waveform;
bass swells the band, beat brightens. Shader family index 57; in the
Auto VJ quiet/groove pools. wamp() now interpolates between waveform
samples to avoid stair-step artifacts (also smooths Onda Luminosa).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 10:24:45 +02:00
lucianoandClaude Fable 5 c40f804740 Cinematic audio-light families: Onda Luminosa and Spettro Neon
The live waveform (uWave) drawn as a horizontal beam of light with a
white-hot crest, lens flare, vertical light pillars on loud columns,
twinkling cross sparkles, rays converging on the vanishing point and two
bokeh layers; Spettro Neon puts the 32-band spectrum on the same stage as
mirrored neon bars with hot tips. Shader family indices 55-56 (44-54 are
the interactive families, which never reach the shader). Both added to the
Auto VJ pools.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-30 10:16:36 +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 7e745743c5 Ten more interactive camera families: bubbles, balloons, particle mirror, cloth, light painting, touch fluid, electric silhouette, swarm, tile wall, firewall
interactive.js becomes a multi-mode engine sharing camera, motion grid,
gradient/centroid tracking and the mouse fallback. New renderers: point/line
sprites (mirror/swarm/cloth/pops) and a ping-pong trail FBO (painting).
fluid.js gains a 'touch' emitter mode fed by motion splats from the camera.
Mirror mode reforms the custom SVG/image if loaded, else a DJ LUZA wordmark.
UNPACK_ALIGNMENT set to 1 for non-multiple-of-4 single-channel uploads.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-29 23:26:34 +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 Fable 5 f2121c0fc5 Bump Electron 31.7.7 -> 33.4.11: macOS XProtect kills Electron 31 as malware
XProtect (macOS 26) matches a malware rule on Electron 31.x ad-hoc binaries
(false positive: it also killed a checksum-verified official download) and
moves them to the Trash. Electron 33.4.11 is not matched and the app runs.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-29 17:51:07 +02:00
lucianoandClaude Fable 5 4aad50b362 Scenic family "Supernova": cosmic burst with electric tendrils
From the reference video: bright crackling core, organic branching
lightning filaments (ridged fbm in mirrored polar space, slowly rotating
to hide the seam), two layers of radial particle streaks flowing outward,
nebula haze. Bass pumps filaments and outflow speed, beat punches the
core, treble twinkles the particles. Family index 43 (fieldRGB path).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-20 16:48:47 +02:00
lucianoandClaude Fable 5 19aab4e61e Reels: timed recording with auto-stop
recStart now carries the format and an optional maxMs; the output stops
itself when the time is up (15/30/60/90s picker in the control UI), so a
reel doesn't depend on a manual stop.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 15:51:51 +02:00
lucianoandClaude Fable 5 48ac3dfa85 Auto VJ: selectable family pool (smart / all / custom checklist)
Three modes for where the director draws presets from: 'smart' keeps the
curated per-mood pools, 'all' removes the family restriction, 'custom'
limits picks to a user checklist (mood still shapes the speed variant,
with a fallback when the checklist exhausts it). Config persists in
localStorage and is re-pushed live while the director runs.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 15:37:25 +02:00
lucianoandClaude Fable 5 46afd5d318 Auto VJ: a director that adapts the visuals to the playing track in real time
The audio engine now tracks musical features: fast/slow energy EMAs, BPM
(median of beat intervals), a quiet/groove/peak mood with hysteresis, and
drop detection (fast energy diverging from slow right after a lull). An
output-side director, toggled from the control UI, switches presets every
16 beats (or ~14s without beats) and immediately on a drop, drawing from
mood-matched family pools (scenic for quiet, fluid/geometry for groove,
fractals/tunnels/fire for peak) while avoiding recent repeats. A manual
effect pick takes over and turns the director off.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 15:32:18 +02:00
lucianoandClaude Fable 5 d5b48477ad Seven scenic RGB families: Cielo, Aurora, Mare, Montagne, Galassia, Solidi 3D, Griglia Neon
New fieldRGB path in the uber-shader (families 34+): scenes return full
colour instead of a palette-mapped scalar, with the palette tinting the
scene (hue/sat/contrast still applied via colorizeRGB). Sky with drifting
fbm clouds and sun; aurora curtains over twinkling star dots (stars light
a dot inside the grid cell, not the whole cell); perspective ocean with
crests and sun glitter; parallax mountain ridgelines at sunset; spiral
nebula; raymarched morphing solid (box/octahedron/sphere, palette-lit,
beat-pumped); synthwave grid with striped retro sun. Audio: bass drives
sun glow/waves/grid speed, treble twinkles, beat pumps. Scenic families
get a gentler bass-zoom so the horizon doesn't pump. Append-only family
indices (saved presets don't shift). 714 new presets.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 15:20:58 +02:00
lucianoandClaude Fable 5 8645838e1a Fluid: adaptive quality scaling (steps down when the GPU can't hold ~45fps)
Pi V3D ran the sim at 26fps at full res; with the 3-notch auto-downscale
(dye 1024/768/512) it settles at ~52fps. Never steps back up to avoid
oscillation.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 15:09:15 +02:00
lucianoandClaude Fable 5 2181c4bc97 Fluid: four new emitter choreographies (Fuoco, Anello, Vortici, Onda)
Same solver, different figures via e.fluidMode: 'fire' bottom jets with
buoyancy — implemented as relaxation toward a target updraft (an additive
force integrates to the velocity clamp and turns flames into a wall) plus
height-scaled dye dissipation so flames die as they rise; 'ring' emitters
on a spinning circle with radial beat shockwaves; 'vortex' two counter-
rotating stirrers; 'wave' a travelling sine curtain. Stationary emitters
inject a fraction of the stir force (repeated adds at one spot saturate).
408 new presets.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 15:03:46 +02:00
lucianoandClaude Fable 5 14afe0b98c New effect family "Fluido": real-time GPU fluid simulation (ink-in-water)
Stable-fluids solver (fluid.js) on ping-pong half-float framebuffers:
semi-Lagrangian advection, vorticity confinement (clamped — unbounded
confinement overflows half-float and kills the field), 22 Jacobi pressure
iterations, audio-driven dye/force splats. Three wandering emitters inject
palette-coloured dye (brightness-normalized so dark palette entries stay
vivid); bass drives injection and stirring, beats fire directional bursts,
treble adds swirl. Universal modifiers map onto the sim: warp = vorticity,
speed = sim speed (brightness is speed-normalized), sym = kaleidoscope with
a wedge that rotates via rotSpeed, contrast/invert on display.

The Visualizer delegates to FluidSim when the preset has isFluid (flag is
always present so Object.assign merges can't leave it stale). 102 new
presets (17 palettes x 6 variants).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-17 14:48:38 +02:00
luciano 7a79ade428 Bump to 1.4.1 2026-06-22 18:06:00 +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
luciano c98ebda03f Bump to 1.4.0 2026-06-22 16:45:53 +02:00
lucianoandClaude Opus 4.8 26a5000b04 Playlist: scrub/seek playback by clicking-dragging the waveform
Pointer on the waveform now seeks: scrub the playhead on the playing track
(new 'seek' output message setting currentTime) or start a stopped track from
the clicked point (playIndex(i, fromTime)). Grabbing within ~10px of the green/
red handles still adjusts the trim in/out instead of seeking.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 16:45:00 +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
luciano a8973619e6 Bump to 1.3.0 2026-06-22 15:31:33 +02:00
lucianoandClaude Opus 4.8 4afaac08dd Playlist: visual-only 'Intermezzo' items (effects/text/image between tracks)
Add interlude playlist entries with no audio that run their own scene for a set
duration, then auto-advance. Shares a unified timed-segment runner with the
inter-track gap (pause/resume via the Play button). New 'playSilence' output
message + audio.silence() to stop audio while keeping meters/recording alive.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 15:16:32 +02:00
lucianoandClaude Opus 4.8 ed73c016f3 Playlist: auto-blend video under active scene effect; inter-track pause/intermission with continuing scene
- When a playlist video has an active scene effect, auto-apply 'screen' blend so
  the effect shows through (only if the user left blend at default 'normal';
  manual choices are respected). Restores on effect-off / next track.
- Per-track 'Pausa dopo' (seconds): after a track ends, keep its scene timeline
  running for N seconds as an intermission (scene elements placed past the song
  length appear during the pause), then advance. Countdown + badge in the row.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 15:10:33 +02:00
lucianoandClaude Opus 4.8 57a6bea3b4 Scenes: clear stale text/image when a track (re)starts
On restart, lastScene was reset to null and a channel with nothing active at
t=0 also evaluated to null, so the diff saw 'no change' and never sent the hide
command — leftover scene text stayed on screen. Use an undefined sentinel so
advanceCues applies (and thus clears) every channel once at scene start.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 14:56:40 +02:00
lucianoandClaude Opus 4.8 56230cb3b0 Scenes: independent per-element timing (effect/text/image) with full inline options + duration; dedicated Playlist tab
Each scene element (effect, text, image) now has its own appearance time and
optional duration, with all styling options inline (no more capture-from-panel).
Live preview applies edits immediately on the playing track. Moved the playlist
and its video-render controls into a new Playlist tab.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 14:53:05 +02:00
lucianoandClaude Opus 4.8 dc37e4ab3f Playlist: fix video track restart; per-cue full effect picker (family + preset dropdowns)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-22 14:42:29 +02:00
lucianoandClaude Opus 4.8 96a8f3104c Bump to 1.2.0 for new release
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-20 01:57:47 +02:00
lucianoandClaude Opus 4.8 4dc873bc27 Make effects react to audio much more visibly (brightness pulse, beat flash, bass zoom)
The visuals received the audio correctly but modulated only small terms, so the
reaction was subtle versus the clearly-moving meters. Strengthen the universal
audio response in the shader without touching meter calibration.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 17:29:25 +02:00
lucianoandClaude Opus 4.8 35f7addb03 Scrolling text: 'side edges' mode with characters stacked vertically on both borders
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 17:18:19 +02:00
lucianoandClaude Opus 4.8 8db2578eba Richer scene cues: full text styling (direction/effect/font/size/color) and
image size/position, plus a redesigned scene editor UI

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 17:11:05 +02:00
lucianoandClaude Opus 4.8 144aaaa233 Docs: comprehensive README of all features; bump to 1.1.0
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 17:03:43 +02:00
lucianoandClaude Opus 4.8 4604b42f8f Scrolling text: vertical direction option (up / down) in addition to horizontal
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 17:01:40 +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 0f0accc67d Playlist supports video tracks (full-screen video + audio through the analyser)
Audio and video files can both be added to the playlist; video tracks play
full-screen with their audio routed through the analyser (visuals/waveform
react), have duration/progress, and are included in recordings. Persisted.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 16:46:44 +02:00
lucianoandClaude Opus 4.8 1ae8fa81a7 Add video layer: load VJ video loops that blend with the visuals
Loads a muted looping video as a layer above the WebGL canvas with opacity,
blend mode and fit controls; included in MP4 recordings and droppable.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 16:37:59 +02:00
lucianoandClaude Opus 4.8 5c60a38ff1 Release packaging: unsigned mac DMG build + install/security-bypass docs
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 16:28:06 +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 8925fa50f9 Per-track scenes: auto-apply effect + text + image when a playlist track starts
Each playlist track gets an optional scene (🎬) bound to it: pick the current
effect, a ticker text and an overlay image. When the track plays, the scene is
applied automatically — a cue/queue per song. Scene image is a dedicated output
layer (also captured in recordings).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 16:08:50 +02:00
lucianoandClaude Opus 4.8 67a4a32dea Waveform: scrolling amplitude envelope (song-style) tied to the speed slider
Replaces the fast instantaneous oscilloscope with a mirrored filled waveform
that scrolls over time like DJ-software waveforms; scroll rate follows the
visual speed control.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 15:58:46 +02:00
lucianoandClaude Opus 4.8 eee3c63133 Smoother waveform: 256 samples + interpolated segment-distance line
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 15:53:51 +02:00
lucianoandClaude Opus 4.8 5f9e33b7dd Add waveform (oscilloscope) and band-reactive effect families
- Time-domain waveform uniform (uWave) fed to the shader.
- New families: Waveform, Waveform Radiale, Tri-Banda (concentric per-band zones),
  and Reattivo Bassi/Medi/Alti (single-band reactive).

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 15:50:20 +02:00
lucianoandClaude Opus 4.8 19085e9c16 Playlist: click a track name to (re)start it from the beginning
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 15:46:54 +02:00
lucianoandClaude Opus 4.8 9653306a68 Text effects, pad crossfade, playback progress + per-track durations
- Scrolling text: font, size, weight, colour and movement effects (up/down, wave,
  zoom, flash, rotate) rendered per-letter (and captured in recordings).
- Larger multiline text input.
- Pad bank: crossfade between pads (per-source gain ramps in the audio engine).
- Duration + remaining-time and progress bars for the playlist and the active pad,
  via metadata probing and live progress reports from the output window.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 15:44:28 +02:00
lucianoandClaude Opus 4.8 0a04df32de Pad bank: assignable per-pad hotkeys (persisted)
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-19 15:28:49 +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