Explore
Travel through fractals, raycast mazes, voxel terrain, starfields and neon worlds. Combine them with measurement displays, text, particles and 3D shapes.
Demoscene spirit. Browser-native performance.
MLT Visual Lab is a standalone audiovisual instrument by Maxime LORRAI. Combine procedural worlds, reactive layers and animated 3D volumes, conduct them with music, then record your performance.
One self-contained demo HTML · No account · No CDN · Local procedural operation · English settings
01 / Why it exists
MLT Visual Lab translates the energy of the demoscene into a live composition interface. Its purpose is to explore procedural graphics, expose the relationship between sound and motion, and make audiovisual performances directly in a browser. It can be a music visualizer, a creative playground, a stage backdrop, a procedural-effects study or a real-time video generator.
This edition is an interactive compositor, not a fixed 256-scene film. You choose the scene. The visual families can be switched independently, parameter values can be changed live, and selected controls can evolve automatically on musical beat intervals. A saved state or a launch URL can bring you back to a chosen setup.
Travel through fractals, raycast mazes, voxel terrain, starfields and neon worlds. Combine them with measurement displays, text, particles and 3D shapes.
Use effect selectors, four assignable knobs per effect, preset profiles, one-click randomizers and beat-controlled changes to play the visuals like an instrument.
Capture the final audiovisual canvas in MP4 or WebM where supported, with resolution, bitrate, duration and export audio gain under your control.
02 / First performance
presentation.html and index.html in the same folder. Procedural content and generated music need no external assets. A browser may require one interaction before audible playback.The left menu disappears after ten idle seconds in automatic mode. Move the pointer, use the menu button or press M to bring it back. Audio and visual pause controls are independent.
03 / The visual instrument
The procedural renderer combines separate passes. Backgrounds define the environment; foreground layers add symbols, effects or measurements; procedural 3D volumes use depth, lighting and object-space material coordinates. Transitions accompany changes on their supported procedural paths. Screen treatments add a final visual character.
Raycast maze views, height-map voxel flight, neon road travel, cosmic star trails, Mandelbrot dives, Mandelbulb and Julia variations, GPU spectral feedback, plasma and particles. Foreground shapes include rounded primitives, merging blobs, extruded MLT letters and emoji-inspired volumes.
Choose clockwise or counter-clockwise rotation, multi-axis spin, right/left twists, morphing, explosions and rebuilds, orbiting, bobbing, depth travel, rubber motion, vertex disturbance, spectral deformation or isometric trails.
Polished spectrum, wireframe, procedural textures, chrome, emissive surfaces, iridescence, checkers, stripes, carbon, holograms, lava, toon, X-ray, audio pulse and thermal palettes.
CRT scanlines, snow, interference, chromatic echoes, VHS tearing, phosphor curvature, datamosh-style blocks, pixel-sort-style melting, mirrors, displacement, bloom, dithering, thermal vision, ASCII, trails and prism strobing.
04 / Complete effect & control catalog
Each family contains sixteen named choices, addressed by hexadecimal IDs 0–F. The catalog below lists all 786 physical control names. Most effects have six: four effect-specific controls plus Time Rate and Audio Gain. Spectral Feedback, Webcam View and Mandelbulb Viewer each have twelve. Four controls at a time can be assigned to the visible knobs.
128 choices across 8 families
bgEnvironments, travel, fractals, live sources and GPU feedback.
layForeground imagery, audio measurement, text, particles and an arcade scene.
ltAnimated changes on the supported procedural 2D shader path.
volProcedural signed-distance volumes, rounded primitives and extruded forms.
vtAnimated exchanges between procedural 3D volumes.
matSurface shading and object-space visual character for procedural volumes.
aniTime, depth, rotation, deformation and audio-driven motion.
scrFinal screen treatments and stylized post-processing.
05 / Ergonomics
0–255, with hexadecimal readouts.Default, Subtle, Wide, Dense, Slow, Fast, Soft, Hard, Dark, Bright, Warm, Cold, Audio Lift, Deep Motion, Controlled and Extreme. Manual edits are represented as Custom.
The English left-hand settings panel is responsive and scrollable. It has labelled controls, visible keyboard focus, slider roles and status announcements. Its automatic mode hides it after ten idle seconds, including when the last control still has focus. Pointer activity, interaction, M or the menu button restores it. M does not interrupt text editing or dropdown use; Escape hides the menu unless it is forced visible. Launch options can keep it shown, keep it hidden, or change/disable the idle delay.
Fullscreen, independent visual pause, High/Medium/Low quality, UI frame limits of 24/30/60/120 FPS and Copy Launch Link are available in Performance & Display. Hidden tabs suspend visual rendering unless recording is active. Loading uses a progress display; on-demand shader preparation temporarily shows “MLT is heating up...” and retains the last valid frame.
06 / Audio sources & signal processing
Choose generated music, an ordinary audio file, a CORS-enabled audio URL, microphone analysis or a tracker/MIDI module. The audio analysis tap sits before audible output gain: muting the speakers does not silence the analysis or the recording feed. Microphone input is never monitored through the speakers.
Load a local file through the picker or supply its path through the Windows launcher. Remote URLs need suitable CORS access. Browser decoders determine supported codecs and containers; common MP3, WAV, Ogg, Opus, FLAC, M4A, AAC and audio WebM inputs are accepted by the launcher.
Playback uses an HTML media element connected to Web Audio, rather than decoding the whole track into an application-held PCM buffer. Loop, source offset, volume, mute and audio pause/resume are available. The optional short-clip tempo analysis has its own bounded decoding path.
A repeating 180-second arrangement uses four short pre-generated procedural sample buffers: kick, hi-hat/noise, snare and bass (about 0.24, 0.09, 0.18 and 0.35 seconds). Sawtooth/square oscillator phrases add resonant low-pass acid lines.
The arrangement has an intro, verse, pre-hook, chorus, verse 2, break, chorus 2, acid instrumental break and chorus-to-fade. It needs no externally downloaded music samples.
| Time | Section | BPM |
|---|---|---|
| 0–12 s | Intro | 110 |
| 12–36 s | Verse | 174 |
| 36–48 s | Pre-hook | 182 |
| 48–72 s | Chorus | 188 |
| 72–96 s | Verse 2 | 176 |
| 96–108 s | Break | 96 |
| 108–132 s | Chorus 2 | 190 |
| 132–156 s | Acid instrumental break | 148 |
| 156–180 s | Chorus-to-fade | 178 |
| Component | Implementation |
|---|---|
| Audio context | Shared AudioContext; sample rate chosen by the browser/device. |
| FFT and smoothing | AnalyserNode; FFT size 1024 normally, 512 in software-safe mode; smoothingTimeConstant 0.58. |
| Four reactive bands | 35–160 Hz; 160–650 Hz; 650–2600 Hz; 2600–11000 Hz. |
| Band extraction | Mean byte magnitude over frequency bins, normalized to 0–1. Noise floors: 0.08 / 0.07 / 0.06 / 0.04; gains: 1.7 / 1.45 / 1.3 / 1.35. |
| Reactive shaping | Soft compression: (1 − exp(−2 × value)) / 0.865. Attack constants: 70 / 90 / 110 / 55 ms; release: 420 / 520 / 620 / 280 ms. |
| Phase Meter | Separate 256-sample left/right time-domain inputs; sum/difference display, stabilized against peak amplitude. |
| Audio Scope | Actual (L + R) / 2 waveform; peak/RMS readings and rising zero-crossing trigger. |
| Spectrum View | 24 logarithmic bands, 35 Hz to min(18 kHz, 0.49 × sample rate), with energy aggregation and smoothing. |
| Reactive results | Band-dependent color, intensity, motion, particles and geometric deformation on supported effects; waveform displays follow the actual audio signal. |
| Monitoring and export | Audible gain 0–1; export gain 0–2 on an independent tap. Muting preserves analysis and export input. |
These measurements drive visuals; they are not calibrated studio meters or a mastering chain. This standalone interface does not provide an equalizer, limiter, convolution rack, sample editor, audio conversion or standalone audio-file export.
07 / Tracker & MIDI playback
The embedded Rexporter JavaScript preview player reads XM, IT, S3M, MOD and MID/MIDI. It parses score events and samples, mixes stereo PCM in JavaScript and feeds a 2048-frame ScriptProcessorNode into the shared audio path. It does not require a remote playback service or an external sound bank.
Load Module, Play, Pause and Stop controls expose the source’s status. Pattern Follow reads the actual playback position; MIDI is converted into a quantized sixteen-channel row display. Generated and module/MIDI tempos are supplied directly to musical automation, including tempo changes.
MIDI playback handles notes, velocity, pitch bend, volume, expression, pan, all-notes-off and tempo events with a simple harmonic synthesizer. It does not reproduce General MIDI program-change instruments through a sound bank.
08 / Tempo & beat automation
Automatic BPM uses exact source tempo for generated music and tracker/MIDI playback. Ordinary tracks and microphone signals are estimated from rhythmic content. A manual value from 55 to 240 BPM, including decimals, can replace automatic detection.
Known-duration clips up to 120 seconds and 12 MiB encoded size can be fully analyzed before playback where decoding is available. Longer or unknown-duration sources remain streamed.
Live analysis uses positive spectral flux at a target 40 Hz, resampled to a uniform cadence, with autocorrelation in a bounded 30-second rolling window. A first estimate generally appears after about eight seconds of usable playback, then updates about every two seconds.
Confidence, tempo continuity, alias stabilization and repeated agreement for large jumps reduce unstable changes. Weak percussion, complex rhythms and half/double-time interpretations can still require manual correction.
Enable Beat Randomization, choose its interval and set the scope to Selected Knobs, Selected Effects or Both. Category target boxes select families; each effect’s four lane boxes select the assigned parameters.
Only checked lanes in checked, enabled families are eligible. Disabled visual families are not activated automatically. You can change selection during playback.
The schedule follows the audio clock. Paused or missing audio does not advance it; tempo changes preserve accumulated beat timing, and late frames trigger at most one event rather than a catch-up burst. Automation is off by default.
09 / Your media, your setup
Meshes import geometry only: OBJ vertices/faces are fan-triangulated, normals are generated, and geometry is centered and normalized. External MTL/UV texture packages are not imported.
Export/import JSON preserves selected effects, enabled families, complete per-effect values, bindings, presets, embedded user assets, placement and beat-selection checkboxes. Visual Lab data inside tracker-project JSON is also accepted.
State JSON does not include source music, tempo-controller runtime options or video-controller options. Copy Launch Link includes current visual choices, values/bindings, quality/FPS/scale and BPM/beat selections, but does not embed the loaded audio or visual asset files.
Use state files for embedded visual assets; use startup source/asset arguments for explicit file references.
| 0 · Top left | 1 · Top center | 2 · Top right |
| 3 · Center left | 4 · Center | 5 · Center right |
| 6 · Bottom left | 7 · Bottom center | 8 · Bottom right |
| Input/resource | Limit |
|---|---|
| GIF / WebM visual asset | 16 MiB per file |
| OBJ / STL visual asset | 8 MiB per file |
| Combined embedded visual assets | 64 MiB |
| State JSON input | 80 MiB |
| Module input | 128 MiB |
| Short-clip BPM decoding | 12 MiB encoded input and 120 seconds |
| Imported mesh triangles | 120,000 normally; 24,000 software-safe |
These are application guards, not complete browser-memory guarantees. Decoded media, GPU resources and browser buffering use additional memory.
10 / Video export
| Setting | Available choices |
|---|---|
| Container / codec | MP4 / H.264 + AAC; WebM / VP9 + Opus; WebM / VP8 + Opus, only where the browser reports support. |
| Output resolution | 1280 × 720 or 1920 × 1080 |
| Capture rate | 30 or 60 FPS |
| Video bitrate | 2–40 Mbit/s; requested audio bitrate 256 kbit/s |
| Export audio gain | 0–2, independent of audible output mute |
| Length | Manual stop or optional auto-stop up to 600 seconds |
| File handling | Suggested filename; Stop and Save; Download Last Recording; optional direct disk saving where supported |
Open Video Capture, select settings and click Start Recording. Stop and save, or wait for the auto-stop time. The output contains the final canvas and analyzed audio, including current transitions and beat-scheduled changes. Launch arguments configure recording defaults but never start recording by themselves.
In-memory capture stops near 240 MiB with a nominal 16 MiB reserve. Direct-to-disk capture writes chunks sequentially; its queue pauses at 32 MiB pending, resumes at 8 MiB and stops preventively at 64 MiB. Received chunks are retained rather than silently discarded. Browser chunk sizes are not guaranteed, so these are practical guards, not absolute memory ceilings.
Encoding is real time. Actual frame delivery depends on hardware, browser, codecs and the selected effects. Remote media needs suitable CORS access. Temporary capture tracks, audio taps and resolution changes are released/restored afterward; starting a new capture releases the previous recording’s resources.
11 / Startup & PowerShell-style help
The demo accepts URL query parameters and hash-based command arguments. On Windows, launch-mlt.ps1 also accepts actual local source, state and asset paths, then serves only the page and explicitly selected files on loopback. It uses built-in PowerShell/.NET; Node.js or a separately installed web server is not required.
index.html?bg=hyper-starfield&vol=metablob-morph&ani=orbit&ui=auto
index.html#--bg vaporwave-road --vol mlt-3d-letters --mat fresnel-chrome
index.html?help
.\launch-mlt.ps1 --audio "D:\Music\track.flac" --play --bpm auto --beat-random --beat-every 16 --beat-targets bg,vol --beat-params "bg=1,3;vol=2,4"
.\launch-mlt.ps1 --module "D:\Modules\song.xm" --bg pattern-follow --lay spectrum-view --only bg,lay
.\launch-mlt.ps1 --state ".\show.json" --asset-3d ".\logo.obj" --position-3d center-right
.\launch-mlt.ps1 --help
The launcher supports byte ranges for streaming and has no directory browsing. Keep its PowerShell window open; Ctrl+C stops it. --port changes its loopback port. Relative URL-based startup assets normally need HTTP; selecting files in the interface also works. The launch button on this page uses the relative URL index.html.
help, catalog bg, params bg C, positions, config / args, clear and exit. run, start or launch validates options and reloads the same page with them. It cannot execute Windows commands.
Effect selections accept hexadecimal 0–F, a stable name slug or off. Families: bg, lay, lt, vol, vt, mat, ani, scr. Knob lanes are human-numbered 1–4. Values can use bytes or percentages where documented.
| Argument | Value / behavior |
|---|---|
--bg | Background |
--lay | 2D layer |
--lt, --ltr | 2D transition |
--vol | 3D volume; distinct from audio --volume |
--vt, --vtr | 3D transition |
--mat | Material |
--ani | Animation |
--scr | Screen treatment |
--enable, --disable | Comma-separated families, or all |
--only | Enable only these families; overrides enable/disable |
--on-bg, --on-lay, etc. | Individual family enabled state, 0/1 |
--audio | URL or local file through launcher; generated, none, or picker |
--module | XM/IT/S3M/MOD/MID/MIDI URL or local file through launcher; picker highlights the module selector for user interaction |
--mic | Microphone input; requires permission and is never monitored through speakers |
--source | generated, audio, module, mic, none |
--play | 0/1 playback request; browser autoplay policy may require a gesture |
--mute | 0/1; silence output while retaining analysis |
--loop | 0/1 source repeat |
--offset | Initial seconds for ordinary audio files; does not seek inside a module |
--volume | Audible gain 0–1 |
--bpm | auto (default) or manual tempo 55–240 BPM |
--beat-random | 0/1 beat-scheduled randomization; off by default; --no-beat-random disables it |
--beat-every | Beat interval: 1, 2, 4, 8, 16, 32, 64, 128, 256; default 16 |
--beat-targets | Comma-separated families or all; category target checkboxes |
--beat-scope | params (default), effects, or both |
--beat-params | Knob lane selection: bg=1,3;vol=2,4 or JSON {"bg":[1,3],"vol":[2,4]}; lanes 1–4 |
--state | Visual Lab export or tracker project JSON URL/local file |
--asset-2d | GIF/WebM URL/local file, loaded into the selected 2D effect |
--asset-3d | OBJ/STL URL/local file, loaded into the selected 3D effect |
--position-2d, --position-3d | User-asset position, index 0–8 or named position below |
--seed | Reproducible random seed |
--random | Families to randomize, or all; explicit selection wins afterward |
--preset | Preset name/index, or bg=wide,vol=... |
--bindings | vol.1=scale,vol.2=audio-gain; lanes are numbered 1–4, parameters accept names/slugs/hex indices |
--knobs | Exactly four bytes or percentages per family: vol=32,64,128,255;lay=20,40,60,80 |
--params | Physical values such as bg.zoom-rate=220,vol.scale=75%, or a JSON object |
--charset | ASCII alphabet, index 0–F or named set below; requires --scr D |
--blob-mode | off, bright, dark, motion; requires webcam background --bg 9 |
--cache | Per-family shader cache limit 4–32; volume cache uses this limit minus 4 |
--quality | low, medium, high |
--fps | Rendering cap 15–120 fps, not a hardware performance guarantee |
--scale | Rendering scale 0.25–2 |
--ui | auto, show, hide |
--hide-after | Idle menu delay in seconds; default 10, 0 disables timer |
--fullscreen | Request fullscreen on the first authorized interaction |
--video-format | auto, mp4, webm, vp9, vp8; browser availability applies |
--video-resolution | 720, 1080, optionally with p suffix |
--video-fps | 30 or 60 capture frames/s |
--video-bitrate | 2–40 Mbit/s |
--video-gain | Export audio gain 0–2 |
--video-duration | 0–600 seconds; 0 means manual stop |
--video-name | Suggested recording file name; unsafe filename characters are replaced |
--help, -h | PowerShell-style full-screen help; renderer starts when help closes |
--port | Windows launcher server port only |
--background = bg; --layer = lay; --layer-transition = lt; --volumes = vol; --volume-transition = vt; --material = mat; --animation = ani; --screen-fx / --postfx = scr.
--on / --off alias enable/disable. --on-SLOT BOOL or --enable-SLOT controls one family; --off-SLOT, --disable-SLOT or --no-SLOT disables it. Boolean options also accept their --no-OPTION negation. --autoplay aliases play; --param aliases params; --param-SLOT-NAME VALUE addresses a physical parameter directly.
Query arguments are read first; hash arguments override repeated scalar values. State is imported first; seeded random selection precedes explicit effect choices. Explicit presets, bindings, knobs and physical parameter values apply afterward; physical --params wins over knob values. Explicit asset URLs replace imported assets. --only wins over enable/disable. The final repeated scalar value wins. Unspecified imported settings are preserved.
Use --random for one-time startup effect selection. Use --beat-random for repeated musical scheduling. In --beat-params, bg=none or JSON {"bg":[]} clears a category’s lanes; repeated specifications update categories, with the last entry per category winning. Quote semicolon-containing values in PowerShell. URLs may enter browser history and logs: never put secrets in launch arguments.
12 / Rendering, requirements & practical limits
Picker-loaded files are processed in the browser; the demo does not upload them to a playback or rendering service. This presentation embeds its screenshots, CSS and script. Neither page requires externally hosted fonts or imagery. Network requests occur when you choose remote source URLs or open external references.
This maintenance edition incorporates the current Maxxlorr Tracker Visual Lab safeguards around graphics-context setup, shader preloading and renderer teardown. It also preserves the upstream explanatory source comments. The runtime feature set is unchanged: the existing visual catalog, standalone audio sources, controls, musical automation and recording options remain available.
Ship presentation.html and index.html together with the GNU GPL version 3 license text and the matching complete corresponding source package. The readable index.src.html is provided for inspection and modification. Keep copyright, license and no-warranty notices intact, and identify any later modifications with their relevant dates. When redistributing the minified application, make its matching editable sources and build instructions available under the GPL. Include any explicitly referenced assets/state files separately; JSON state can embed visual assets but not source audio. The optional Windows launcher requires its matching launcher files and served demo filename; it is not required to open index.html directly.
13 / Author, credits & references
Created and programmed by Maxime LORRAI (aka KurtZ/lapiNIC), for MLT. The standalone Visual Lab is adapted from Maxxlorr Tracker’s Visual Lab engine and integrates the Rexporter JavaScript preview player. The procedural audio buffers and screenshots shown here are produced by this standalone edition.
Original Visual Lab engine, effect catalogs and procedural control system by Maxime LORRAI.
Embedded JavaScript module/MIDI preview playback engine by Maxime LORRAI. The standalone includes the player, not the complete XRNS conversion application.
Feedback-visualizer inspiration and preset-authoring documentation. No .milk/.milk2 interpreter or MilkDrop runtime is bundled.
Spherical-power Mandelbulb and Julia-viewer reference for an independent shader implementation.
Rhythmic analysis and tempo-estimation background; the standalone estimator is not a complete implementation of this paper.
Module-format comparison and technical reference. libopenmpt is not a runtime dependency of this standalone player.
Browser audio graph and analysis specification; MDN decodeAudioData documents complete-input decoding constraints.
GPU rendering API specification.
Format documentation and musical event semantics.
Build-time JavaScript minification tool; not shipped as a runtime library.
Imported music, modules, videos, meshes and other user assets remain the property of their respective creators. Obtain the necessary rights before redistributing them or publishing recorded performances. Referenced projects are acknowledged for documentation or inspiration; no endorsement is implied. Product names belong to their respective owners.
Back to top ↑Choose a world. Bring a track. Let the beat take over.
Launch the demo ↗Opens the relative file index.html in this folder.