2.1.0 — Layer compositing, GPU effect chain, 3D geometry, tempo & DMX
This release adds the engines a VJ rig is actually built on: a layer compositor, a 15-effect GPU chain, a 3D geometry engine driven by 35 verified mathematical formulas, BPM detection with an auto-VJ, and Art-Net/DMX output.
Everything is verifiable: npm test runs 41 unit tests, and npm start -- --smoke exercises every mode, background, effect, and formula on the real GPU.
⬗ Layer compositing
The scene is no longer a fixed stack but an ordered list of layers. Each layer has its own source (background, visualizer, media, visual objects, logo), blend mode, opacity, transform, audio response, and its own settings — so one scene can hold two bar layers in different colors, or a mandala laid over a shader.
- 17 blend modes — add, screen, multiply, overlay, difference, color dodge/burn, hard/soft light, hue, saturation, color, luminosity…
- Per-layer scale, rotation, position, mirroring
- Audio-driven opacity / scale / rotation modulation with band selection
- Reorder, enable, and disable layers from the panel
Nothing breaks. With an empty layer list the scene is synthesized from the legacy fields, so v2.0 settings, scenes, and preset packs render identically. That was verified frame-by-frame against a pre-refactor export.
✦ Post-processing effect chain
15 GPU effects applied in order to the composited scene: bloom, chromatic aberration, glitch, film grain, CRT/scanlines, pixelate, kaleidoscope, mirror, color grade, vignette, trails/echo, edge highlight, zoom blur, ripple distortion, posterize.
The order changes the result, every parameter can be bound to an audio band, and the chain runs the same way on export.
Only users of the feature pay for it: with an empty chain the scene is composited by the browser's GPU compositor; adding the first effect switches the engine to a single merged surface.
◈ 3D geometry from 35 mathematical formulas
Audio-reactive geometry in true perspective, in four families:
| Family | Examples |
|---|---|
| Surfaces (12) | Sphere · Torus · Klein bottle · Möbius strip · Supershape (Gielis) · Boy's surface · Dini surface · Seashell · Spherical harmonic · Chladni pattern · Ripple surface · Plane |
| Plane curves (12) | Lissajous · Rose curve · Epicycloid · Hypotrochoid · Superformula · Butterfly · Lemniscate · Astroid · Cardioid · Phyllotaxis · Logarithmic spiral · Harmonograph |
| Space curves (4) | Torus knot · Helix · Viviani curve · Trefoil knot |
| Attractors (7) | Lorenz · Rössler · Thomas · Aizawa · Halvorsen · Clifford · de Jong |
Surface / wireframe / point rendering, four deformation modes, four coloring modes. Each formula's own parameters become sliders automatically.
On the accuracy claim. 30 of the 35 formulas are closed-form, and every one of them is checked in tests/formulas.test.js against values derived by hand from the definition — that the Viviani curve stays on its sphere, the torus tube radius, the m↔n antisymmetry of Chladni patterns, the bounds of the Clifford and de Jong maps. A catalog test prevents a formula marked "closed form" from being added without a test. The remaining 5 are numerically integrated attractors and are labeled as such, with the badge visible in the panel.
The engine uses its own matrix math — no third-party 3D library. The mesh is built once and stays on the GPU; audio deformation happens in the vertex shader, so even a 96×96 surface costs nothing per frame on the CPU.
🥁 Tempo and Auto VJ
BPM is estimated from a period histogram of beats found via spectral flux. Every beat pair in the last 8 seconds votes, so a single missed beat cannot halve the tempo. Tap tempo and a BPM lock are included.
Measured: 90 / 120 / 128 / 140 / 174 BPM → 89.8 / 120.4 / 127.9 / 140.0 / 173.7
Auto VJ switches scenes, visualizers, or color presets every N bars or seconds; in bar mode the transition is aligned to the beat.
🎚️ Art-Net / DMX output
Scene colors go out over the standard protocol (ArtDMX, UDP 6454) to lighting consoles, DMX interfaces, and software such as QLC+. Four color sources (scene palette, frequency bands, rolling spectrum, single color), RGB/RGBW fixtures, universe and channel settings.
It does not replace Windows Dynamic Lighting: that drives consumer devices, this drives stage lights.
🎨 58 color presets
Up from 10, in seven groups — Classics, Warm, Cool, Neon & Cyber, Dark, Light, Monochrome Families. They apply to every background, the 3D engine, and Studio shaders alike. The mobile remote now reads the same list instead of keeping its own copy.
🐛 Fixes
- BPM detection halved every tempo above ~125 BPM — that is most dance music. The histogram binned in BPM space, where fixed frame-quantization jitter spreads wider at higher tempos, so 128 BPM lost to 64. Binning now happens in period space. Found by writing the test.
- Video export could not resolve Studio presets, so a scene using a
custommode rendered blank into the MP4. - The phone's ▶ Open button opened on a single display even when several were selected.
- A mobile remote connected on its own kept audio capture running with nothing consuming the frames.
- Preset names ending in "(copy)" were not translated in the English interface.
🧪 Verifiability
npm test # 41 unit tests — formulas, tempo, Art-Net packets
npm start -- --smoke # every engine on the real GPUThe self-test opens every registered visualizer mode and background, compiles every built-in shader and every post-processing effect on the GPU, draws all 35 formulas, exercises multi-display and blackout, renders a real MP4 and checks it is not black, and finally switches the interface to English and scans for untranslated text.
🗺️ Not included
NDI, Spout/Syphon, the complete MilkDrop engine, WebGPU, and Ableton Link are not in this release. What was done instead, and why, is written out plainly in ROADMAP.md.
📥 Download
| File | Description |
|---|---|
CAYADEV Visualizer Setup 2.1.0.exe |
Windows installer (recommended — registers the identity needed for background Dynamic Lighting) |
CAYADEV-Visualizer-2.1.0-portable.exe |
Portable build (no installation; controls lighting only while the app is focused) |
macOS packages must be built on a Mac with npm run dist:mac.