Commit Graph
34 Commits
Author SHA1 Message Date
lucianoandClaude Opus 5.5 e754656585 Mapping: mini-editor in the control panel + keyboard nudge
Editing corners with handles on the output is unmanageable on a large LED
wall (7x4 m): the hand has to work on the giant screen. The Mappatura tab
now has a scaled replica of the output (aspect from the output display or
the LED area) where zones are dragged by corner or whole, with live sync
to the output (one IPC per frame). Keyboard on the focused editor: arrows
nudge 1 output pixel, Shift 10 px, Tab cycles corners, Esc = whole zone;
keys never leak to the global hotkeys. Selection is shared with the zone
list and highlighted on the output handles; a status line shows pixel
coordinates.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01XVMQ2JhsJ77pGKqcvvFHqc
2026-10-02 09:13:01 +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 fe1cada045 Aux text = full ticker; scene effect cues get a target screen
The per-monitor overlay text now reuses the main output's ticker wholesale
(same DOM structure and style.css classes): direction h/vertical/side-edges,
letter effects (wave/zoom/flash/rotate/updown), the 8 fonts, position, size,
weight, color, speed, and the audio-reactive glow — the complete Testo tab
option set. Scene 'effect' elements gain a 'Su' selector (main output / one
aux display / all screens); each target is an independent cue channel so
same-time cues aimed at different monitors all fire, and aux windows in
follow mode ignore the all-screens broadcast (they already follow).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-08-05 15:48:08 +02:00
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 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 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 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 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 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 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 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 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 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 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 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 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 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 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 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