No updates detected yet. GitHub releases will appear here.
The maker's introduction consists of the line above. Read the repository README for more details. Repository README ↗
Loading the full README.
Read the full README ↗Live demo → (Chrome or Edge for video export)
A bespoke 3D Gaussian Splatting manipulator and animator for the browser.
Arbitrary per-Gaussian programmable manipulation via Spark's dyno shader-graph
system, driven by keyframes and by an audio track.
Single file, no build step, no npm install. Dependencies are CDN imports via an importmap: three 0.180, Spark 2.1.0, mp4-muxer 5.x.
Formerly Splatification / Splat Bench. Presets written under the old name still load — the old
splat-bench-presetformat tag is accepted alongside the current one.
ES modules will not load over file:// — it must be served.
python3 -m http.server
Then open http://localhost:8000/ and click Load test asset.
Chrome or Edge is required for video export (WebCodecs VideoEncoder).
Because the whole app is one cached HTML file, use a hard reload (Cmd+Shift+R) after editing, or serve with no-store headers:
python3 -c "import http.server; H=http.server.SimpleHTTPRequestHandler; _e=H.end_headers; H.end_headers=lambda s:(s.send_header('Cache-Control','no-store'),_e(s)); http.server.test(HandlerClass=H,port=8000)"
bandtest.wav). Loading
audio sets the timeline to the track's length and loops it.Dismiss the card with ×; the same things live in the transport bar.
| Tab | Sections |
|---|---|
| Scene | Splat · Camera · Transform · Opacity · Masks |
| Look | Background · Points · Lights · Colour · Depth · Optics · Film · Frame · Grain |
| Motion | Noise · Fracture · Quantise · Wave · Smear |
| Audio | Meters · Mappings |
| Export | Output · Preset · Viewport |
A tab shows a count when parameters inside it are driven by keyframes or audio, and a dot when something is changed from its default.
Length in the transport bar replaces the old Duration slider (Camera) and the Loop / “× set” controls (Audio):
Loop repeats a track that is shorter than the timeline, in the preview, the envelope lookup and the exported audio alike. Camera Orbit turns and the light rig's Orbit both count per timeline loop, so whole numbers are seamless.
Preview playback uses Web Audio: the decoded track loops sample-accurately and each timeline pass is scheduled on the audio clock ahead of time, so loops are gapless in the preview as well as the export. While audio is playing, the playhead follows the audio clock, so the picture cannot drift from the sound.
The file is analysed offline into band envelopes rather than sampled live, so scrubbing, playback and export all agree. Four sources:
Mapping. Arm a band under Map (transport bar), then click any slider in the rail — the slider does not move, it gains a coloured band tag. Click a mapped slider again to unmap; Esc finishes. Every mapping is listed under Audio → Mappings with its depth, smoothing and a remove button; clicking a name jumps to the control. Depth is a fraction of the control's whole range (negative pushes it down). Audio adds on top of the slider and any keyframes.
Smoothing presets — Punchy, Smooth, Swell, Gate — set attack, release, gain, floor and curve together. The lane's Shape ▾ still exposes every field, plus lag (negative lag lands an effect on the beat rather than after it).
The old way in still works: click a parameter's name to focus it in the lane and pick a band there.
Most effects are a single dyno.dynoBlock running in one GPU pass as an
objectModifier on the SplatMesh:
This is the beginning of the README. Read the rest at the original. Read the full README ↗