In short: in the app, open the shader importer and paste the
code (or load a .fs, .isf, .glsl,
.frag or .txt file). The format is detected for
you. Your shader then sits beside the 40 built-in scenes, and anything
you can do to a scene — decks, crossfader, effects, Autopilot — works
on it.
What it accepts, and what maps to what
| Format | Recognised by | What you get |
|---|---|---|
| ISF | The JSON header (ISFVSN, INPUTS…) |
The first four number or on/off inputs become the four knobs. Name, credit and description are read from the header. |
| Shadertoy | void mainImage(...) |
Runs as written. The Motion knob scales iTime; Shadertoy declares no other inputs. |
| Plain GLSL | void main() |
A last resort for fragment shaders in neither format. |
Helper functions that clash with the built-in library (everyone writes
their own rot() and hash12()) are renamed
automatically, so the shader keeps using its own versions.
Making a shader hear the music
A Shadertoy shader doesn't react to sound by itself: Shadertoy's audio comes in through texture channels, and those aren't available here (see below). But every imported shader can read the same live audio the built-in scenes use:
| Uniform | What's in it |
|---|---|
u_audio (vec4) | bass, mid, high, overall level — 0 to 1, live |
u_hits (vec4) | bass hit, mid hit, high hit, beat — pulses on each onset |
u_beat (float) | 0 → 1 through the current beat |
u_bar (float) | 0 → 1 through the current bar |
A minimal Shadertoy-style example — a ring that grows with the bass and flashes on the beat:
void mainImage(out vec4 fragColor, in vec2 fragCoord) {
vec2 uv = (fragCoord - 0.5 * iResolution.xy) / iResolution.y;
float bass = u_audio.x; // live, 0 to 1
float r = length(uv);
float ring = smoothstep(0.02, 0.0, abs(r - 0.2 - 0.25 * bass));
float flash = 0.6 + 0.4 * u_hits.w; // pulses on the beat
fragColor = vec4(vec3(ring * flash), 1.0);
}
Paste a shader like that into the importer and it moves with the music straight away — this one was checked against the importer and compiles. On top of it, the effects, the crossfader and Autopilot behave exactly as they do with any built-in scene.
What doesn't work (yet)
- Texture and audio channels. Texture lookups on
iChannel0–3are replaced with procedural noise. Most shaders use channels as a noise source, so many still look close to the original; ones that need a particular image, video or Shadertoy's audio texture won't. Shaders that read a channel withtextureLodortexelFetchwon't compile yet. - Multi-pass shaders. Shadertoy Buffer A–D and multi-pass ISF aren't supported.
- The mouse.
iMouseis fixed at the centre of the frame. - Colour inputs in ISF become fixed colours; use the Colour shift and Palette controls instead.
If a shader can't be converted, the importer tells you why. The substitutions above happen quietly, so check the result full screen before a gig.
Licences: read this before a paid gig
A shader belongs to the person who wrote it and carries their licence. Shadertoy's terms put shaders under CC BY-NC-SA 3.0 unless the author says otherwise — which means non-commercial. Playing one at a party at home is one thing; playing it at a gig you're paid for needs the author's permission.
- Check the licence in the shader's comments or on its page.
- Credit the author — ISF has a
CREDITfield for it. - For paid work, write your own, or ask.
The built-in scenes are ours and are covered by your Dancy Ants licence. Imported shaders aren't — see the terms.
Tips
- Watch the cost. A shader that runs at 60fps in a small Shadertoy preview may not at projector resolution. Test it full screen on the machine you'll play on.
- Map the knobs. In ISF, put your four most useful controls first; they become the knobs, and the knobs can be mapped to MIDI.
- Back it up. Back up everything writes your scenes, saved looks and MIDI map to one file you keep.