|

Composition

Putting everything together. Following the rules, everything is deterministic — driven either by time or by the sound data.

Composition

open full size ↗

"Object settings" configures each stem's shape, the same per-stem type/category/shape/effect controls as the Multitrack visualizer. "Env and Effects" configures everything else, grouped into five sections.

Parameters
  • Lightingbg_mix and obj_mix (phase portrait → anisotropic wave blend, for background and object separately), env_model (0 = anisotropic wave, 1 = drifting caustic), caustic_sharp, rim_light, rim_width, grayscale, overlay_amount (self-overlay contrast), and gamma.
  • Prismprism_intensity, prism_width, prism_angle. A rainbow band mixed on top of everything else, last — independent of the sound level and unaffected by grayscale.
  • Bloombloom_threshold, bloom_strength, bloom_radius.
  • Camera — absolute rotation_x/rotation_y/rotation_z in degrees, direction_h/direction_v (look-target offset), and raw sound_zoom/sound_pan amounts. A separate "Cam light" toggle samples the background from the camera's current facing direction instead of per-pixel.
  • Collapsecollapse_y, flattening the shape along the Y axis.
Scripting

Each parameter has a plain-text identifier (shown above) that a JSON-like editor next to the panel can drive directly, writing a function of t — elapsed seconds — for any subset of them. This is, in effect, keyframing — a compromise against our own rule against it, made so the video can feel like it's going somewhere rather than just reacting in place.

The function scope also exposes getLevel(stem) and getProminence(stem) for a stem's live amplitude and prominence, getProminentStemId()/getProminentStemName() for whichever stem is currently loudest, and smoothstep(a, b, t) for easing between two points in time. A syntax or reference error prints inline instead of silently failing.