← smergevj.com SMERGE Manual PDF ↓

SMERGE

Visual Performance System

User Manual · v0.2.3

Table of Contents

Before You Start

System Requirements

SMERGE renders up to 8 simultaneous video layers in real time using WebGL 2.0. The GPU is the most important factor for smooth performance — everything else is secondary.

ComponentMinimumRecommended
GPU Intel integrated graphics (frame drops expected on complex shaders) Apple Silicon M1 or dedicated AMD / NVIDIA with 2 GB+ VRAM
RAM 8 GB 16 GB (headroom for other live-set apps)
CPU 4-core, 2018 or newer Apple Silicon M1+ (fanless, efficient for live use)
Storage Any SSD — required for smooth video file playback and scrubbing
Display 1280 × 800 1440 px wide or more — the mixer panel is dense at small widths
OS macOS 12 Monterey macOS 13 Ventura or later

Performance tip: If you experience dropped frames, reduce generator complexity first (switch to simpler built-in sources), then check that no other GPU-heavy app is running. Apple Silicon machines generally sustain real-time performance at 60 fps without a fan spinning up.

Thank You

SMERGE is an independent project built by a solo developer with a love for live visual performance. Every person who downloads, uses, and shares this tool is directly making it possible to keep building.

Your support — whether through word of mouth, feedback, bug reports, or simply choosing SMERGE for your set — means everything. This software exists because of people like you who believe that artists should have serious tools without serious price tags.

SMERGE is still growing. The roadmap is shaped by the community, and every feature in this manual started as a real need from a real performer. If there's something you wish it could do, reach out — you might just see it in the next version.

AortaLabs · v0.2.3 · Made with care
Chapter 01

Application Overview

SMERGE is a real-time visual performance tool built for live VJ work, generative art, and audiovisual performance. The interface is divided into six primary panels, all visible simultaneously, designed so you can mix, modulate, and perform without switching screens.

SMERGE main interface overview
The SMERGE main window with all six panels visible simultaneously

The Interface at a Glance

The main window is divided into four zones:

Title Bar

The title bar runs across the top of the application and contains global controls.

ControlFunction
Preset nameDisplays the current preset name. Click to rename.
NewClears the current session and creates a blank preset.
LoadOpens a file browser to load a .smx preset or .smxz bundle file.
SaveSaves the current session as a .smx preset file. When a preset is already open, Save overwrites it directly; use Save As… (⌘⇧S or shift-click) to save a copy under a new name. Media sources are referenced by file path — moving or deleting the original files breaks the preset.
CollectSave & Collect — saves the session as a single .smxz bundle containing the preset plus copies of every referenced asset: video, audio, images, 3D models, and any shader-library shaders in use. Share the one file with anyone; when loaded, assets are unpacked to Documents/SMERGE/Assets/<name>/ and everything plays without the original files.
ShaderOpens the Shader Editor for writing custom GLSL generators.
MIDIOpens the MIDI Router for assigning hardware controls.
ScenesOpens the Scene Launcher for saving and recalling snapshots.
TempoOpens the Tap Tempo / BPM tool.
OutputOpens the Output Manager for routing to a second display or Syphon.
♫ TrackOpens the Audio Track player for loading backing audio.
BPMDisplays the current global tempo. All BPM-synced LFOs and envelopes lock to this value.
RECStarts/stops canvas recording.

Preview

The Preview panel occupies the upper-left and shows the live composited output at all times. What you see here is exactly what is sent to your second display and Syphon output. The FPS counter in the top-right corner monitors render performance. The preview is fully interactive — if a Live Drawing source is active, you can draw directly onto this canvas.

Layout Panels

Every panel in SMERGE can be repositioned and resized. The icon in a panel header moves it to a different zone; the icon pops it out as a floating window. Drag panel dividers to resize. Save and recall complete layout states using the Layout menu in the title bar.

Keyboard Shortcuts

ShortcutAction
⌘+Zoom in — enlarges the entire UI. Useful on high-density or small displays.
⌘−Zoom out.
⌘0Reset zoom to 100%.
⌘ZUndo — reverses text edits in any text field.
⌘C / ⌘VCopy / Paste in any text field.
⌘SSave preset — overwrites the file you have open (or saves the current shader when the Shader Editor is open). First save of a new session asks for a name.
⌘⇧SSave preset as… — always asks for a new name/location.
⌘NNew preset.
⌘,Open Settings.
⌘/Keyboard shortcut reference — a floating panel with every shortcut, including the Mask Editor tools. Also in the Help menu.
`Performance mode — hides side panels for a maximized preview.
Right-clickContext menu with Cut / Copy / Paste / Select All on any editable field.
Chapter 02

Source Manager

The Source Manager is where all visual content enters SMERGE. It provides 8 independent channels arranged in a 4×2 grid, each capable of running a different source simultaneously. Channels are color-coded consistently throughout the entire application — the same color that labels a channel here appears on its fader, its mod matrix column, and its audio meter.

Source Manager — 8-channel grid
The Source Manager showing all 8 channel slots with macro knobs and live thumbnails

Loading a Source

Click the — none — dropdown at the top of any channel slot to open the source picker. Sources are organized into categories:

CategoryDescription
GeneratorsBuilt-in GLSL shaders — plasma fields, fractals, geometry, particle systems, and more. Render in real time with no file required. The Mapping category contains test patterns (Test Grid, Test Corners, Test Bars) designed for projection alignment and calibration.
VideoPre-loaded video clips (MP4, MOV, WebM, MKV). Loop, scrub, and sync to BPM.
CameraLive webcam or video capture card feed.
ImageStill images (PNG, JPG, WebP, GIF) loaded via the + Import button. Rendered with GPU-accelerated scale, rotation, position, and hue-shift macros.
Image StackA set of 2–32 still images loaded together as one scrubbable "wavetable" source — step through frames with a macro knob, crossfade between them, or auto-advance in sync with the beat. Loaded via + Import → ▦ Image Stack…. See Image Stack below.
3DGLB or GLTF 3D model with real-time camera orbit, zoom, and lighting controls. Also loads Gaussian Splat scans (.ply, .splat, .ksplat) — see Gaussian Splats below.
Live DrawingA persistent paint canvas. Draw directly on the Preview with your mouse or stylus. Strokes accumulate and fade over time.
Text LayerGPU-rendered text with custom font, color, glow, and animations. All parameters are modulatable.

To load a file-based source (video, 3D model), click + Import in the top-right corner or use the dropdown's import option. Files are referenced from their original location — SMERGE does not copy them.

Channel Thumbnail

Once a source is assigned, the black preview area shows a live thumbnail of that channel's output before compositing. This lets you monitor all 8 channels independently while the main Preview shows the final blended result.

Macro Knobs — M1, M2, M3, M4

Each channel has four macro knobs below its thumbnail. What these knobs control depends on the source type:

For Generators (GLSL shaders): Macros map directly to the shader's u_macros[0–3] uniforms. Each shader defines what M1–M4 do — common mappings include color palette, speed, density, symmetry, or pattern scale.

For 3D sources: M1–M4 are remapped to camera parameters: azimuth, elevation, distance, and field of view.

For Video: Macros are available for modulation routing but do not directly alter playback.

For Still Images (PNG, JPG, WebP, GIF) and Camera: M1–M4 control real-time GPU transforms applied before compositing:

MacroParameterRange
M1Scale0.25× (zoomed out) to 4× (zoomed in). At 0.5 (center), the image fills the canvas at 1:1.
M2Rotation−180° to +180°
M3X Position−1 to +1 UV units (full frame horizontal shift)
M4Hue Shift−180° to +180°. Rotates the hue wheel — shift by 180° to invert colors.

These transforms are computed on the GPU before compositing. Pixels outside the image boundary after transformation are transparent — so scaling a PNG down reveals the channels underneath rather than leaving a colored rectangle.

Tip: Combine Scale (M1) with an LFO or the Step Sequencer to create rhythmically pulsing image layers — the background shows through cleanly during the scaled-down phase because the transparency is preserved.
Tip: Right-click any macro knob to assign an LFO, envelope, or audio band directly from a context menu.

Text Layer

Select Text Layer from the source picker to add GPU-rendered text to a channel. After assigning, a T Edit Text button appears below the channel thumbnail — click it to open the text editor panel.

ControlFunction
Text areaEnter text content. Use \n for line breaks.
FontOpens a searchable picker listing every installed font on your system.
SizeFont size in pixels (10–400). Right-click to assign a mod source.
B / IBold and italic toggles.
⬅ ⬛ ➡Text alignment: left, center, right.
◑ RainRainbow mode — cycles each character through the full hue spectrum.
Text / BGText color and background color pickers. Check Transp. to make the background transparent (great for overlaying text on other channels).
X / YPosition sliders for the text block within the frame.
SpcLetter spacing in pixels. Right-click to assign a mod source.
GlowGlow blur radius (0–60). Right-click for mod. The color swatch sets the glow color, which defaults to the text color.
AnimAnimation preset: Static, Pulse, Wave, Typewriter, Scramble, or Scroll (four directions). A ♩ button toggles BPM sync; when active, choose a musical division (4/1 down to 1/16) to lock the animation cycle to tempo.
Tip: Set the background to transparent, choose Add or Screen blend mode in the Fader Bank, and use a bright glow to make text read cleanly over any video source underneath.

Image Stack

An Image Stack loads a set of still images (2 to 32 files) as one source that scrubs, crossfades, and auto-advances between frames — a "wavetable" for images, useful for stop-motion montage cuts, glitch-style image cycling, and rhythmic photo/texture sequences timed to the music.

Create one from any channel's source picker: + Import → ▦ Image Stack…. Select 2 or more image files (PNG, JPG, WebP, GIF) in the file dialog — SMERGE loads all of them as a single source named after the first file (e.g. "photo1.png +3 (stack)").

Image Stack sources use a distinct macro mapping in place of the scale/rotation/position/hue transform used by single still images:

MacroParameterBehavior
M1ScrubSelects a frame from the stack. 0.0 = first image, 1.0 = last image, evenly divided across however many frames are loaded.
M2BlendCrossfades between the current frame and the next one. 0 = a hard cut at the current frame, 1 = fully blended into the next.
M3AutoAuto-advance. At 0, the stack is static and only responds to Scrub (M1). Above 0, the stack advances through frames on its own — see Free-Running vs. Clock-Synced below.
M4HueHue shift, same convention as still images: −180° to +180°, centered at 0.5.
A freshly created Image Stack starts with Blend and Auto both at 0 (not the usual 0.5 default) so it shows one clean, static frame — not an already-blended or already-cycling image — until you start turning knobs.

Free-Running vs. Clock-Synced Auto-Advance

When Auto (M3) is active, a small ♩ Sync toggle appears next to the macro knobs. It switches what the Auto knob's range means:

ModeBehavior
Free-running (default)Auto sweeps a continuous frame rate from 0 to 30 fps. Not locked to the beat — useful for organic, non-rhythmic flicker.
♩ SyncedAuto instead selects a musical division from 2 bars (slow) down to 1/96 (very fast, matching common 96-PPQN sequencer resolution) — the stack advances exactly on the beat, staying in time with everything else in the set. The toggle button shows the currently selected division, e.g. ♩ 1/8.

The Auto knob remains the single control in either mode, so MIDI mapping, LFOs, and the Step Sequencer can all still drive it — switching Sync on just changes what the knob's position means.

Tip: Combine a Step Sequencer lane targeting Macro 1 (Scrub) with distinct right-drag step values to cut to a specific frame on each step — since sequencer values add to the knob, leave the Scrub knob itself at 0 so each step's value directly selects the frame. Keep Auto (M3) at 0 so it doesn't override Scrub. The result is a music-video-style montage cut timed exactly to the beat.

Gaussian Splats

SMERGE loads 3D Gaussian Splat scans — photoreal captured 3D, the current frontier in 3D scanning — as a 3D source, alongside GLB/GLTF models. Scan a room, street, or backstage with a free phone app (Luma, Polycam, or Apple's own Scaniverse), export a .ply, .splat, or .ksplat file, and load it just like any other 3D model — + Import or drag the file straight onto a channel.

Once loaded, a splat scene uses the exact same camera controls as a GLB/GLTF model: the Az / El / Dst / FOV macro knobs orbit, tilt, push in, and widen the lens, and the scene is automatically centered and scaled to a sensible starting distance regardless of how large the original scan was.

Beat-Synced Camera Motion

Below the camera sliders, a Cam row offers three motion presets that drive the camera automatically, locked to the master tempo rather than wall-clock time — they follow tempo changes and stay in sync between the main window and the projector output:

PresetMotion
OrbitContinuous rotation around the scene — a full revolution every 4 bars at 100% Amt.
DollyA slow push-in/pull-out breathing cycle, one full cycle every 4 beats.
KickA sharp lens-widening punch that lands right on each beat and decays before the next — a camera-level "kick" to match a bass hit.

An Amt slider (0–100%) sets the strength of whichever preset is active, and — like the other 3D camera parameters — can be right-clicked to assign an LFO, envelope, or audio band. Motion presets work on any 3D source, not just splats, so a GLB model can pick up the same beat-synced orbit for free.

Splats render at half resolution internally and upscale to the compositor's output — a deliberate performance guardrail, since the format's per-frame point-cloud sort is the real cost, not fill rate. Apple Silicon Macs are recommended for large scans; very dense captures (several million splats) will be slower to sort on Intel hardware or older GPUs.
Tip: Export at a moderate splat count when you have the option (Luma and Polycam both offer quality/size presets) — a few hundred thousand splats already reads as photoreal at VJ-projection distances, and loads and sorts noticeably faster than a multi-million-splat export.

Mask Button (✒)

Each channel card contains a small button. Clicking it opens the Mask Editor — a bezier drawing tool that lets you trace any shape around a surface and mask the channel to it. This is the primary tool for projection mapping.

The button is orange-tinted when no mask path exists, glows orange when a path is saved but the mask is toggled off, and turns blue while the mask is active. See Chapter 13 — Mask Editor for the full workflow.

Channel Colors

ChannelColor
1■ Green
2■ Blue
3■ Purple
4■ Yellow
5■ Red
6■ Teal
7■ Violet
8■ Gold
Chapter 03

Fader Bank

The Fader Bank contains the compositing controls for all 8 channels. Every channel strip is independent — you can set different blend modes, effects, and opacity levels for each one simultaneously. Strips are color-coded to match the Source Manager and Mod Matrix.

Fader Bank — 8 channel strips
The Fader Bank with all 8 channel strips — each strip controls compositing for one channel

Channel Strip — Top to Bottom

HIDE

Mutes the channel from the composite output without losing any of its settings. The channel continues processing in the background — toggling it back on is instant with no reload. Use this to pre-build a layer and drop it in at the right moment during a performance.

Scale Mode — Fill / Fit / Cvr

Controls how the source is scaled inside the composite frame:

ButtonBehavior
FillStretches the source to fill the full output frame, ignoring aspect ratio.
FitScales the source to fit entirely within the frame, preserving aspect ratio. Letterboxing may appear.
CvrScales the source to cover the full frame, preserving aspect ratio. Edges may be cropped.

♪ BPM Sync

Syncs the channel's video playback or generator animation speed to the global BPM. When active, the source loops in time with the tempo.

∿ XFM — Transform

Opens the transform controls for this channel: X position, Y position, Scale, and Rotation. All four parameters are individually available as Mod Matrix targets.

Blend Mode

ModeEffect
NormalStandard alpha composite — opacity controls transparency.
AddAdds pixel values; brightens the result; great for light and glow sources.
MultiplyDarkens by multiplying values; useful for texture overlays.
ScreenInverse multiply; lightens without blowing out highlights.
OverlayContrast blend that preserves midtones.
DifferenceSubtracts pixel values; creates inversion effects.
ExclusionSofter version of Difference.
Lighten / DarkenKeeps only the lighter or darker pixel per channel.
Hue / LuminosityHSL mode blends — applies the hue or luminosity of this layer to the base.
Color Dodge / BurnPhotoshop-equivalent dodge and burn blend modes.
Vivid LightCombines dodge and burn for extreme contrast results.
ExclusionSofter version of Difference.
Hard LightContrast blend weighted toward this layer rather than the base.
MaskUses this layer's luminance to cut through the accumulated composite — white areas reveal everything below, black areas hide it.
Mask InvInverted mask — black areas reveal the composite, white areas cut it.

Clip to Channel

When a channel is set to Mask or Mask Inv blend mode, a Clip: dropdown appears in the channel strip. By default it reads Clip: all — meaning the mask punches through every layer below it in the composite.

Set the dropdown to a specific channel (e.g. Ch 1 — Green) to clip the mask to that channel only. When a clip target is selected:

Tip: Place your content source above the mask layer in the channel order. The Clip dropdown only shows layers that appear above the mask in the composite (lower channel numbers render first).

FX Slots (×2)

Each channel has two independent effect slots stacked vertically. Effects are applied in order — slot 1 first, then slot 2 — before the blend mode is calculated. Selecting an effect here makes its parameters available in the FX Params panel.

Vertical Fader

The main opacity control for the channel. Drag up to increase, down to decrease. When an LFO or envelope is routed to the fader, the thumb animates in real time to show the live modulated value — giving you a visual read of the modulation depth without leaving the Fader Bank.

Tip: Right-click the fader to assign a MIDI CC, LFO, or envelope directly without opening the Mod Matrix. The Amt slider that appears controls the modulation depth and can be dragged smoothly.

Audio Meter Bar

The colored horizontal bar is a live audio reactivity meter. Its brightness and width reflect the audio energy being fed to that channel.

Chapter 04

Mod Patch Bay

The Mod Patch Bay is SMERGE's modulation routing engine. It connects modulation sources — LFOs, envelopes, and audio signals — to destination parameters across all 8 channels and the XY pad. Every connection is visual, real-time, and independently adjustable.

Mod Patch Bay — routing view
The Mod Patch Bay showing sources on the left and channel destinations on the right

Header

MOD ROUTING — [BPM] displays the current global tempo. The instruction line summarizes the three core interactions:

DEPTH Slider

Sets the modulation depth for the next cable you draw. At 100% the modulation source drives the destination across its full range. At negative values the modulation is inverted. Adjust this before drawing a cable to set the initial depth, or right-click an existing cable to change it after the fact.

+ LFO / + ENV / + GATE / + CV / + M-Gate

ButtonAction
+ LFOAdds a new Low Frequency Oscillator to the source list.
+ ENVAdds a new ADSR envelope to the source list.
+ GATEAdds a beat-triggered gate — pulses in sync with kick/beat events.
+ CVAdds a continuous CV input channel from a DC-coupled audio interface (see Chapter 17).
+ M-GateAdds a voltage-threshold gate from a DC-coupled audio interface (see Chapter 17).

Up to 8 LFOs, 8 envelopes, and 8 gates can be active simultaneously. CV and M-Gate inputs are only useful if you have a DC-coupled audio interface (e.g. ES-8, RME Fireface, Focusrite Gen 4) connected with Eurorack or modular CV signals.

Source List (Left Column)

All available modulation sources appear on the left. Each row has a colored square indicator and a circular output node on the right edge — the drag handle for creating connections.

Gates — added with + GATE. Click a gate label to open its inline editor (depth, pulse width). A gate outputs 1 on the beat and 0 between beats — ideal for hard snapping of opacity, scale, or flash effects.

The Audio / Video group is a collapsible section containing all audio-reactive sources:

SourceSignal
SubSub-bass energy (20–60 Hz)
BassBass energy (60–250 Hz)
MidMidrange energy (250 Hz–4 kHz)
HighHigh frequency energy (4–20 kHz)
RMSOverall loudness
BeatPulse on detected kick/beat events
ManualHand-controlled slider for performance
LumaBrightness from a live camera or video source
MtnMotion detected from a live camera feed

The CV / M-Gate group appears below Audio / Video when you have added one or more CV or M-Gate inputs. Clicking a CV or M-Gate row opens the CV Inspector at the top of the panel:

ControlDescription
DevAudio interface device picker. Updates automatically when you plug or unplug hardware.
ChPhysical input channel on the interface that carries the CV or gate signal (1–8).
Live readoutCurrent raw voltage displayed as a number (−1.00 to +1.00), updated ~12 times per second.
Oscilloscope170 × 58 px rolling waveform showing ~3 s of signal history at 60 fps. Center line = 0 V. M-Gate shows a dashed threshold line.
Thr (M-Gate)Threshold voltage. Gate outputs 1 when the signal is above this value, 0 otherwise.
× RemoveDeletes the source and removes all of its active cables.

Destination List (Right Column)

Click the ▶ expand arrow on any channel to reveal individual target parameters:

TargetWhat it controls
OpcChannel opacity
M1 – M4Macro knobs
X / YTransform position
ScTransform scale
°Transform rotation
FX paramsFloat parameters exposed by the active effect

XY destinations expose X1, Y1, X2, Y2.

LFO Editor

Clicking an LFO label opens its inline editor at the top of the panel.

Mod Patch Bay — LFO editor open
The LFO editor expanded — waveform scope, rate and amount knobs, phase, and sync options
ControlFunction
Waveform scopeAnimated display showing the LFO's current waveform with a moving phase cursor.
RATE knobSets the speed in seconds per cycle. Double-click to type a precise value.
AMT knobSets output amplitude — scales all routes from this LFO simultaneously.
Phase sliderOffsets the starting phase (0°–360°) to stagger LFOs of the same rate.
BPM SyncLocks the LFO to a musical division of the global tempo (4 bars down to 1/8).
BipolarWhen checked, the LFO swings −1 to +1. When unchecked, 0 to 1.
× RemoveDeletes this LFO and all of its active cables.

Drawing a Connection

  1. Hover over a source row — the circular node becomes visible
  2. Click and drag from the node toward a destination
  3. Release over the target parameter to complete the cable
  4. The depth set by the DEPTH slider is applied automatically

Multiple sources can be routed to the same destination — their values are summed. A single source can fan out to multiple destinations simultaneously.

Tip: Right-click any active cable to edit its depth, lo/hi range, probability, attack/release shaping, and curve type.
Chapter 05

FX Params

The FX Params panel exposes the detailed parameter controls for whatever source and effects are assigned to each channel. It consolidates source-level settings, effect slot 1 parameters, and effect slot 2 parameters into a single scrollable view per channel.

FX Params panel
FX Params showing source parameters and two stacked effect sections for Channel 1

Channel Tabs

Tabs 1 through 8 correspond to the 8 channels. The active channel is highlighted in green. Switching tabs instantly shows that channel's parameters.

Effect Chain Breadcrumb

Below the tabs, a breadcrumb shows the current effect chain for the selected channel:

Mirror → Kaleidoscope

This means FX slot 1 is Mirror and FX slot 2 is Kaleidoscope. Parameters for both effects appear below.

SOURCE PARAMS

ParameterDescription
ColorA color picker for sources that use a primary color value. Click the swatch to open the full picker.
ShapeA dropdown for sources with selectable geometry — Dots, Ring, Line, and others depending on the active generator.
SpriteLoads a custom image file as a sprite element into the source. Click Load to browse.

EFFECT PARAMS — FX Slot 1 & 2

Each effect exposes its own unique set of parameters. As an example, Kaleidoscope exposes:

ParameterDescription
SegmentsNumber of repeating wedge segments. Higher values create denser patterns.
ZoomScales the source before the kaleidoscope fold.
RotationRotates the entire pattern in real time. Assign an LFO for continuous auto-rotation.

The available effects include chromatic aberration, glitch, pixelate, kaleidoscope, mirror, zoom-rotate, ASCII art, dither, and more.

Tip: Every slider in FX Params is a valid Mod Matrix destination. Right-click any slider to assign an LFO, envelope, or audio band directly.
Chapter 06

XY Pad

The XY Pad provides two independent two-axis performance controllers — XY 1 and XY 2 — displayed side by side. Each pad broadcasts its X and Y coordinates as modulation signals in real time.

XY Pad — dual performance controllers
XY 1 (left, purple) and XY 2 (right, green) with Spring and Circle physics options

XY 1

The left pad. Its X and Y values are always routed to the global macro blend — moving the dot simultaneously blends M1/M2 (X axis) and M3/M4 (Y axis) across all active channels at once. Values range from 0.0 to 1.0 and are displayed numerically in the pad header.

Physics OptionEffect
SpringThe dot snaps back to center when released.
CircleConstrains movement to a circular boundary.

XY 2

The right pad. XY 2 has an additional FX / MACRO toggle that changes its operating mode.

In MACRO mode it behaves identically to XY 1. In FX mode it applies a global post-process effect to the entire composited output:

EffectX AxisY Axis
PositionHorizontal offset of the full outputVertical offset
Zoom + RotateZoom level (1× to 4×)Rotation (−180° to +180°)
Color GradeHue rotationSaturation
ChromaChromatic aberration amountBarrel distortion + vignette

Performance Tips

Chapter 07

Shader Editor

The Shader Editor is SMERGE's built-in GLSL code environment. Write, edit, compile, and assign custom fragment shaders as visual sources — directly inside the application with no external tools required. Open it from the Shader button in the title bar.

Shader Editor
The Shader Editor — library panel on the left, GLSL code editor on the right with the standard uniform template

Header Controls

ControlFunction
Name fieldThe name of the shader as it appears in the source picker.
NewCreates a blank shader with the standard uniform template pre-filled.
CompileCompiles the current code. Preview updates immediately on success. Errors appear in a bar below the editor — click to dismiss. Large error logs scroll within the bar so they never bury your code.
Save ⌘SSaves the shader to your library.
CH 1 ▾Channel selector — assigns the shader to the chosen channel after saving.
Assign →Pushes the current shader to the selected channel.
Closes the Shader Editor.

Shader Type

A row of pills below the header (labeled TYPE) switches which kind of shader you're writing. Each type has its own language and uniform conventions, and the Library panel's contents update to match whichever type is selected:

TypeWhat it is
GLSLRaw fragment shaders using SMERGE's own u_-prefixed uniforms. The default type, and the fastest to compile and run.
ISFInteroperable Shader Format — a JSON header plus GLSL body, compatible with the wider VJ shader ecosystem.
Three.jsFull JavaScript 3D scenes using the Three.js API.
ShadertoySingle-pass shaders written in Shadertoy.com's own convention (mainImage(), iTime, iResolution, etc.) — paste code from shadertoy.com directly. See Shadertoy Shaders below.
Shadertoy MBMulti-buffer Shadertoy shaders — up to four persistent feedback buffers (Buffer A–D) plus a final Image pass, for simulations like Game of Life, reaction-diffusion, and fluid advection. See Multi-Buffer Shadertoy Shaders below.

Library Panel

Lists all available shaders organized by category:

TagContent
AllEvery shader
AbstractNon-representational color and pattern fields
SpaceNebulae, galaxies, tunnels, cosmic imagery
FractalMathematical recursive structures
GeometricSDF shapes, grids, tiled forms
OrganicFluid, biological, and natural forms
AudioWaveforms, oscilloscopes, spectrum visualizers
MaskBlack-and-white utility shaders for compositing

Click any shader to load its source into the editor. Built-in generators are read-only references — editing creates a new copy in your personal library.

Standard Uniforms

Every shader in SMERGE receives these uniforms automatically each frame:

uniform vec2  u_resolution;   // output canvas size in pixels
uniform float u_time;         // elapsed time in seconds
uniform vec2  u_xy;           // XY Pad 1 position (0.0–1.0)
uniform float u_macros[4];    // M1–M4 macro knob values (0.0–1.0)
uniform float u_audio[64];    // FFT frequency bins (0.0–1.0 per bin)
uniform float u_rms;          // overall audio loudness (0.0–1.0)
uniform float u_beat;         // audio beat envelope: 1.0 on transient, decays to 0 over ~300ms
uniform float u_bpm;          // current BPM (e.g. 128.0)
uniform sampler2D u_waveformTex; // stereo scope waveform, 512×1: R=Left, G=Right (decode ×2−1)
varying vec2  v_uv;           // interpolated UV coordinates (0.0–1.0)

Standard Shader Structure

precision highp float;

void main() {
    // Convert UV to centered, aspect-corrected coordinates
    vec2 uv = v_uv * 2.0 - 1.0;
    uv.x *= u_resolution.x / u_resolution.y;

    // Your visual logic here

    gl_FragColor = vec4(color, 1.0);
}

Writing Audio-Reactive Shaders

The u_audio[64] array contains the live FFT spectrum from sub-bass (index 0) to high frequencies (index 63):

float bass   = u_audio[2];    // low-end energy
float treble = u_audio[50];   // high-frequency energy
float level  = u_rms;         // overall loudness
float beat   = u_beat;        // 1.0 on kick/snare, smoothly decays to 0

// Interpolate across all 64 bands — useful for spectrum visualizers:
float spectrum(float p) {
    float x = clamp(p * 63.0, 0.0, 63.0);
    int   i = int(x);
    return mix(u_audio[i], u_audio[i + 1], fract(x));
}
u_beat is audio-only. The beat envelope fires only when the audio analyzer detects a transient — it does not tick with the BPM clock when no audio is playing. This keeps shaders from flashing mechanically in silence.

The Audio Waveform — u_waveformTex

While u_audio[64] is the frequency spectrum, u_waveformTex is the actual time-domain waveform — the raw audio samples — which is what a real oscilloscope draws. It is a 512×1 texture where the red channel is the Left sample and the green channel is the Right, each stored 0–1 (decode with ×2−1 to get −1..1):

vec2 wave(float t) {              // t = 0..1 across the buffer
  return texture(u_waveformTex, vec2(t, 0.5)).rg * 2.0 - 1.0;  // .r = Left, .g = Right
}

Plot wave(uv.x).x against the vertical axis for a classic scope trace, or use (Left, Right) as X/Y for a Lissajous "oscilloscope music" figure. The built-in True Scope generator (Sources → Generators, Audio category) does exactly this — M1 switches between scope-trace and Lissajous, M2 is gain, M3 glow, M4 hue. The waveform is captured from a stereo tap on the audio, so it works with any playing source — music, microphone, or per-app capture.

✦ AI Shader Generator

The Shader Editor includes a built-in AI code generator. Click the ✦ AI button in the top-right corner of the Shader Editor to open the AI panel. Type a description of the visual you want and press Generate — the model streams GLSL code directly into the editor in real time, which you can then compile, tweak, and save.

See Chapter 15 — AI Shader Generator for full setup instructions, provider options, and prompting tips.

Tips

Shadertoy Shaders

SMERGE can run single-pass shaders written in Shadertoy.com's convention directly — paste code from shadertoy.com into the editor with TYPE → Shadertoy selected and it runs largely unmodified.

UniformMeaning
iTimeElapsed seconds (equivalent to SMERGE's u_time)
iResolutionvec3 — canvas size in pixels, z always 1.0
iMousevec4 — driven by the XY Pad instead of a real mouse
iFrameElapsed-time-based frame approximation for single-pass shaders
iTimeDelta, iDate, iSampleRateStandard Shadertoy constants/stubs
iChannel0iChannel3All four alias to the same single image slot in single-pass mode — assign it via the channel strip's image picker. (Multi-buffer mode below gives each channel a real, independent source.)

SMERGE's own extensions are also available inside Shadertoy-type shaders: u_beat, u_rms, u_bpm, u_audio[64], u_macros[4], u_xy — the same signals described in the Shader Artist Reference below.

Multi-Buffer Shadertoy Shaders

Select TYPE → Shadertoy MB for shaders that need persistent state across frames — cellular automata (Conway's Game of Life), reaction-diffusion growth, fluid simulation, feedback/bloom pipelines, and anything else that reads its own previous output. A multi-buffer shader is up to four render-to-texture buffers (named A–D) plus a mandatory final Image pass that composites them into what's displayed.

Multi-buffer Shadertoy tabbed editor
The multi-buffer editor — one tab per pass, with channel wiring and resolution controls above the code

The Tabbed Editor

Each pass gets its own tab — Common, Buf A through Buf D (only tabs for buffers that exist are shown), and Image — so you write and read one pass's mainImage() at a time instead of hand-editing one large JSON file.

ControlFunction
CommonGLSL shared by every pass — helper functions, constants. Has no channels of its own.
Buf A–DOne tab per persistent buffer. Each is a complete mainImage() — it doesn't need to look good on its own, since it's read by another pass, not displayed directly.
ImageThe mandatory final pass — its output is what actually appears on the channel.
+ BufferAdds a new buffer (up to 4 total) with a blank starting template.
✕ RemoveDeletes the currently selected buffer. Any other pass that referenced it is automatically rewired to stop reading it, rather than left pointing at a buffer that no longer exists.
Raw JSONDrops into the underlying JSON bundle directly — useful for pasting a shader from elsewhere, or hand-editing something the tab view doesn't expose. Tabs view switches back.

Channel Wiring

Above the code editor, a Channels row lists this pass's iChannelN inputs. Each one is wired to either a buffer (reading that buffer's own previous frame for self-feedback, or another buffer's previous frame to chain multi-stage simulations) or a texture slot (a static image you assign — see below). Use + channel to wire up a new one (up to 4 per pass) and on a channel chip to remove it. Buffer passes also get a Res control — 100/75/50/25% — to run an expensive simulation buffer at a lower resolution than the final output.

A buffer reading its own name (e.g. Buffer A wired to itself) is self-feedback — the standard pattern for decay trails, cellular automata, and reaction-diffusion. Always compile after rewiring a channel; the compile step validates every pass in the bundle together, not just the one you're looking at.

Image Slots — Using Your Own Images

A texture-wired channel reads one of four named slots (img0img3) instead of a buffer. Assign the actual image via the channel strip or channel pop-out panel — SMERGE shows one small picker per slot the shader's channels actually use, labeled with which pass(es) read it (e.g. "Buf A ch1, Image ch2"), plus a clamp/repeat wrap toggle for tiling textures like noise patterns. Two channels wired to the same slot name — even across different passes — always show the identical image.

Only shaders that explicitly declare a texture-type channel show an image picker. A shader written as pure self-feedback (Game of Life, most reaction-diffusion) has nothing to assign an image to — there's no "add a texture channel" button for retrofitting an existing shader; wire one in via the Channels row on the pass that should read it, or regenerate/re-prompt the AI asking for a texture input.

Importing Multi-Buffer Shaders

Use Import in the Shader Editor toolbar (or the source picker's + Import file…) and choose a .json file exported from shadertoy.com. SMERGE converts it automatically — buffer/image passes and their exact channel wiring carry over, up to 4 buffers. Sound passes, cubemap passes, and keyboard/webcam/video channel inputs aren't supported and are reported by name if the import can't proceed; static texture channels import as empty (assign the image yourself afterward, since Shadertoy's asset CDN isn't reachable from inside SMERGE).

AI Generation for Multi-Buffer Shaders

Click ✦ AI with Shadertoy MB selected and describe the technique in plain language — "Conway's Game of Life reseeded on the beat" or "Gray-Scott reaction-diffusion coral growth." Generation happens as a short planning step (deciding how many buffers the technique needs and how they're wired) followed by one focused call per pass, so even a multi-buffer shader completes reliably instead of running out of output budget partway through. The progress indicator shows each step as it happens; the finished bundle loads straight into the tabbed editor above. See Chapter 15 — AI Shader Generator for setup and general prompting guidance.

Tip: Fewer buffers generate more reliably — most techniques genuinely need 0–2, not 4. If a generation gets cut off, Retry shorter explicitly asks for fewer buffers and simpler per-pass logic.

Shader Artist Reference

This reference covers every signal, uniform, and API surface available to GLSL, ISF, Three.js, Shadertoy, and Shadertoy MB generators. All share the same audio analysis, macro knobs, and modulation routing — only the language and API surface differs.

1 — Signal Flow

Live Audio ──► FFT Analyzer (64 bands) ──► u_audio[64]
                                       ──► u_rms, u_beat, u_bpm
                                       ──► Mod Matrix

Macro Knobs (M1–M4) ─┐
Mod Matrix outputs  ──┴──► u_macros[0–3]
XY Pad ──────────────────────────────────► u_xy

Every frame Smerge resolves each macro's final value as:

u_macros[i] = clamp(knob_value + sum(all_active_modulators_on_slot_i), 0, 1)

A shader only ever reads u_macros[i] — it never needs to know whether the current value came from a knob turn, a beat envelope, an LFO, or a MIDI CC. Design parameters to be expressive across the full 0–1 range and the modulation system does the rest.

2 — Shared Audio & Control Reference

u_audio[64] — 64 FFT bands, 0.0–1.0 (normalized against recent peak):

Index rangeFrequency rangeMusical content
[0]–[3]20–60 HzSub-bass, kick fundamental, sub synths
[4]–[7]60–120 HzKick body, bass guitar, bass synths
[8]–[15]120–500 HzLower harmonics, bass presence, warm midrange
[16]–[31]500 Hz–4 kHzVocals, snare, piano, synth leads
[32]–[47]4–10 kHzUpper harmonics, guitar bite, hi-hat body
[48]–[55]10–14 kHzCymbal shimmer, hi-hat attack
[56]–[63]14–20 kHzAir, transient snap, very high harmonics

Practical named bands for clarity in your shaders:

// GLSL / ISF
float sub  = u_audio[2];    // sub-bass — deep rumble
float bass = u_audio[4];    // kick / bass guitar fundamental
float mid  = u_audio[20];   // vocal / snare presence
float hi   = u_audio[52];   // cymbal shimmer
float air  = u_audio[60];   // top-end sizzle

// Three.js update(ctx)
const sub  = audio[2];
const bass = audio[4];
const mid  = audio[20];
const hi   = audio[52];
const air  = audio[60];

u_beat — 1.0 exactly on the detected beat, decays exponentially to 0.0 over ~300 ms. u_bpm holds the current tempo in BPM.

// Flash geometry on beat
col *= 1.0 + u_beat * 0.6;

// BPM-synced pulsing — one full cycle per beat
float beatPhase = fract(u_time * u_bpm / 60.0);
float pulse = 0.5 - 0.5 * cos(beatPhase * 6.28318);

u_rms — overall loudness 0.0–1.0, smoothed. Moves slower than individual bands. Use for global brightness, scale, or fog density.

u_macros[0–3] — M1–M4, each 0.0–1.0. Values already incorporate all assigned modulations. Comment every macro at the top of your shader:

// M1 = symmetry order   M2 = fly speed   M3 = color palette   M4 = glow width

float sym   = floor(3.0 + u_macros[0] * 5.0);
float speed = 0.2 + u_macros[1] * 2.8;
float hue   = u_macros[2];
float glow  = 0.005 + u_macros[3] * 0.05;

u_xy — XY Pad, vec2 (0.0–1.0 each axis, default 0.5). u_time — elapsed seconds. u_resolution — canvas size in pixels as vec2.

3 — GLSL Shader Spec

Every GLSL shader must begin with this exact header — #version 300 es must be the absolute first line with no blank lines or comments before it:

#version 300 es
precision highp float;

uniform vec2  u_resolution;
uniform float u_time;
uniform vec2  u_xy;
uniform float u_macros[4];
uniform float u_audio[64];
uniform float u_rms;
uniform float u_beat;
uniform float u_bpm;
in vec2 v_uv;

out vec4 fragColor;

Coordinate system:

vec2 uv = v_uv * 2.0 - 1.0;
uv.x *= u_resolution.x / u_resolution.y;
// uv is now (-ar, -1) to (+ar, +1) with (0,0) at canvas center

Optional texture sampler — declare only if using an image loaded via the channel strip image picker:

uniform sampler2D u_tex0;
vec4 tex = texture(u_tex0, v_uv);

Spectrum helper & audio patterns:

// Interpolated spectrum lookup — idx 0.0→1.0 maps to bands 0→63
float spectrum(float idx) {
  float fi = clamp(idx, 0.0, 1.0) * 63.0;
  float v  = 0.0;
  for (int i = 0; i < 64; i++) {
    float w = 1.0 - clamp(abs(float(i) - fi), 0.0, 1.0);
    v += u_audio[i] * w;
  }
  return v;
}

// Per-column bar (spectrum visualizer)
int band   = clamp(int(v_uv.x * 64.0), 0, 63);
float energy = u_audio[band];   // dynamic index is valid in ES 3.0

// BPM-synced warp
float phase = fract(u_time * u_bpm / 60.0);
float warp  = sin(phase * 6.28318) * bass * 0.3;
uv += normalize(uv) * warp;

Macro patterns:

// Discrete steps
float folds = floor(2.0 + u_macros[0] * 6.0);    // 2, 3, 4, 5, 6, 7, 8

// Exponential range (perceptually linear)
float speed = exp(u_macros[1] * 4.0 - 2.0);       // 0.14× to 7.4×

// Binary toggle at center
if (u_macros[2] > 0.5) { /* mirror mode on */ }

// Cross-fade between behaviours
vec3 col = mix(colA, colB, u_macros[3]);

Output — never use gl_FragColor in GLSL ES 3.0:

fragColor = vec4(clamp(col, 0.0, 1.0), 1.0);

ES 3.0 feature highlights:

FeatureES 1.0 (old)ES 3.0 (current)
Fragment outputgl_FragColorout vec4 fragColor
Fragment inputvarying vec2 v_uvin vec2 v_uv
Texture samplingtexture2D(s, uv)texture(s, uv)
Dynamic array indexNot allowedu_audio[i] in loops ✓
Bitwise opsNoint n = a & b;

4 — ISF Shader Spec

ISF (Interactive Shader Format) is an industry-standard GLSL wrapper used by Resolume, VDMX, and other VJ tools. Smerge's ISF preprocessor strips the JSON header and injects its own uniform block so ISF shaders run natively. Only single-pass shaders are supported.

File structure:

/*{
  "DESCRIPTION": "One-sentence description shown in the library",
  "INPUTS": [
    {"NAME": "macro1Name", "TYPE": "float", "DEFAULT": 0.5, "MIN": 0.0, "MAX": 1.0},
    {"NAME": "macro2Name", "TYPE": "float", "DEFAULT": 0.0, "MIN": 0.0, "MAX": 1.0},
    {"NAME": "macro3Name", "TYPE": "float", "DEFAULT": 0.5, "MIN": 0.0, "MAX": 1.0},
    {"NAME": "macro4Name", "TYPE": "float", "DEFAULT": 1.0, "MIN": 0.0, "MAX": 1.0}
  ]
}*/

void main() {
  // your code here — up to 4 float INPUTS map to u_macros[0–3] in order
  gl_FragColor = vec4(color, 1.0);
}

ISF ↔ Smerge compatibility defines (injected automatically):

ISF nameSmerge equivalent
isf_FragNormCoordv_uv (0–1 UV)
TIMEu_time
RENDERSIZEu_resolution
PASSINDEX0 (always single pass)

All Smerge uniforms (u_audio[64], u_rms, u_beat, u_bpm, u_xy, u_macros[0–3]) are also available in every ISF shader. Output uses gl_FragColor as in standard ISF — the preprocessor converts it to fragColor automatically.

5 — Three.js Scene Spec

Three.js generators run JavaScript and build a full 3D scene using the Three.js r163 API. Export setup and update as plain function declarations:

let mesh, light   // shared between setup and update

function setup(ctx) {
  const { THREE, scene, camera, renderer } = ctx
  // Build your scene here — runs once on init
}

function update(ctx) {
  if (!mesh) return   // always guard against partial setup failure
  const { clock, beat, rms, macros, audio } = ctx
  // Animate your scene — runs every frame (~60 fps)
}

setup(ctx) properties:

PropertyTypeDescription
ctx.THREEObjectThe Three.js namespace
ctx.sceneTHREE.SceneRoot scene — add all objects here
ctx.cameraTHREE.PerspectiveCameraDefault 50° FOV perspective camera
ctx.rendererTHREE.WebGLRendererWebGL renderer — use for setClearColor, setPixelRatio, etc.

update(ctx) properties:

PropertyTypeDescription
ctx.clockTHREE.ClockUse clock.getElapsedTime() for continuous animation
ctx.beatnumberBeat envelope, 1.0 on beat → 0.0 over ~300 ms
ctx.rmsnumberOverall loudness, 0.0–1.0
ctx.xy[number, number]XY pad, each axis 0.0–1.0 (default 0.5)
ctx.macrosFloat32Array(4)M1–M4, each 0.0–1.0
ctx.audioFloat32Array(64)FFT bands 0–63, each 0.0–1.0

Camera setup:

function setup(ctx) {
  const { camera } = ctx
  camera.position.set(0, 2, 5)
  camera.lookAt(0, 0, 0)
  // To override FOV:
  camera.fov = 70
  camera.updateProjectionMatrix()
}

Audio reactivity & macro patterns:

function update(ctx) {
  const { clock, beat, rms, macros, audio } = ctx
  const t = clock.getElapsedTime()

  const bass = audio[4]  ?? 0
  const mid  = audio[20] ?? 0
  const hi   = audio[52] ?? 0

  // Scale + rotate on beat
  mesh.scale.setScalar(1 + rms * 0.3 + beat * 0.4)
  mesh.rotation.y = t * 0.3 + beat * 0.8

  // Color cycle through hue
  light.color.setHSL((t * 0.05 + macros[2]) % 1.0, 1.0, 0.5)
  light.intensity = 2 + bass * 8 + beat * 6

  // Binary toggle at midpoint
  mesh.material.wireframe = macros[3] > 0.5
}

XY orbit pattern:

const azimuth   = (xy[0] - 0.5) * Math.PI * 2
const elevation = (xy[1] - 0.5) * Math.PI
camera.position.x = Math.cos(elevation) * Math.sin(azimuth) * 4
camera.position.y = Math.sin(elevation) * 4
camera.position.z = Math.cos(elevation) * Math.cos(azimuth) * 4
camera.lookAt(0, 0, 0)
Always guard update(). If setup() throws partway through, shared variables remain undefined. Without a guard, update() throws 60× per second. Start every update() with if (!mesh || !light) return.

6 — Shadertoy Spec

Shadertoy-type shaders write a single mainImage() function using Shadertoy.com's own uniform names — no #version, precision statement, or standard uniform declarations needed; SMERGE injects them automatically:

void mainImage(out vec4 fragColor, in vec2 fragCoord) {
    vec2 uv = fragCoord / iResolution.xy;

    // Your visual logic here

    fragColor = vec4(col, 1.0);
}
UniformTypeNotes
iTimefloatElapsed seconds
iTimeDeltafloatFixed at 1/60
iResolutionvec3Canvas size in pixels, z = 1.0
iMousevec4Driven by XY Pad position × resolution
iFrameintElapsed-time approximation (single-pass has no persistent buffer to count real frames from)
iDatevec4Stubbed to zero
iSampleRatefloatStubbed to 44100.0
iChannel0iChannel3sampler2DAll four alias one shared image slot — assign via the channel strip

SMERGE's audio/macro extensions are available alongside the standard set: u_beat, u_rms, u_bpm, u_audio[64], u_macros[4], u_xy — identical meaning to the GLSL/ISF/Three.js versions described in §2 above.

7 — Shadertoy MB (Multi-Buffer) Spec

A multi-buffer bundle is JSON: a common string, a buffers object with keys A–D (each null or a pass), and a mandatory image pass. The tabbed editor described above reads and writes this same structure — you rarely need to touch the JSON directly.

{
  "version": 1,
  "common": "",
  "buffers": {
    "A": {
      "code": "void mainImage(out vec4 fragColor, in vec2 fragCoord) { ... }",
      "inputs": [ { "channel": 0, "type": "buffer", "ref": "A" } ],
      "resolutionScale": 1.0
    },
    "B": null, "C": null, "D": null
  },
  "image": {
    "code": "void mainImage(out vec4 fragColor, in vec2 fragCoord) { ... }",
    "inputs": [ { "channel": 0, "type": "buffer", "ref": "A" } ]
  }
}

Every pass writes a standard mainImage() — the same signature as single-pass Shadertoy — but each declared channel is a real, independent input rather than an alias to one shared slot:

Input typerefReads
"buffer""A"–"D"That buffer's own output from the end of the previous frame. A buffer referencing its own letter is self-feedback.
"texture""img0"–"img3"A user-assigned static image slot (see Image Slots above) — black until assigned.

Buffers execute in a fixed order every frame — A → B → C → D → Image — and every buffer-type channel always reads the referenced buffer's state from the end of the previous frame, so pass order within a single frame never needs to be reasoned about.

iFrame behaves differently here than in single-pass mode: for a Buffer A–D pass it's a real per-buffer frame count, starting at 0 the first time that buffer ever renders. Test iFrame < 1 to seed a buffer's initial state — random soup for cellular automata, an initial density field for a simulation — rather than relying on a beat/audio trigger to eventually populate it. The Image pass has no buffer of its own, so its iFrame remains only an elapsed-time approximation, as in single-pass mode.

Undamped self-feedback is a stuck-frame bug. Any buffer that accumulates onto its own previous frame (decay trails, glow, reaction-diffusion) needs an explicit decay or reaction term — without one, values saturate and the buffer freezes at a fixed point within a few dozen frames, which looks exactly like "the shader stopped working" even though it's still compiling and running every frame.

8 — Macro Design Guidelines

Macros are the primary performance interface — treat them as instrument controls.

MacroSuggested roleModulation targets
M1Primary form / structureLFO → pulsing geometry, beat-sync
M2Speed / time rateEnvelope → accelerate on beat
M3Color / paletteMIDI CC → tonal control
M4Texture / detailAudio band → high-freq detail

Range design rule:

The Mod Matrix can assign LFOs, beat envelopes, audio bands, and MIDI CCs to any macro — all additive and clamped. Because modulations push values above 0.5, design your shader so the upper half of every macro range is already interesting territory.

9 — Cross-Type Comparison

FeatureGLSLISFThree.js
LanguageGLSL ES 3.0GLSL ES 3.0 (via preprocessor)JavaScript (ES2022)
Macrosu_macros[0–3]u_macros[0–3] (from INPUTS)macros[0–3] Float32Array
Audiou_audio[64]u_audio[64]audio[64] Float32Array
Beatu_beatu_beatbeat number
RMSu_rmsu_rmsrms number
XYu_xy vec2u_xy vec2xy[2] array
Timeu_timeTIME (or u_time)clock.getElapsedTime()
UV coordsv_uv (in)isf_FragNormCoordcamera + projection
Texture inputu_tex0 samplernot supportedTHREE.TextureLoader
Output variablefragColorgl_FragColor (auto-converted)renderer target
GPU costlowestlowmedium–high

Shadertoy and Shadertoy MB aren't in the table above because they use Shadertoy's own naming instead of SMERGE's u_-prefixed convention — iTime not u_time, mainImage() not main(), and so on. See §6 and §7 above for their full uniform reference. SMERGE's audio/macro/XY extensions (u_beat, u_rms, u_bpm, u_audio[64], u_macros[4], u_xy) are identical across all five types.

10 — Performance Tips

GLSL / ISF

Three.js

11 — Quick-Start Templates

GLSL:

#version 300 es
precision highp float;

uniform vec2  u_resolution;
uniform float u_time;
uniform vec2  u_xy;
uniform float u_macros[4];
uniform float u_audio[64];
uniform float u_rms;
uniform float u_beat;
uniform float u_bpm;
in vec2 v_uv;

out vec4 fragColor;

// M1 = scale  M2 = speed  M3 = color hue  M4 = glow

void main() {
  vec2 uv = v_uv * 2.0 - 1.0;
  uv.x *= u_resolution.x / u_resolution.y;

  float scale = 1.0 + u_macros[0] * 6.0;
  float speed = 0.2 + u_macros[1] * 2.0;
  float bass  = u_audio[4];
  float t     = u_time * speed;

  float r = length(uv * scale) + bass * 0.5;
  float v = 0.5 + 0.5 * sin(r * 4.0 - t + u_beat * 3.14159);

  vec3 col = 0.5 + 0.5 * cos(6.28318 * (u_macros[2] + v + vec3(0.0, 0.33, 0.67)));
  col *= 0.7 + u_rms * 0.6 + u_beat * 0.4;

  fragColor = vec4(clamp(col, 0.0, 1.0), 1.0);
}

ISF:

/*{
  "DESCRIPTION": "My ISF shader — describe it here",
  "INPUTS": [
    {"NAME": "scale",  "TYPE": "float", "DEFAULT": 0.5, "MIN": 0.0, "MAX": 1.0},
    {"NAME": "speed",  "TYPE": "float", "DEFAULT": 0.4, "MIN": 0.0, "MAX": 1.0},
    {"NAME": "hue",    "TYPE": "float", "DEFAULT": 0.0, "MIN": 0.0, "MAX": 1.0},
    {"NAME": "glow",   "TYPE": "float", "DEFAULT": 0.5, "MIN": 0.0, "MAX": 1.0}
  ]
}*/

void main() {
  vec2 uv = isf_FragNormCoord * 2.0 - 1.0;
  uv.x *= RENDERSIZE.x / RENDERSIZE.y;

  float sc   = 1.0 + u_macros[0] * 6.0;
  float spd  = 0.2 + u_macros[1] * 2.0;
  float bass = u_audio[4];

  float r = length(uv * sc) + bass * 0.5;
  float v = 0.5 + 0.5 * sin(r * 4.0 - TIME * spd + u_beat * 3.14159);

  vec3 col = 0.5 + 0.5 * cos(6.28318 * (u_macros[2] + v + vec3(0.0, 0.33, 0.67)));
  col *= 0.7 + u_rms * 0.6 + u_beat * 0.4;

  gl_FragColor = vec4(clamp(col, 0.0, 1.0), 1.0);
}

Three.js:

// M1 = mesh scale  M2 = rotation speed  M3 = light hue  M4 = wireframe toggle
let mesh, light

function setup(ctx) {
  const { THREE, scene, camera, renderer } = ctx
  renderer.setClearColor(0x000000)

  const geo = new THREE.IcosahedronGeometry(1, 1)
  const mat = new THREE.MeshStandardMaterial({ color: 0x00aaff, metalness: 0.8, roughness: 0.2 })
  mesh = new THREE.Mesh(geo, mat)
  scene.add(mesh)

  light = new THREE.PointLight(0xffffff, 4, 20)
  light.position.set(3, 3, 3)
  scene.add(light)
  scene.add(new THREE.AmbientLight(0x111111, 1))

  camera.position.z = 3.5
  camera.lookAt(0, 0, 0)
}

function update(ctx) {
  if (!mesh || !light) return
  const { clock, beat, rms, macros, audio } = ctx
  const t = clock.getElapsedTime()

  const speed = 0.1 + macros[1] * 0.9
  mesh.rotation.x = t * speed * 0.4
  mesh.rotation.y = t * speed + beat * 0.8

  const s = (0.5 + macros[0] * 1.0) * (1 + rms * 0.3 + beat * 0.3)
  mesh.scale.setScalar(s)

  mesh.material.wireframe = macros[3] > 0.5

  light.color.setHSL((t * 0.06 + macros[2]) % 1.0, 1.0, 0.5)
  light.intensity = 3 + audio[4] * 8 + beat * 6
}

Shadertoy:

// M1 = scale  M2 = speed  M3 = color hue  M4 = glow

void mainImage(out vec4 fragColor, in vec2 fragCoord) {
  vec2 uv = (fragCoord - 0.5 * iResolution.xy) / iResolution.y;

  float scale = 1.0 + u_macros[0] * 6.0;
  float speed = 0.2 + u_macros[1] * 2.0;
  float bass  = u_audio[4];

  float r = length(uv * scale) + bass * 0.5;
  float v = 0.5 + 0.5 * sin(r * 4.0 - iTime * speed + u_beat * 3.14159);

  vec3 col = 0.5 + 0.5 * cos(6.28318 * (u_macros[2] + v + vec3(0.0, 0.33, 0.67)));
  col *= 0.7 + u_rms * 0.6 + u_beat * 0.4;

  fragColor = vec4(clamp(col, 0.0, 1.0), 1.0);
}

Shadertoy MB — the simplest useful multi-buffer shape: one self-feedback decay-trail buffer plus an Image pass that just displays it (this is also what New pre-fills when Shadertoy MB is selected):

Buffer A — channels: iChannel0 = buffer, ref "A" (self-feedback)

void mainImage(out vec4 fragColor, in vec2 fragCoord) {
  vec2 uv = fragCoord / iResolution.xy;
  vec4 prev = texture(iChannel0, uv) * 0.92;  // decay — tune retention 0.85–0.95

  vec2 center = 0.5 + 0.35 * vec2(cos(iTime), sin(iTime * 1.3));
  float d = length(uv - center);
  float dot = smoothstep(0.03, 0.0, d);

  fragColor = prev + vec4(dot, dot * 0.4, 1.0 - dot, 1.0) * dot;
}

Image — channels: iChannel0 = buffer, ref "A"

void mainImage(out vec4 fragColor, in vec2 fragCoord) {
  vec2 uv = fragCoord / iResolution.xy;
  fragColor = texture(iChannel0, uv);
}
Chapter 08

Scene Launcher

The Scene Launcher stores up to 8 complete snapshots of your session state. A single click recalls a saved scene instantly — switching sources, opacity levels, blend modes, effects, macro values, and mod routing all at once. Open it from the Scenes button in the title bar.

Scene Launcher — 8 scene slots
The Scene Launcher with 8 empty slots arranged in a 4×2 grid. Right-click any slot to save the current state.

Saving a Scene

Right-click any numbered slot to save the current state. Everything is captured:

Recalling a Scene

Click a saved slot to recall it immediately. Use the ♩ Q controls to shape the transition:

ControlFunction
♩ BPM syncQuantizes recall to the next beat or bar boundary — the scene waits for the downbeat to switch.
Q QuantizeSets the quantize grid — 1 bar, 1/2, or 1/4 note.

Performance Workflow

  1. Build a look — set sources, blend modes, effects, and macro positions
  2. Right-click a slot and save it
  3. Repeat for each mood or moment you want to move between
  4. During the performance, click slots to transition between prepared looks
Tip: Assign scene recall to MIDI pads via the MIDI Router for hands-free switching. Pair with BPM sync so every scene change lands on the downbeat.
Chapter 09

MIDI Map

The MIDI Map connects hardware MIDI controllers to any parameter in SMERGE. Once mapped, your controller operates the software directly with no latency. Open it from the MIDI button in the title bar.

MIDI Map panel
The MIDI Map panel. Click Connect MIDI and approve the system permission to enable hardware control.

Connecting MIDI

SMERGE requires explicit permission to access MIDI devices. If you see "MIDI access denied", click Connect MIDI and approve the system permission prompt. This is a one-time grant.

If Connect MIDI does not resolve the issue, open System Settings → Privacy & Security → MIDI and verify SMERGE has access. Disconnect and reconnect your MIDI device, then restart the application.

Creating a Binding — MIDI Learn

  1. Open the MIDI Map panel
  2. Right-click the parameter you want to control — any fader, knob, or macro
  3. Select Learn MIDI from the context menu — a yellow learn bar appears at the top of the panel showing which parameter is waiting for a CC
  4. Move the hardware control. Watch the orange activity dot in the panel header — it flashes on every incoming MIDI message, confirming SMERGE is receiving from your device. The last CC received is shown below the device name (e.g. CC 7 ch1: 64).
  5. SMERGE captures the CC and creates the binding automatically. The learn bar dismisses and the new entry appears in the Bindings list.
Tip: If the activity dot does not flash when you move the hardware control, the device is connected but not transmitting on the expected port or channel. Check your MIDI interface routing, or try disconnecting and reconnecting the controller while the MIDI Map panel is open.
To cancel learn mode without creating a binding, click the Cancel button in the yellow learn bar.

Saving and Loading MIDI Maps

ButtonFunction
LoadLoads a saved .json MIDI map file
SaveExports all current bindings to a .json file
+Manually adds a binding by entering a MIDI channel and CC number

MIDI maps are saved independently from presets — your hardware setup persists across sessions regardless of which preset is loaded.

Recommended Mappings

HardwareSMERGE Target
8 linear fadersCH1–CH8 opacity
8 rotary knobsM1–M4 across two channels
Touchpad / joystickXY Pad 1 X and Y
Trigger padsScene slots 1–8
Single knobMaster BPM
ButtonHIDE toggle per channel
Tip: Save a dedicated MIDI map file for each controller you perform with and load the appropriate map at the start of a set.
Chapter 10

Tap Tempo / BPM

The Tap Tempo / BPM panel sets the global clock that all time-synced elements lock to — LFOs in BPM sync mode, beat-triggered envelopes, the Step Sequencer, scene quantization, and BPM-synced video playback. Open it from the Tempo button in the title bar. The current BPM and source (AUTO or MAN) are always visible in the title bar.

Tap Tempo / BPM panel
Tap Tempo / BPM panel showing AUTO detection mode with a detected tempo and the manual TAP button

Auto BPM (default)

By default, SMERGE is in AUTO mode. When audio is connected, the beat detector continuously analyzes the incoming signal and updates the global BPM in real time — no tapping required. The detected BPM appears in the title bar with an AUTO badge.

Auto mode works best with a direct feed from your DJ mixer or DAW. For microphone input in a loud room, the detector may lock on a half or double time. If that happens, switch to Manual mode and enter the correct value.

If no audio is connected, AUTO mode holds the last detected BPM. If no BPM has ever been detected in the current session, the clock defaults to 120 BPM.

Manual Mode

Click MANUAL to take control of the BPM yourself. In manual mode you can:

ControlFunction
TAPClick repeatedly in time with the music. SMERGE averages the last several taps. Four or more taps gives the most accurate result. Tapping automatically switches to Manual mode.
BPM fieldDisplays the current tempo. Click and type to enter a precise value directly.
AUTO buttonSwitch back to automatic audio-based detection at any time.

Workflow

For DJ sets with audio input: Leave SMERGE in AUTO mode. Connect your DJ mixer output to your audio interface and select it in Settings → Audio. The BPM will follow the music automatically as you mix.

For live bands or unpredictable tempo: Use TAP mode — tap four or more times on the kick to lock in, then re-tap whenever the tempo shifts.

For prepared or studio sets: Type the BPM directly in Manual mode. If your DAW displays a precise BPM, enter it here for frame-accurate sync.

Tip: All BPM-synced elements — LFOs, envelopes, scene quantization, and the Step Sequencer — respond instantly when the tempo changes. A single re-tap or mode switch keeps the whole system in time.
Chapter 11

Settings

The Settings panel configures SMERGE's connections to the outside world — audio input, MIDI devices, video output, and network protocols. Open it with ⌘, or via the app menu.

Settings — Audio section
Settings panel — Audio section with input device, connection status, and FFT Smoothing controls

Audio

Input Device

Selects the microphone or audio interface SMERGE uses for audio reactivity and beat detection. For best results in a performance environment, select a dedicated audio interface or virtual audio driver (Loopback, BlackHole) that receives your DJ or DAW output directly.

Audio Input

Shows connection status. Click Connect to activate the selected input. The indicator turns green when the input is live.

SMERGE analyzes audio in real time for BPM detection, beat triggering, and per-band reactivity (Sub / Bass / Mid / High). No audio is ever recorded or written to disk.

FFT Smoothing

ValueBehavior
High (80–100%)Smooth, fluid reactivity — best for sustained musical audio.
Low (0–40%)Maximum responsiveness — snaps to every transient. Best for percussive material.

Appearance

SMERGE ships with four UI color themes, selectable from the Appearance tab (the first tab in Settings).

ThemeSurfaceAccentCharacter
Phantom (default)Near-blackSignal greenThe original SMERGE look — high contrast, zero distraction.
StudioCool dark slateAqua blueSlightly lighter panels with a cool, broadcast-monitor feel.
CanyonWarm dark amberHot orangeEarthy warm tones — evokes analog hardware and stage lighting rigs.
ChalkIvory creamForest greenLight background — ideal for bright environments or personal preference.
DuskDark violetDusty roseInspired by the SMERGE icon gradient — warm rose fading into periwinkle lavender.
Semantic color coding stays consistent regardless of theme — MIDI bindings are always orange, FX purple, randomization pink, and per-lane colors remain fixed. Only surface, border, text, and accent colors change.

Your theme choice is saved automatically and restored on next launch. The output and preview windows follow the same theme.

Other Settings Sections

SectionPurpose
AppearanceUI color theme (Phantom / Studio / Canyon / Chalk / Dusk). Persisted and synced to output window.
MIDIMIDI device access. See Chapter 9 — MIDI Map for the full binding workflow.
OutputSecond display configuration. See Chapter 12 — Output.
SyphonGPU texture share to Resolume, MadMapper, VDMX, OBS on the same Mac.
OSCUDP listener (port 8000) for OSC control. Listens on localhost only by default — enable Network Access in this section to control SMERGE from TouchOSC or other devices on your WiFi/LAN.
DMXArt-Net DMX512 output — enable, set the destination IP and universe, and route mod sources to DMX channels. See Chapter 14 — Art-Net / DMX.
AIAPI key management for AI shader generation. Supports Claude, ChatGPT, Gemini, and Ollama. See Chapter 15 — AI Shader Generator.
AboutApplication version, build number, and AortaLabs credits.
Tip: If you change the audio input device and the analyzer stops responding, reload the app — the audio engine may have cached the old stream.
Chapter 12

Output

The Output panel controls how SMERGE sends its composited video to the world — a second display, other applications on the same Mac, a network stream, or a recorded file. It also contains the projection mapping tools: Projector Preview and Projection Surfaces. Open it from the Output button in the title bar.

Output panel
The Output panel showing Display Output, Projector Preview, Projection Surfaces, Syphon, and Record sections

Display Output

Sends SMERGE's live output to a connected display in fullscreen.

ControlFunction
Display dropdownLists all connected displays. Select the projector, LED wall controller, or monitor for visual output.
Refresh the display list — use this if you connect a display after launching SMERGE.
OpenLaunches a fullscreen output window on the selected display at native resolution.
Tip: Connect your projector or LED processor before launching SMERGE so it appears in the display list.

Projector Preview

Opens a resizable window on your laptop screen that shows exactly what the projector is rendering — the same pixel-accurate output at half resolution (960×540). Use it to monitor the projection while the projector is aimed at a surface you cannot see directly from your laptop.

Projector preview window
The Projector Preview window showing the live output at 960×540. The main Smerge window remains fully accessible — switching to a new macOS Space is not required.
Tip: Resize the Projector Preview window to match your projector's aspect ratio. If your projector is 4:3 or ultra-wide, drag the window edges until the preview fills it without stretching.

Projection Surfaces

The Projection Surfaces section maps SMERGE's output onto one or more physical surfaces. Each surface is an independent region of the projector image with its own warp, its own crop of the composition, and its own soft-edge blend. A single surface covering the whole frame behaves exactly like a classic corner-pin keystone correction; several surfaces let you map multiple objects from one composition, or blend two projectors edge-to-edge.

Every surface has four parts:

PartWhat it does
Warp modeNone (place and crop only, no warp), Corner Pin (projective keystone/angle correction), or Mesh (a grid of control points for curved and irregular surfaces).
Output placementWhere on the projector this surface is drawn, and — in Corner Pin mode — the four corners that shape its warp.
Input cropWhich part of the composition this surface shows. Leave it full to show everything, or crop it so each mapped object shows a different region.
Edge BlendSoft brightness falloff on any edge, for seamlessly overlapping two or more projectors.

The Surface List

Each row is one surface: a colored dot, its name, its warp mode, an enable toggle (◉ / ○), and a delete button. Click a row to edit that surface below. + Add creates a new surface — adding the second one automatically splits the canvas into left and right halves, the fast path for a two-projector setup. The 🔓 / 🔒 button locks the mapping (see Venue Persistence below).

Editing a Surface

Choose a warp mode, then use the Output and Input tabs above the preview:

Mesh Warp — Curved and Irregular Surfaces

Corner Pin only bends the four corners, which is perfect for flat panels at an angle but can't follow a curved wall, a cylinder, or an object with a bowed face. Mesh mode gives you a grid of control points you can push and pull to wrap the image around any shape.

Set the surface's warp mode to Mesh, then on the Output tab:

Tip: Project Test Grid while shaping a mesh — its straight lines make it obvious where the surface still bows. The mesh renders on a fine internal grid, so curves stay smooth no matter how few control points you use.

Calibration Workflow

  1. Open the Output panel and click Open to send SMERGE to the projector display.
  2. In the Source Manager, assign Test Corners or Test Grid (Generators → Mapping) to a channel at full opacity so you have an alignment reference on the surface.
  3. Select the surface, set its warp mode to Corner Pin, and open the Output tab.
  4. Drag each colored corner dot to match the physical corner of your surface. Edits apply to the projector live — watch the actual projection (or the Projector Preview) as you drag.
  5. Switch to Test Grid to confirm the warp is even; grid lines should sit straight and parallel to the surface edges.
  6. Replace the test pattern with your content. The calibration stays put.

Camera-Assisted Calibration

Instead of dragging corners by eye, you can point a camera at the projection and let SMERGE solve the warp for you. This works entirely in the camera image, so you never have to guess how a projector-space corner relates to a spot on the physical surface.

Select a surface and click 📷 Calibrate with Camera…. In the dialog:

  1. Pick your camera from the dropdown. Its live view fills the dialog. (Aim it so it sees the whole projection; open the Output window if the markers aren't showing.)
  2. SMERGE projects four coloured markers. Click each one where the camera sees it, in order: red (top-left), green (top-right), blue (bottom-left), yellow (bottom-right).
  3. Four handles appear. Drag them onto the corners of the surface you want the image to fill.
  4. Click Apply Calibration — SMERGE computes the corner-pin so the content lands exactly on that surface.
Tip: The camera doesn't need to be square-on or high quality — it only has to see the four markers and the surface. After applying, watch the projection (or the camera) and nudge corners by hand if you want to perfect it.

Two-Projector Edge Blending

To cover a wide surface with two overlapping projectors from a single composition:

  1. Add a second surface (the canvas auto-splits into two halves).
  2. Give the two surfaces overlapping input crops — e.g. the left surface shows input X 0 → 0.55, the right shows 0.45 → 1.0, so a shared strip appears on both.
  3. Turn on Edge Blend for each and raise the facing edge (Right on the left surface, Left on the right surface) until the overlap fades smoothly. Adjust Gamma until the blended seam matches the brightness of the rest of the image — no bright bar, no dark band.
SMERGE drives one output window on one display. For two physical projectors, present them to the Mac as a single wide display (a hardware mosaic / splitter such as a Datapath FX4, or the projectors' own edge-blend-friendly EDID), or send SMERGE's output to a dedicated mapping tool over Syphon.

Venue Persistence

Your surfaces are venue state: they are saved automatically and restored on the next launch, so you can switch presets all night without the projectors moving. Loading a preset only changes the mapping if that preset was saved with its own surfaces — a preset with no mapping leaves your calibration alone. For total safety on show night, click the 🔒 lock so preset loads never touch the mapping at all.

Warp and blend apply to the final composited output only. Masks drawn in the Mask Editor are applied per-channel before the warp, so shaped layers stay sharp. Presets saved before this version that used the old single Corner Pin are migrated automatically into a single surface.

Syphon

Shares SMERGE's GPU output frame with other macOS applications in real time — zero encoding latency, no quality loss.

ControlFunction
○ indicatorGreen when Syphon is actively broadcasting.
StartBegins publishing SMERGE's output as a Syphon source named SMERGE.

Compatible receiving applications: Resolume Avenue / Arena, MadMapper, VDMX, OBS.

Record

Captures SMERGE's output directly to a video file on disk.

ControlFunction
○ indicatorRed when recording is active. Also reflected by the REC button in the title bar.
StartOpens a save dialog, then begins recording. Click Stop to finish and write the file.
Recordings capture both video and audio. SMERGE taps the same audio input used for reactivity (the device selected in Settings → Audio), mixes it with the visual output, and encodes both into the MP4 file at 192kbps AAC. The output is constant-framerate H.264 — compatible with QuickTime, Final Cut Pro, and all standard video editors.
Display output, Syphon, and Record can all run simultaneously — all three read from the same final composited frame with no performance penalty from routing to multiple destinations.
Chapter 13

Mask Editor

The Mask Editor lets you draw a bezier shape that masks any channel — controlling exactly which part of that layer is visible in the final composite. This is the primary tool for projection mapping: trace the outline of a physical surface, assign a source to fill it, and everything outside the shape disappears.

Open the Mask Editor by clicking the ✒ button in a channel card in the Source Manager. The button is orange-tinted before a mask exists, glows orange when a path exists but is toggled off, and turns blue while the mask is active. Close the editor at any time — the mask continues running silently in the background.

Toolbar

ControlFunction
↩ / ↪Undo / Redo — up to 50 steps. Also ⌘Z / ⌘⇧Z.
◈ Shapes ▾Shape presets — Circle, Rectangle, Triangle, Diamond. Click a shape to enter draw mode, then click and drag on the canvas to size it.
✒ PenPen tool — click to place anchor points and draw a custom bezier path.
↖ EditEdit tool — drag anchor points and bezier handles to refine the shape.
⬧ MoveMove tool — drag the entire mask to reposition it without editing individual points.
⊘ InvertInvert the mask — hides what was visible and shows what was hidden.
● On / ○ OffToggle the mask on or off without clearing the path.
ClearRemove all anchor points and reset the path.
DoneClose the editor. The mask stays active in the background.

Pen Tool — ✒ (P)

The Pen tool is the default mode when no path exists. Use it to draw a custom bezier shape around any surface.

Placing anchors

Closing the path

Tip: The mask does not affect the live output while you are still placing anchors — the output is unchanged until the path is closed.

Edit Tool — ↖ (A)

Use Edit mode to refine the shape after the path is closed. All anchors and handles are visible simultaneously.

Anchors

Bezier handles

Move Tool — ⬧ (V)

Drag anywhere on the canvas to shift the entire mask without editing individual points. Useful for nudging a finished mask into precise alignment. Shift + drag constrains movement to horizontal or vertical.

Shape Presets

Click ◈ Shapes ▾ to open the presets dropdown and select Circle, Rectangle, Triangle, or Diamond. Selecting a shape activates draw mode — the cursor changes to a crosshair and the hint bar shows instructions.

To place the shape: click and drag on the canvas to define the bounding box. The shape scales live as you drag. Release to commit. Hold Shift while dragging to constrain the shape to equal proportions (a perfect circle or square). Press Esc to cancel without placing anything.

Tip: After committing a shape, the editor switches to Edit mode automatically. Drag individual anchors and handles to fine-tune the outline.

Keyboard Shortcuts

KeyAction
PSwitch to Pen tool
ASwitch to Edit tool
VSwitch to Move tool
⌘ZUndo
⌘⇧ZRedo
Shift45° snap (Pen/handles) · Axis lock (anchors/Move) · Equal proportions (Shapes)
Alt + drag handleBreak smooth link — move handles independently
Delete / ⌫Remove selected anchor
EscapeCancel shape draw mode, or close the Mask Editor

Multiple Masks Per Layer

Each channel supports more than one bezier mask simultaneously. To add a second mask to a channel that already has one, open the Mask Editor and use the + Add button in the toolbar. Each mask has its own path, invert state, and on/off toggle — they are all composited together before being applied to the channel.

Multiple masks are useful for complex projection mapping surfaces: define separate shapes for each panel of a multi-surface installation without needing separate channels for each panel.

Tip: Each mask can be independently toggled on or off mid-performance — quickly swap between different mappings of the same surface without redrawing paths.

Copying and Pasting Masks

When you copy a channel in the Fader Bank (right-click a strip → Copy), the mask path, invert state, and on/off status are all included in the clipboard. Paste transfers the complete mask to the destination channel — no redrawing required. This is the fastest way to apply the same projection mapping shape to multiple content layers on the same surface.

Projection Mapping Workflow

SMERGE handles the full projection mapping pipeline in one place — geometric correction, surface masking, and live monitoring — without requiring separate mapping software.

Step 1 — Geometric Correction (Corner Pin)

  1. Connect your projector and open the Output panel. Click Open to send SMERGE fullscreen to the projector display.
  2. Open the Projector Preview window so you can monitor the output on your laptop.
  3. Assign Test Corners (Generators → Mapping) to a channel and bring it to full opacity. Four colored corner markers appear on the surface.
  4. Enable Corner Pin in the Output panel. Drag the colored dots to match the physical corners of your projection surface — use the Projector Preview to judge alignment.
  5. Switch to Test Grid to verify the warp is even. Grid lines should appear straight and parallel to the surface edges.

Step 2 — Surface Masking (Mask Editor)

  1. Assign a Camera source to one channel at around 50% opacity — this gives a live reference of the surface visible through your content layers.
  2. Assign your video or generator source to another channel at full opacity.
  3. Click on the content channel to open the Mask Editor. Use the Pen tool to trace the outline of the surface.
  4. Close the path by clicking the first anchor. The source is now masked to the shape.
  5. Switch to Edit mode and fine-tune anchor positions and curves until the mask fits precisely.
  6. Lower the camera channel opacity or hide it entirely when finished.
All channels default to 50% opacity, so a camera reference layer naturally shows through content layers while you draw — no separate ghost mode is needed.
Tip: Save a preset after completing geometric correction and mask setup. Both the corner pin positions and all mask paths are stored — reload the preset the next time you perform at the same venue.
Chapter 14

Art-Net / DMX

SMERGE can output Art-Net DMX512 packets over UDP, letting it drive lighting fixtures, LED controllers, haze machines, or any DMX-compatible device in your rig alongside the visuals. Art-Net carries standard DMX512 data over a regular Ethernet or Wi-Fi network — no dedicated DMX interface or USB dongle required.

Enable DMX Output

Open Settings → DMX. Click Enable to start broadcasting Art-Net packets.

SettingDescription
DMX OutputEnable / Disable button. When enabled, SMERGE sends Art-Net packets at the frame rate.
Art-Net IPDestination IP address. Use 255.255.255.255 (default) to broadcast to every device on the subnet, or enter a specific node IP to address one controller directly.
UniverseArt-Net universe number (0–32767). Match this to the universe configured on your lighting controller.
Channel CountNumber of DMX channels to expose (1–512). Only channels you actually use need to be enabled — keep this low for efficiency.
Art-Net packets are sent via UDP to port 6454, the standard Art-Net port. SMERGE supports one universe per session. Ensure your Mac and lighting controller are on the same network or VLAN.

Channel Map

When DMX is enabled, the Channel Map appears in Settings — a live bar display showing the current value (0–255) of every active DMX channel. This lets you verify signal flow before connecting physical fixtures.

Routing DMX Values from the Mod Matrix

DMX channels are driven by the Mod Matrix, not set to fixed values. Any modulation source — LFO, envelope, audio band — can be routed to a DMX channel target:

  1. Open the Mod Patch Bay.
  2. In the target list, scroll to the DMX section — channels appear as dmx/ch-1 through dmx/ch-N.
  3. Drag a source node to the target to create a connection. The DMX channel will mirror that source's 0.0–1.0 range, scaled to 0–255.

This design means DMX output is entirely audio-reactive and BPM-synced through the same modulation system that drives your visuals — lamps, strobes, and washes can breathe and pulse in perfect time with the video.

Tip: To control an RGB fixture across three consecutive DMX channels, route three separate mod sources (or the same source to all three with different depth values) to dmx/ch-1, dmx/ch-2, dmx/ch-3.

Typical Setup

  1. Connect your Mac and the lighting controller to the same Ethernet switch or Wi-Fi network.
  2. Note the Art-Net universe your controller listens on (often Universe 0).
  3. In SMERGE Settings → DMX, set the IP to 255.255.255.255, the Universe to match, and Channel Count to cover your fixture's footprint.
  4. Click Enable. Verify signal in the Channel Map.
  5. Open the Mod Patch Bay and route audio, LFO, or envelope sources to the relevant dmx/ch-N targets.
  6. The lights follow the music — just like the visuals.
Chapter 15

AI Shader Generator

SMERGE includes a built-in AI code generator that can write custom GLSL fragment shaders from a text description. Access it via the ✦ AI button inside the Shader Editor. Describe the visual you want in plain language — "a golden fibonacci spiral reacting to bass" — and the AI streams working shader code directly into the editor. Compile, adjust, and save it like any other shader.

Setup — Adding an API Key

Open Settings → AI. SMERGE supports four providers:

ProviderModelNotes
Claude (Anthropic)claude-3-5-sonnet-20241022 (or newer)Best overall quality for shader code. Requires an Anthropic API key.
ChatGPT (OpenAI)gpt-4o (or newer)Strong results. Requires an OpenAI API key.
Gemini (Google)gemini-2.0-flash (or newer)Fast and free tier available. Requires a Google AI Studio API key.
Ollama (Local)Any Ollama-compatible modelFully offline — no API key needed. Requires Ollama running locally.

Paste your API key into the key field for the provider you want to use and click Save Key. Keys are encrypted at rest using Electron's secure storage and never leave your Mac — they are not shared with other users and are not accessible to the renderer process.

Ollama Setup

If you prefer to run AI locally, install Ollama (ollama.com) and pull a code-capable model such as deepseek-coder-v2 or qwen2.5-coder:7b. Set the Ollama Host in Settings → AI to http://localhost:11434 (the default). No API key is required.

Generating a Shader

  1. Open the Shader Editor and click ✦ AI in the top-right corner.
  2. Type your description in the prompt field.
  3. Press Generate (or ⌘↵).
  4. The AI streams code into the editor in real time. A progress indicator shows it is working.
  5. When generation completes, click Compile to test the shader. If it works, give it a name and click Save.
  6. Press ✕ Cancel at any time to stop mid-stream.

Writing Effective Prompts

The AI is trained to write shaders in the 80–120 line range using GLSL ES 1.0 (WebGL 1.0). Prompts that specify visual character, audio reactivity, and a color palette tend to produce the best results:

Prompt StyleExample
Visual + palette + audio"A grid of neon squares that scatter apart on u_beat and pulse with u_rms. Cyan/magenta IQ palette."
Pattern + geometry"Tiled hexagons with hash-based color variation, each cell size driven by u_macros[0]."
Organic + motion"Fluid, slow-moving plasma field using sin/cos in multiple frequencies. React bass bins to u_audio[2]."
Raymarching (advanced)"Raymarched torus SDF with soft shadows. Rotation speed tied to u_beat."

Useful uniforms to mention in prompts

Truncation and Retry

If a shader is complex and the AI runs out of tokens before finishing, SMERGE detects the truncation (the code will end mid-function rather than with a closing }) and shows a ↩ Retry shorter button. Clicking it re-sends the same prompt with an explicit instruction to keep the shader under 100 lines — trading some complexity for a complete, working result.

Multi-Buffer Shaders

Generating a Shadertoy MB shader works the same way but runs as several calls behind the scenes instead of one: a planning step first decides how many buffers the technique needs and how they're wired, then one focused call fills in each pass in turn. This is why a 3- or 4-buffer simulation still completes reliably rather than running out of output budget partway through — each call only has to write one pass. Describe the technique in plain language, the same as any other shader ("Conway's Game of Life reseeded on the beat," "Gray-Scott reaction-diffusion coral growth," "curl-noise fluid advection with dye density") and the finished bundle loads into the tabbed multi-buffer editor. See Multi-Buffer Shadertoy Shaders in Chapter 7 for the editor itself and prompting tips specific to feedback/simulation techniques.

Security Notes

Chapter 16

Step Sequencer

The Step Sequencer is a 16 or 32-step pattern engine that automates track opacity and macro parameters in sync with the global BPM clock. Unlike the Mod Patch Bay (which produces continuous modulation), the sequencer fires discrete, programmable values at rhythmic intervals — perfect for strobing effects, rhythmic crossfades, macro sweeps timed to the music, and building repeating visual compositions that breathe with the beat.

Open the sequencer from the Seq button in the title bar. It opens in its own floating window so it can sit on a second monitor or beside your main SMERGE workspace.

Step Sequencer window
The Step Sequencer popout window showing two lanes — each targeting a different track, color-coded to match the channel faders

Lanes

The sequencer is organized into lanes. Each lane targets one track (channel) and one parameter. You can have as many lanes as you need — one lane might drive CH 1 opacity, another might drive CH 2's Macro 1. Lanes are color-coded to their track's channel color so you can tell them apart at a glance.

When you first open the sequencer with tracks loaded, SMERGE seeds one lane per active track (up to four) so you have something to work with immediately.

Lane Controls

ControlFunction
TrackSelects which channel (CH 1–8) this lane controls. The lane border and step colors update to match that channel's color.
ControlsThe parameter to automate: Opacity, or Macro 1–4.
Step sizeClock division for how often the pattern advances. Options range from 1 Bar (4 beats) down to 1/32 (very fast). Common choices: 1 Beat for slow sweeps, 1/4 for 16th-note patterns.
StepsToggle the pattern length between 16 and 32 steps. All existing step data is preserved when switching — a 32-step lane simply reveals the second half of the grid. Both halves are visible and scrollable in the step row.
PhaseStart offset (0 to stepsLen−1). Shifts which step fires first on the initial clock tick, so lanes targeting different tracks can be out of phase with each other. See Phase Offset below.
Reset (⟳ ♩ ||)Snap the lane's playhead back to step 1 (at the phase offset). resets immediately. waits for the next beat before resetting. || waits for the next bar boundary. The button glows in the lane's color while a beat/bar reset is pending.
Lane nameEditable label for the lane — auto-filled when you select a track and parameter.
Remove this lane.

Step Grid

Each lane contains 16 or 32 steps arranged left to right. Steps advance one at a time on each clock division tick — the current step is highlighted with a glowing border in the track's color. A vertical fill bar inside each step shows its value (taller = higher). In 32-step mode, groups of 4 steps are separated by thin dividers, and a thicker divider marks the halfway point between step 16 and 17.

ActionResult
Click a stepToggle it on or off.
Click and drag across stepsPaint multiple steps at once — all steps touched take on the same state as the first step you clicked (on or off). Great for quickly filling or clearing a region.
Right-drag a step (up/down)Adjust the step's value from 0 to 100%. The fill bar updates in real time.
-click a stepCycles that step's ratchet count: 1× → 2× → 3× → 4× → 6× → 8× → back to 1×. See Ratchet and Gate below.

Ratchet and Gate — Rhythmic Strobe Effects

Beyond simple on/off steps, each step can ratchet — subdivide into rapid retriggers within its own clock division — and each lane has a gate length that shortens how long a step holds before cutting off. Combined, these produce the stutter/strobe/retrigger bursts common in music-video edits, without needing a faster Step size for the whole lane.

ControlFunction
-click a stepCycles that step's ratchet count: 1× → 2× → 3× → 4× → 6× → 8×. A ratcheted step shows small tick marks at its top — one per sub-pulse — so you can see which steps will retrigger at a glance.
GATE knobSets the lane's gate length as a fraction of each step's hold time. 100% (default) holds for the full step, same as before; lower values cut the step off early, leaving a gap before the next one fires. Combine with ratchet for staccato retrigger bursts rather than a smooth roll.
AMT knob(Macro lanes only — hidden for Opacity lanes.) Scales how much the lane's active steps shift the target macro above its current knob position. Sequencer values are additive, not a hard override: 0 = the lane has no effect regardless of step values; 100% = full effect.

A step with ratchet 4× on a 1/4-beat lane retriggers four times within that quarter note — at 120 BPM, a 1/4-beat step lasts 0.5 s, so a 4× ratchet fires roughly every 125 ms, a classic Elektron-style ratchet roll. Ratchet count and gate length work together: a high ratchet with a short gate creates crisp, separated strobe pulses; a high ratchet with a long gate blurs into a rapid flutter.

Tip: For a rhythmic strobe effect on opacity, set a single active step with ratchet at 8× and GATE around 30–50% — one step now behaves like a miniature strobe burst timed exactly to that beat.

The Fader Is the Master

The track fader acts as the master ceiling for the sequencer. Step values are multiplied by the fader rather than replacing it:

This means you can use the fader to set a track's maximum brightness and let the sequencer pattern fire within that range. Pulling the fader down during a performance reduces the sequencer's effect proportionally — useful for live mixing.

To make a track fully disappear on inactive steps, leave the fader wherever you like — inactive steps always mute the output to 0. To keep the track partly visible on inactive steps, use Macro automation instead of Opacity, or modulate opacity via an LFO that sits above 0.

Phase Offset — Staggering Lanes

When two lanes use the same Step size, they start advancing together from step 1 on the first clock tick. If both lanes have the same alternating pattern (e.g., every other step active), they fire and silence together — CH 2 will always be hidden behind CH 1 when both are active, and both will be off at the same moment.

The Phase control solves this. Setting one lane's Phase to half the step count shifts it directly opposite — so when CH 1 is active, CH 2 is inactive, and vice versa. This creates true alternating crossfades between channels.

Phase valueOffset (16-step)Offset (32-step)Common use
0No offset — starts at step 1No offsetDefault for your first lane
4Quarter cycle ahead⅛ cycleFour-lane round-robin (16-step)
8Half cycle — directly oppositeQuarter cycleTwo-lane alternating crossfade (16-step)
12Three-quarter cycle⅜ cycleFour-lane sequencing, lane 3 (16-step)
16Half cycle — directly oppositeTwo-lane alternating crossfade (32-step)
Tip: The default-seeded lanes (when first opening with tracks loaded) are automatically staggered at 0, 4, 8, and 12 so all four start out of phase.

Adding and Clearing Lanes

BPM Sync

The sequencer always runs off the global clock set in the Tap Tempo / BPM panel (Ch. 10). In AUTO mode this follows detected audio BPM; in Manual mode you control it. All lanes with the same Step size advance on exactly the same clock edge, so patterns across multiple lanes stay perfectly in sync regardless of how many lanes you have.

Changing the BPM in either mode takes effect immediately — the sequencer will speed up or slow down to match. The current playhead position is maintained; it does not reset on tempo change.

Presets

All sequencer lanes and step data are saved and loaded with your .smx preset files. The entire pattern — lane routing, step states, values, division, and phase — is fully captured. Starting a New preset clears all lanes.

Creative Techniques

TechniqueHow to set it up
Rhythmic strobeOne lane targeting CH opacity. Alternate active/inactive steps every step or every two steps. Step size: 1/4 or 1/8 for fast strobing, 1 Beat for slow pulse.
Channel crossfadeTwo lanes — CH 1 and CH 2 opacity — with Phase offset 8 and identical alternating patterns. As CH 1 fires on steps 1,3,5..., CH 2 fires on steps 2,4,6..., creating a back-and-forth cut between sources.
Macro sweepOne lane targeting Macro 1 on a shader generator. Set right-drag values across the 16 steps to create an automated sweep — ascending, descending, or a custom curve — that repeats every cycle.
PolyrhythmTwo lanes with different Step sizes — e.g., one at 1 Beat, another at 1/2 Beat. The two patterns drift in and out of phase over time, creating evolving, non-repetitive composites.
Stutter cutA lane at 1/8 or 1/16 Step size with a short burst of active steps (e.g., steps 1–3 active, 4–8 inactive). This fires a rapid burst of opacity then holds off — useful for glitch effects timed to drops or breaks.
Ratchet strobe burstA single active step set to ratchet 6× or 8× (⌥-click to cycle) with the lane's GATE reduced to ~40%. Fires a rapid strobe/retrigger burst exactly on that one beat — the music-video "flash cut" effect — without needing to speed up the whole lane's Step size.
Quantized scene prepCombine the sequencer with the Scene Launcher (Ch. 8) — trigger scene changes at the bar or half-bar level in Scene Launcher while the sequencer drives opacity transitions on the new layers, creating a layered, rhythmically composed live set.
Long-form 32-step arcSwitch a lane to 32 steps and use Step size of 1 Beat. The full pattern takes 32 beats (~2 bars at 120 BPM) before looping — long enough to build and release tension across a phrase. Set the first 16 steps as an ascending macro sweep (right-drag to set values), leave steps 17–32 at full brightness for the payoff, then loop.

Live Reset

Each lane has three reset buttons in the top-right corner. Use them to re-sync a lane that has drifted out of phase with the music, or to deliberately fire a pattern from the top at a dramatic moment:

Tip: During a live set, hit ♩ or || just before a drop to ensure a lane's pattern fires from step 1 right on the beat. The armed indicator (glowing button) confirms the reset is queued.
Tip: The Step Sequencer and the Mod Patch Bay can both target the same parameter at the same time. Mod routes add to the sequencer value (clamped 0–1), so you can use an LFO for a gentle breathing motion while the sequencer provides a rhythmic on/off trigger layered on top.
Chapter 17

Ableton Link

Ableton Link is a zero-configuration tempo-sync protocol that keeps the BPM and beat phase of multiple apps in lock-step over a local network or between apps on the same machine. When Link is active in SMERGE, its LFOs, beat-triggered envelopes, gates, step sequencer lanes, and scene quantization all lock to the shared Link session.

Enabling Link

In the Fader Bank BPM display, click the LINK button (shown in teal when active). SMERGE immediately joins — or creates — the Link session on the local network. No IP addresses or ports to configure; Link discovers peers automatically over Wi-Fi or Ethernet.

ElementDescription
Peers chipShows how many other Link-enabled apps are connected. Turns teal when at least one peer is found.
QuantumNumber of beats per sync cycle (default 4 = one bar). Adjust with the number field next to the peers chip.

Tempo Control

While Link is active the BPM shown in the Fader Bank reflects the shared session tempo. Changing the tempo from any connected app updates all peers simultaneously. SMERGE's Tap Tempo and manual BPM are disabled in Link mode — tempo changes must come from the session.

Stopping Link

Click LINK again, or switch to AUTO or MAN mode, to leave the session. SMERGE's BPM returns to its last standalone value.

Compatible Apps

Any Link-enabled application works: Ableton Live, Traktor Pro, Rekordbox, Serato DJ, TouchDesigner, Max/MSP, and a wide range of iOS/Android apps (Koala Sampler, AUM, Patterning, and others).

Tip: Start Link in SMERGE before opening your DJ software so SMERGE joins the existing session and inherits the running BPM rather than creating a new one at 120.
Chapter 18

Per-App Audio Capture

SMERGE can capture the audio output of any running application on macOS using the ScreenCaptureKit framework — without virtual audio drivers or cable patches. This lets SMERGE analyze audio from Ableton Live, Traktor, Spotify, a browser, or any other app while your main audio interface passes through normally.

Requirements

Enabling Per-App Capture

  1. Open Settings → Audio.
  2. Under Per-App Audio Capture, click Enable.
  3. If prompted, grant Screen Recording permission in System Settings, then return and click Enable again.
  4. An app picker appears listing all currently running applications.
  5. Select the app whose audio you want SMERGE to analyze.
  6. Click Connect. The audio analyzer now reads from that app's output — Sub, Bass, Mid, High, RMS, and Beat all respond.
Note: Per-App Capture and the standard audio input (microphone / interface) are mutually exclusive. Switch between them in Settings → Audio.

Use Cases

ScenarioSetup
VJ alongside a DJ in a different DAW on the same MacSelect the DJ's DAW in the app picker — no interface patch needed.
React to a streaming playlistSelect the browser or Spotify.
Stem-reactive visuals from LiveSelect Ableton Live — Sub/Bass/Mid/High bands drive from its output.

Permissions Note

macOS requires Screen Recording permission because the ScreenCaptureKit API used for per-app audio is the same framework used for screen capture. SMERGE only accesses audio — no screen pixels are captured or stored at any point.

Chapter 19

CV / M-Gate Input

SMERGE can read control voltages (CV) and gate signals from a Eurorack modular system or any CV-capable hardware, using a DC-coupled audio interface as the bridge. This turns your modular into a real-time modulation source in the Mod Patch Bay — no special hardware beyond a DC-coupled interface is required.

What Is a DC-Coupled Interface?

A standard audio interface blocks DC and very low frequencies (AC-coupling). A DC-coupled interface passes signals down to 0 Hz, which is required for CV that holds a steady voltage — for example, a pitch CV held at +2 V.

Compatible interfaces include:

Interfaces that are not DC-coupled (most consumer interfaces) will not pass CV — slow ramps and held voltages are cut. Fast gates may still pass as audio-frequency signals.

Signal Ranges

Eurorack CV is bipolar: −5 V to +5 V. Audio interfaces normalize this to −1.0 to +1.0 (full digital scale). SMERGE maps this to the 0–1 modulation space used throughout the Mod Patch Bay:

EurorackAudio APIMod value
+5 V+1.01.0
0 V0.00.5
−5 V−1.00.0

Use unipolar CV (0–5 V) for parameters that should only go up from their base (opacity, scale, macro knobs driving brightness). Use bipolar CV (±5 V) for parameters centered around a midpoint (rotation, X/Y position).

Gate signals from Eurorack (+5 V high / 0 V low) appear as raw values near +1.0 and 0.0. The M-Gate threshold slider sets the exact point above which the gate is considered open.

Adding CV and M-Gate Sources

No CV or M-Gate inputs exist by default — you add them only if you have DC-coupled hardware connected.

  1. Open the Mod Patch Bay panel.
  2. Click + CV for a continuous CV source or + M-Gate for a voltage-threshold gate.
  3. Click the new source row to open its CV Inspector.
  4. In the Dev picker, select your DC-coupled interface.
  5. Set Ch to the physical input channel carrying the CV or gate signal.
  6. Watch the oscilloscope — you should see the waveform as soon as your hardware sends voltage.
  7. For M-Gate sources, adjust Thr until the dashed threshold line sits above the noise floor and below the gate's high voltage.
  8. Drag a cable from the CV or M-Gate source node to any destination in the right column — exactly like an LFO or envelope.

CV Inspector Reference

ControlDescription
Icon⌇ for CV (continuous waveform), ⊓ for M-Gate. The M-Gate icon lights up when the gate is open.
DevAudio interface device picker. Updates live when devices are connected or disconnected.
ChInput channel number (1–8). Match this to the physical jack on your interface.
Live readoutCurrent raw voltage as a number (−1.00 to +1.00), updated ~12 times per second.
Oscilloscope170 × 58 px rolling waveform, ~3 s of history at 60 fps. Center line = 0 V. M-Gate shows a dashed threshold line.
ThrM-Gate only. Threshold voltage — gate outputs 1 when the signal is above this value, 0 otherwise.
× RemoveDeletes the source and removes all cables routing from it.

Performance Tips

Tip: The Dev picker refreshes automatically when you plug in a new interface — no need to re-open Settings or restart SMERGE.
Chapter 20

Media Library

The Media Library is a persistent, searchable catalog of your clips — videos, images, audio, and 3D models — with thumbnail previews. It remembers your media between sessions, so you never have to re-add the same files every time you launch SMERGE. It lives in its own floating window and takes up no space in the main interface.

Opening the Library

Open it any of three ways:

The window floats above the main window and stays visible even over a fullscreen output on the same display, so you can browse and load clips mid-performance.

Adding Media

MethodWhat it does
+ FilesOpens a file picker to add one or more media files.
Scan Folder…Recursively scans a folder and adds every supported media file it finds (skipping duplicates).
Drag from FinderDrop files directly onto the library window to add them.
Auto-add on importOn by default — any file you import through the Sources panel is also added to the library automatically, so the catalog fills up as you work. Toggle it in Settings → Library.

Adding a file that is already in the library is silently skipped — an item's identity is its file path, so you can re-scan folders freely without creating duplicates.

Thumbnails

Thumbnails are generated in the background and appear within a few seconds of adding media:

Note: Thumbnail generation pauses automatically while you are recording, so it never competes with the recording for CPU. It resumes the moment recording stops.

Browsing and Searching

Loading Clips onto Channels

ActionResult
Drag a card onto a channel stripLoads that clip on the channel (the strip highlights as you drag over it). You can also drag files straight from the Finder onto a channel.
Double-click a cardLoads the clip onto the first empty channel.
Right-click → Assign to Layer NLoads the clip onto the channel you choose.

A clip that is already loaded as a source is reused rather than duplicated, so assigning the same library item to several channels won't create redundant sources.

Organizing Your Catalog

Where It Lives & Missing Files

The library and its thumbnails are stored in ~/Documents/SMERGE/Library/. The catalog holds references to your files, not copies of them. If a referenced file is moved or deleted, its card is dimmed and marked MISSING the next time you open the library — nothing crashes, and you can remove the stale entry or restore the file.

Tip: Because the library stores file paths, keep your working media in a stable location (an external drive or a dedicated media folder). Presets shared with Save & Collect still bundle their own copies of media — the library is your local organizing tool, separate from preset sharing.