MESA has grown into a full instrument — a shader-driven wavetable engine, a playable terrain preview, a VFX chain, a modulation matrix, a sampler, an eight-pattern arpeggiator with gate, swing and ratchets, a Kaoss-style Performance FX pad with a drawable motion path, a 303-shaped step sequencer with its own transport and a per-step lock sheet, a one-tap randomizer you can point at a genre, a preset browser, MIDI Learn on nearly everything, notes-out to the host, project save, Ableton Link, a master limiter, and a local MCP server that lets an AI agent write shaders and sculpt patches alongside you. This page documents all of it, feature by feature, exactly as built.
Overview
MESA is a native wavetable synthesizer that ships as an AUv3 plug-in and a standalone app, for iOS and macOS (Mac Catalyst, "Optimized for Mac"). One purchase covers both platforms and both hosting modes. The engine is C++17, the AU bridge is Objective-C++, and the UI and Metal renderer are Swift.
Its signature move: MESA can turn a Metal shader into the wavetable itself. Feed it a .vkograph visual (built in the VKO1 editor) or a raw VKO1 .metal shader, and MESA renders it offscreen, reads a scanline of the image as a waveform, and plays that back as an oscillator — while the same shader keeps rendering live behind the keys as a reactive visual.
Underneath that signature feature sits a genuinely complete instrument: unison oscillator with sub, a ZDF filter, a full ADSR envelope plus glide and a pitch envelope, a 3-slot modulation matrix, an 8-stage FX chain plus a master limiter, a sampler mode, an eight-pattern arpeggiator, a 303-shaped step sequencer with its own PLAY/tempo transport, a one-tap randomizer, a categorized preset browser (93 shaders, 57 factory patches), MIDI Learn on almost every control, Ableton Link, and a local MCP control server for AI-assisted sound and shader design.
Same UI, same engine, either as a plug-in inside your DAW or as its own app with an on-screen keyboard and MIDI input.
Mac Catalyst gives MESA a proper "Optimized for Mac" window on the desktop, from the same codebase as the iPad/iPhone build.
A from-scratch C++17 DSP core, hand-written AU bridge, and Swift/Metal UI — lean, and built around the shader-to-sound pipeline from day one.
Getting Started
Tap the preset name in the top bar to open the browser. Factory patches are sorted into folders — pick anything from Pads to FX & Textures to hear the range.
Standalone: the on-screen keyboard or a MIDI/Bluetooth keyboard. AUv3: play from your DAW's piano roll or MIDI keyboard track.
The Metal display above the knobs is the live shader — the same picture whose luminance became the wavetable. It reacts to voices, morph, filter and beat in real time. Drag across it and it plays like a ribbon: left-to-right sweeps two octaves, top-to-bottom sets velocity. Faint vertical lines mark the octaves.
Every panel below the display is real-time. Long-press (or right-click on Mac) any knob to bind it to a MIDI CC.
The window is organized in rows: the reactive terrain display and preset/shader switchers on top; a row of knob panels (Oscillator, Filter, Envelope, Pitch·Sub); a row of routing/FX panels (Mod Matrix, FX Sends, Tape FX, Layer); and a row for the wider chip-based panels (Vision, VFX, Arpeggiator). On narrow windows these stack vertically instead.
The Signature
No other wavetable synth works this way. MESA can import a shader and use its picture as the sound source, not just as decoration.
| Format | What it is |
|---|---|
Native .metal | A VKO1 iOS/macOS-style shader: one fragment function taking VertexOut + constant GeneratorUniforms&. Used as-is. |
Web-editor .metal | VKO1 web editor's iOS export (VKOUniforms + void main(), or a vko_main variant). MESA detects it and rewrites it into the native contract automatically. |
.vkograph JSON | A full node graph exported from the web editor or the iOS app. MESA parses the JSON, extracts the embedded Metal source, and traces the modifier-node chain — falls into one of the two formats above once unwrapped. |
time uniform across the frames of a wavetable.Zero clicks: a newly imported wavetable swaps in lock-free on the audio thread — no glitch, no dropout, even mid-note.
The loaded shader keeps rendering continuously behind the keys, fed real telemetry from the engine — RMS level, morph position, filter cutoff, an envelope proxy, and pitch-bend as a "jog" scrub. It's the same picture that generated the sound, animated by the sound.
Two independent shader slots run at once. The Blend knob crossfades Layer B in over Layer A — both the wavetable blend and the visual crossfade move together.
Vision Panel
Vision is the bridge between the picture and the waveform. Five controls, all live (re-importing the shader whenever you move one), all MIDI-learnable.
| Control | What it does |
|---|---|
| Scan Y | Which horizontal slice of the rendered image becomes the waveform — drag 0 (top) to 1 (bottom). Different rows through the same shader are completely different timbres. |
| Channel | How R/G/B combine into the luminance sample: RGB (standard weighting), R, G, B only, R−B (chroma axis), or Equal weight. |
| Curve | Nonlinear reshaping applied after luminance extraction: Linear, Gamma (√, expands shadows), S-curve (soft-knee), Fold (wavefold at the midpoint), Rectify (full-wave — doubles the fundamental), Invert. |
| Time | How the 64 frame indices map onto the shader's time uniform: Linear, Exponential, Sinusoidal, S-curve, Reverse, Bounce (ping-pong). |
| Energy ↑ | Toggle. When on, the shader's energy uniform sweeps 0→1 across the 64 frames instead of sitting fixed at 0.5 — shaders that react to energy produce a morphing, evolving wavetable. |
The eye button in the terrain's corner pauses the on-screen render. It's purely cosmetic — the wavetable is extracted on a separate offline pass, so the sound is completely unchanged — which makes it a free performance lever, especially for the AUv3 sharing a GPU with a busy DAW. As an AUv3 it also pauses automatically whenever the host hides the plug-in's editor (a real saving in AUM, Loopy Pro or Logic, where an instance stays loaded with its window closed); the standalone app pauses when it isn't the frontmost app. A decaying reverb or delay tail no longer quietly loads a core either — subnormal floats are flushed on the audio thread.
Color
Because the picture's luminance is the waveform, changing the color palette reshapes the brightness curve the shader produces — which means it reshapes the sound. MESA ships all 33 VKO1 palettes, chosen via the chevron picker or the full grid in the palette sheet, and the choice bakes into both the wavetable and the visible terrain at once.
VFX Chain
A modifier chain sits between the raw shader and the final image — and since the image is the sound source, every modifier is also an audio effect. Five of them (filmLook, bloom, rgbSplit, datamosh, mask) trace automatically out of a .vkograph graph; all 26 can be added natively from the VFX panel's picker. Each node has a drag-adjustable primary parameter and its own wet/dry blend.
Grain + envelope + a waveshaping preset (tanh / S-curve / edge / invert).
9-tap Gaussian blur — acts as a low-pass on the extracted waveform.
Re-samples each color channel at an offset — comb-filters the harmonics.
Block UV displacement — gritty inter-frame smear and texture.
Blend mode against a greyscale copy: multiply, screen, difference, or plain greyscale.
Rotates hue around the color wheel.
Push saturation up to 2× or down to greyscale.
Channel-offset color shift.
Contrast/brightness style adjustment.
Remaps luminance through a gradient ramp.
False-color thermal-camera style mapping.
Reduces color/luminance to hard steps — bit-crush for the picture.
Key out a color range.
CRT-style horizontal scanline overlay.
Print-style dot/halftone pattern.
Frame feedback with decay + scale — trailing, echo-like visuals (and waveforms).
Digital glitch/corruption artifacts.
Plain radius blur (distinct from bloom's threshold-based glow).
Mirrors the frame.
2–16 radial segments.
Blocky pixel resolution reduction.
0–360° rotation.
Sinusoidal UV warp.
Scale/skew style affine warp.
Perspective/tilt warp.
Edge-detection outline pass.
Sound Engine
| Control | Range | Notes |
|---|---|---|
| Morph | 0–1 | Position across the 64-frame wavetable. |
| Unison | 1–8 voices | Stacked, detuned copies with stereo spread; loudness-normalized so more voices don't just get louder. |
| Detune | 0–50 cents | Spread between unison voices, symmetric around center. |
| Level | 0–100% | Output gain. |
| Sub | 0–100% | Sine sub-oscillator, one octave down, mixed in post-oscillator. |
Up to 16 voices of polyphony (oldest-note stealing when exceeded), each running its own up-to-8-voice unison stack — so a big unison patch can still cost multiple real voices per key.
Sound Engine
A zero-delay-feedback state-variable low-pass, one per voice.
| Control | Range | Notes |
|---|---|---|
| Cutoff | 20 Hz – 20 kHz | |
| Resonance | 0–1 | Self-oscillates at the top of the range. |
| Drive | 0–1 | A single knob that drives two stages at once: per-voice tanh saturation ahead of the filter, and the post-mix waveshaper stage in the FX chain. |
Sound Engine
| Stage | Range |
|---|---|
| Attack | ~1 ms – 8 s (exponential) |
| Decay | ~1 ms – 8 s (exponential) |
| Sustain | 0–1 level |
| Release | ~10 ms – 12 s (exponential) |
Portamento between notes. 0 disables it; otherwise ~5 ms – 2 s exponential. Each new note glides from the pitch of the previously played note.
A dedicated pitch-only envelope on top of the amp envelope — for percussive drum-like drops, or upward "blip" attacks.
| Control | Range |
|---|---|
| P.Env (amount) | −24 to +24 semitones |
| P.Dec (decay) | ~1 ms – 2 s exponential, decaying back to the held note's true pitch |
Try it: a positive P.Env with a short P.Dec on a short-unison bass patch is an instant 808-style pitch-drop kick/bass hybrid.
Modulation
Two LFOs are hard-routed by default — LFO 1 → Morph, LFO 2 → Cutoff — with a drag bar that shows the live modulation swing and sets the depth. A third slot is fully free-assign.
| Slot | Source | Destination | Amount |
|---|---|---|---|
| 1 | LFO 1 (fixed) | Morph (fixed) | 0–100% |
| 2 | LFO 2 (fixed) | Cutoff (fixed) | 0–100% |
| 3 | LFO 1 / LFO 2 / Wheel / Velo — tap to cycle | Morph / Cutoff / Reso / Level / Pitch — tap to cycle | −100% to +100% (bipolar) |
Mod-wheel and velocity are also wired directly into the DSP layer as modulation sources. Every mod-matrix value is a real host-automatable AU parameter.
Signal Path
Always in this order, post-mix, allocation- and lock-free:
| Stage | What it does |
|---|---|
| Tape | HF roll-off + asymmetric soft-clip saturation — the "Tape" knob. |
| Wow & Flutter | Tape-speed pitch instability: a slow ~0.6 Hz wow plus a fast ~11 Hz flutter, via a variable delay line — the "Flutter" knob. |
| Waveshaper | Shared with the Drive knob — soft saturation/wavefolding. |
| Chorus | Modulated stereo delay, fixed depth character (no dedicated Chorus knob in the current build — it's part of the fixed chain). |
| Delay | Stereo ping-pong delay with feedback. The FX Sends panel gives it three knobs now: Mix (send level), Time (exp-mapped 20 ms – 2 s) and F.back (0–95%). |
| Reverb | Freeverb-style comb + allpass bank. Three knobs in FX Sends: Mix, Size (0–98%, how long the tail runs) and Damp (0–100%, high-frequency absorption). |
| Lo-Fi | Sample-rate reduction + bit-depth crush (14 bits down to ~4 at full amount) — "Lo-fi" knob. |
| Tape Stop | One-shot: decelerates the whole mix to a stop over ~1.5s with an eased fade-out, then silent until the next trigger. Its own button, MIDI-learnable. |
The delay's time/feedback and the reverb's size/damp are carried in the patch — defaults match the old fixed values, so every existing preset sounds exactly as before until you move one.
Performance
A Kaoss-style XY pad on the master bus — one effect at a time, live only while a finger is down. It's a stab, not a setting. Off by default, and Off is a real bypass in the DSP (the section returns before touching a sample), so an unused Perf FX costs nothing.
| Effect | X axis | Y axis |
|---|---|---|
| FILTER | Cutoff, LP ‹ › HP | Resonance |
| STUTTER | Slice length | Decay |
| CRUSH | Sample-rate crush | Bit depth |
| GATE | Rate | Depth |
| DELAY | Time | Feedback |
| SPACE | Size | Amount |
Arm the pencil and paint cells onto the pad. The cells are the path, in the order you drew them, and the DSP walks them one per tempo division (1/4, 1/8, 1/16, 1/32) while the effect is engaged — so a drawn squiggle plays itself, in time. Under Hold it runs hands-free. The path (and the effect choice, and the enable state) saves with the patch; engaging and the raw X/Y are momentary.
The same pad edge to edge, for a bigger target during a set.
Output Stage
Global Volume, in the top bar, sits downstream of the entire patch — every knob, the whole FX chain, both layers — so switching presets never changes how loud MESA is, and a preset save/load or a randomizer roll never touches it. It's a real MIDI-learnable, host-automatable AU parameter (masterVolume), separate from the patch's own Gain knob.
Behind it, a master limiter catches peaks before they reach the output. A synth patch can legitimately run hot — 8-voice unison plus sub plus drive plus resonance, times up to 16 held voices — and in the standalone app the engine feeds the output device directly, so anything past 0dB hard-clips at the DAC. The limiter is peak-detecting with instant attack and a smooth ~150ms release: gain reduction drops immediately to whatever the loudest sample needs, then recovers without ducking the whole patch on a single transient. It is deliberately not a compressor — nothing happens at all below the ceiling, so every existing preset still sounds exactly as it did.
The LIM meter next to Global Volume lights up only while the limiter is actively doing work, so you can see when a patch is running hot instead of guessing.
Sampler
Import any audio file and MESA auto-detects its fundamental pitch, then pitch-tracks it across the keyboard like a sampler instrument. The sampler runs alongside the wavetable oscillator at all times — the Mix knob is a live crossfade between them, not a mode switch, so it can never glitch when you move it.
| Control | What it does |
|---|---|
| Mix | 0 = wavetable only, 1 = sample only, between = blend. |
| Loop | Toggle looping on/off for the sample. |
| Start / End | Loop region, as a fraction of the sample's length. |
| Clear | Removes the sample and reverts to the wavetable. |
The detected base pitch is shown as both a note name and Hz (e.g. "C4 · 261Hz") so you know what MESA thinks the sample's root note is.
Motion
One selector at the top of the SEQUENCER panel decides what drives the voices, and the three are mutually exclusive on purpose. An arpeggiator is a sequencer whose pattern comes from the notes you're holding — running both would be two generators fighting over the same sixteen voices with no musical relationship between them. So they share one clock, one rate and one swing, and only one plays at a time.
| Source | What plays | What the keys do |
|---|---|---|
| OFF | Nothing generated. | Play straight through. |
| ARP | The notes you hold, cycled. | They are the pattern. |
| SEQ | The step grid. | They transpose the pattern — see below. |
Under SEQ the keyboard still matters. The lowest key you're holding transposes the whole line, measured against the pattern's own root — so playing that root is no transpose, and anything else moves the line. Lift the last key and it stays in the key you put it in rather than snapping home. That's how every acid box plays its sequence in another key, and it means the keys aren't dead while the grid owns the notes. It works identically from the on-screen keyboard, a MIDI controller and a DAW track, because it lives in the engine rather than either host.
The clock comes from the DAW's transport in the plug-in, Ableton Link in the standalone while it's driving, and MESA's own tempo otherwise — in that order.
Pick ARP and the panel opens up under the selector — the same panel in the plug-in and the app, laid out like the step grid: rows of chips you hit at a glance rather than a line of cycling pills. It's driven from one shared set of values that MESA hands to whichever arp the host owns — the DSP engine's in the plug-in (clocked to the DAW's beat position), a free-running one in the standalone — so the two behave identically, synced or not.
| Control | What it does |
|---|---|
| Order | Eight of them. Up · Down · Up-Down · Down-Up walk pitch order; Random picks one a step; As-Played follows the order you pressed the keys, not their pitch; Chord fires every held note together on the grid; Converge goes outside-in — lowest, highest, next lowest, and so on. |
| Rate | 1/4 · 1/8 · 1/8T · 1/16 · 1/16T · 1/32. |
| Octaves + direction | 1–4 octaves of range, and whether the stack is walked up ↑, down ↓ or alternating ↕ above and below. |
| Gate | How much of its step each note holds — spiky staccato through to legato that runs into the next step. |
| Swing | Pushes the off-steps late, the same feel as the sequencer's swing. |
| Ratchet | 1 (off) to 4 — retriggers the note that many times inside a single step for a roll. |
| Accent | Off, or every 2nd / 3rd / 4th step at full velocity with the rest sat back — what turns a flat run into a pattern. |
| Hold | Latches the held notes so the arp keeps running with your hands off. In the plug-in there's no keyboard, so this is how you keep a chord arpeggiating. |
BAKE takes whatever the arp is playing this second — order, octaves, accent shape and all — writes it into the step grid, and switches MOTION to SEQ. The arp is the fastest way to find a line; BAKE is how you keep one and start taking it apart. Hold the notes down, then press it.
In the standalone, when Ableton Link is enabled the free-running rate loses its meaning against a shared beat, so a LINK chip appears below the panel — tap it to cycle which note division the arp steps at on the session grid.
Pattern
A 303-shaped monophonic line. It lives in the DSP, not in a timer on the main thread — it advances inside the render block, so steps land on exact block positions and the same code runs whether MESA is a plug-in on a DAW transport, the standalone locked to Link, or the standalone free-running.
Above the grid: a PLAY button and a BPM readout. Drag the number up and down for tempo, or tap it for a sheet with tap-tempo, the grid division and swing. On its own clock — the standalone with Link off — PLAY is what starts and stops the line.
In a DAW, the host owns the transport. The pattern sits on the host's grid, so it starts the moment you press play in Logic or AUM and stops when you stop — nothing to arm inside MESA. PLAY and the BPM readout grey out to say so, and the number follows the host's tempo. A Link session with Start/Stop sync does the same in the standalone.
Tap a step to select it; tap the selected step again to toggle its gate. One finger does both jobs, and the row underneath edits whichever step is selected. Sixteen steps lay out as two rows of eight so a bar stays readable on a phone. The playhead ring is the DSP's own step index, not a UI guess.
| Per step | What it does |
|---|---|
| Pitch | Semitones above the pattern's root. |
| Octave | −1 / 0 / +1 — what stops a line reading as a scale exercise. |
| GATE | Off is a rest: silent, but the clock keeps moving. |
| ACC | Accent — louder, and it reads as the emphasis in the line. |
| SLIDE | Portamento into the next step. Not a portamento setting: it swaps in a short fixed glide for that one transition and hands your patch's own Glide straight back, which is exactly how the original does it. |
| TIE | Hold the previous note through this step without retriggering. |
Long-press a step in the grid (or hit MORE… in the step editor) for the per-step detail sheet. Everything in here is optional — a pattern that never opens it plays exactly as it did before.
| In the sheet | What it does |
|---|---|
| RATCHET | Split the step into 2 / 3 / 4 / 6 / 8 evenly-spaced retriggers — a roll or a flam inside one step. Ratcheted steps draw their sub-hits in the grid. |
| VELOCITY | Override the two accent levels with an exact number. Defaults to "follow the ACC flag". |
| CHANCE | 0–100%. Below 100 the step becomes a sometimes — it either plays whole, ratchets and all, or sits out that time round. |
| CUTOFF / MORPH lock | Park the filter or the wavetable position for as long as the pattern runs — until a later step hands it back. An LFO on that knob still moves; it just moves around wherever the step put it. This is what turns one line into a moving one. |
A small corner dot on a step cell marks any step carrying detail, so a p-locked line is readable at a glance.
The dice on the sequencer row rolls a new line and leaves the patch alone — keep the sound, change the part. It's shaped by whichever style is selected (see Dice Styles) and keeps the pattern's root and length. Separate from the patch dice on purpose: the LINE chip in SETTINGS governs whether a full patch roll also touches the sequence, but pressing this one is an explicit ask, so it always rolls. MIDI-learnable, like everything else.
Length is per pattern, 1–64 steps, so a four-step fill can sit next to a thirty-two-step verse. Each pattern carries its own root note. Rate steps 1/4 · 1/8 · 1/8T · 1/16 · 1/16T · 1/32, and swing pushes odd steps late by up to half a step.
The strip below starts at one slot and grows to as many as 64, wrapping into rows of eight. + adds a blank slot, ⧉ duplicates the current line into the next one — keep the line, vary a step — and the trash deletes it (the last one standing is cleared rather than removed, so the bank is never empty). Tapping a slot edits and cues it — the switch is beat-synced, landing when the loop turns over, so it never chops the bar in half.
The bank belongs to the project, not the patch. A preset is the sound; the whole bank — every step's ratchet, velocity, chance and locks, plus how many slots are in play, the tempo and the PLAY state — rides in a .mesaproject. See Projects below.
MIDI
MESA is an instrument that also emits MIDI, on a port named MESA Notes, everything on channel 1. That name only shows up in hosts that list plug-in MIDI ports — AUM and apeMatrix put it in the routing matrix. Logic never shows it: there you pick the track MESA is on, so don't go hunting a menu for "MESA Notes".
The piano-keys button in the status bar arms the mirror. It sends everything MESA plays that isn't already MIDI — the arpeggiator's pattern, the step sequencer's line, and the terrain ribbon — so a DAW track can capture it as editable MIDI. Notes arriving from the host are never echoed back; the DAW already has those. Filled when armed; a slash badge means it's armed but nothing is reading MESA's port yet, which is the quickest sanity check that the wire is live. Plug-in only — the standalone isn't inside a DAW.
People trip over this in AUM especially: wiring MESA to another synth so you can hear it is not the same as capturing the MIDI. The first needs nothing extra; the second needs a recorder.
No extra plug-in. Point MESA Notes at any synth in the host's MIDI routing — AUM and apeMatrix have an explicit matrix, Loopy Pro a MIDI channel, Logic a track input. MESA plays it live.
Now you need something that captures MIDI. AUM and apeMatrix don't, so send MESA Notes into a MIDI-recorder AUv3 — MIDI Tape Recorder, Atom 2, Lowfi Dojo Automaton. Drambo 2.20+ and Logic Pro for iPad record plug-in MIDI natively.
A track or a recorder captures what arrives at its input. MESA's own keyboard, ribbon and sequencer sit downstream of that — they talk straight to the engine inside the plug-in — so nothing records them onto MESA's own track by itself, in any host. What you do instead is always the same shape: point something else at MESA's output, and record that. Only the menu names change.
No host reads an instrument's MIDI onto its own track by itself, and the routing that does it is several menus deep. A .mid file sidesteps all of it. Drag a pattern slot straight onto a timeline or into Finder — any slot, without switching to it first. The file carries tempo, swing, ties and slides exactly as the sequencer plays them, and the bar runs out to full length so a one-note pattern still drops in as a correctly-sized region.
A drag can't leave a plug-in's window — on any platform. That's why the pattern strip also has an export button (↑): it saves the .mid through the host's own save panel, and you drag it in from Finder. Use the drag in the standalone app; use the button inside a DAW.
Once the recorded region is back on MESA's own track, the region and the internal sequencer would both fire every note. The grid button next to SEQ stops the pattern playing while its clock keeps advancing — the playhead stays put and re-enabling lands back in phase — and nothing reaches the MIDI mirror either. MESA becomes a plain synth the region drives. It's MIDI-learnable, so a controller can flip it mid-set.
The workflow worth learning: build a line on MESA's sequencer, capture it as a real MIDI region, then hand playback back to MESA and treat it like anything else in the arrangement. Apple calls the routing Internal MIDI In, documented as capturing "the MIDI output of MIDI effect or software instrument plug-ins."
Or skip steps 2–4 entirely: export the pattern as a .mid and drag it from Finder.
| Host | How |
|---|---|
| AUM | Open the MIDI routing matrix — MESA appears as a source. AUM doesn't record MIDI itself, so wire it to a MIDI-recorder AUv3 or to whatever you want MESA to drive. |
| Loopy Pro | Load MESA as an audio AUv3 first, then in the mixer tap + → Add MIDI. That channel captures the plug-in's MIDI output and records into a clip. |
| Drambo | Records AUv3 MIDI output natively (2.20+). Route MESA's MIDI out to a recorder module. |
| apeMatrix | Same idea as AUM — MESA is a node with a MIDI output; patch it wherever. |
| Logic Pro for iPad | Apple documents "Record MIDI plug-in output" — same concept as the Mac's Internal MIDI In. |
iOS hosts are better at this than desktop ones. AUM and apeMatrix put every plug-in's MIDI output in an explicit routing matrix, so MESA shows up as a source you can wire anywhere — no hidden inspector setting to find.
Patches
57 factory patches across 8 categories, sorted into browsable folders, with search flattening across all of them. The browser header always shows the live count next to the search field, so it's visible at a glance as the library grows.
A preset is a full patch, not just knob positions — every AU parameter, the color palette, both shader slots' names, both VFX modifier chains, all Vision settings, every mod-matrix slot, the delay time/feedback and reverb size/damp, the Performance FX effect + drawn motion path, and the full arpeggiator state (on, hold, order, rate, octaves and direction, gate, swing, ratchet, accent).
Name it, pick a category (defaults to "User"), done.
Factory presets are sealed — never exportable, never deletable, so a shared preset file can never overwrite a built-in patch. User presets can be exported as a shareable .mesapreset file, which embeds any custom shader(s) the preset depends on, so a recipient who doesn't already have that shader still hears it exactly right. Importing always creates a new user preset — it can't clobber anything.
User presets and custom shaders sync via iCloud, automatically, no setup — save a patch on your Mac and it shows up in MESA on your iPhone or iPad, whether you're using the standalone app or MESA as an AUv3 plug-in in Logic Pro, GarageBand, AUM, Loopy Pro, Koala, or any other host. A quick sync pass runs whenever you save something and again whenever MESA (in any form) starts up, so it works without needing the standalone app open on every device.
Good to know: conflicts (the same preset edited on two devices before they've synced) resolve by newest-wins, with no merge prompt. Deleting a preset removes it locally; a device that hasn't synced since will re-upload its own copy the next time it syncs. Needs iCloud Drive enabled for MESA in Settings.
Sessions
A patch is the sound. A project is everything — because that's the whole point of saving one.
A .mesaproject carries |
|---|
| The current patch, with its custom shaders embedded — so the file stands alone on any device. |
| The whole pattern bank — every step's ratchet, velocity, chance and parameter locks — plus how many slots are in play, which is being edited, and which is playing. |
| Tempo, PLAY state, rate division, swing, the motion source, and the full arp setup (order, octaves and direction, gate, swing, ratchet, accent, hold). |
| The global output trim — deliberately outside every preset, but a project is the whole rig. |
| The hide-visuals and notes-out switches, and MIDI Learn's on/off. |
| Every learned MIDI CC — knobs, mod slots, Vision fields, tape stop, pitch bend, fullscreen, volume. |
save… and open… live in SETTINGS. Saving is never gated the way a preset export is: it snapshots whatever is on screen right now, saved or not, so a good accident is never lost. Opening one puts the patch in first — installing its embedded shaders before anything asks for them by name — then everything the patch doesn't own.
In the plug-in, the DAW session already is the project. MESA's full state rides in the AU's saved state, so reopening a Logic or AUM session restores it. The file format is for the standalone app, and for moving a rig between devices.
One Tap
The dice button builds an entire new patch in one tap — not knob noise, a designed sound. Each roll picks a character first (pad, bass, lead, pluck, drone, texture) and shapes everything around it: oscillator and filter ranges, envelope shape, which mod-matrix slots get used, FX send levels, palette, Vision settings, and the VFX chain. It always picks a shader you're not already using on either layer, and every roll gets its own generated name.
Rolls also budget their own GPU cost. Some VFX modifiers are far more expensive than others — a blur or bloom re-evaluates the entire underlying shader per tap, so stacking a few of the heaviest together can bog down real-time rendering on a phone or tablet, especially inside a host running its own DSP load alongside MESA. The randomizer weighs each modifier's cost and keeps every roll's chain under a budget, so it can build genuinely varied patches without ever assembling a combination heavy enough to hurt performance.
Don't like what came up? Roll again — nothing is committed until you save it. Like it? Save it like any other patch and it joins your User folder.
Dice
The randomizer's default is ANYTHING — the widest net, a fresh character every roll. Pick a style instead and the roll is constrained: its tempo and swing range, the shaders it draws from, how willing it is to recolour, how much VFX it stacks, which characters it will land on, and a canonical sixteen-step line it varies around.
| Style | What a roll does |
|---|---|
| ANYTHING | No constraints. Every roll draws its own character. |
| ACID 122–138 | One squelching line — short decay, high resonance, slides and accents doing the work. |
| DETROIT 125–135 · swung | Machine funk: tight stabs, strings that hang back. |
| BERLIN 118–126 | Long dub chords and tape haze — slow attack, deep reverb, almost no top end. |
| 80s MIAMI 100–118 · straight | Chrome and neon: bright plucks, wide chorus, gated tails. |
| AMBIENT 60–86 | Barely a pattern — long notes, ties everywhere, the shader doing most of the moving. |
| PSY 138–150 | Rolling triplet-feel bass and a hard gate. Relentless. |
| LO-FI 72–92 · heavy swing | Tape wobble and dust: soft keys, everything a little out of tune. |
Five chips in SETTINGS — SOUND · SHADER · VFX · VISION · LINE. Anything switched off keeps whatever is loaded, so you can freeze the picture and roll only the instrument (the common one — you like the image, you want a different sound out of it), or freeze the sound and roll only the picture.
A style is a bias, not a cage. Its variation weight decides how far each roll drifts from the canonical line: none of it and you'd get the same figure every time; too much and the genre disappears. The middle is the point — recognisably the style, a different line every roll. And if your library has none of a style's preferred shaders, it quietly falls back to everything rather than refusing to roll.
Both the style and the scope persist, and they're shared between the app and the plug-in.
Shader Library
| Pack | What it is |
|---|---|
| Starter Pack | 93 shaders, bundled, free, read-only — CRT, VHS, plasma, terrain, glitch, retro-computing, synthwave, and a hand-drawn anime/manga set (cel-shaded flame, comic impact stars, manga speed lines, branching lightning, rising smoke, printed screentone dots, and more), all reactive and all working with every palette. |
| My Shaders | Your own imports and saves, each with its full settings (modifier chain, palette, Vision) preserved. |
| Installed packs | Sideloadable .mesapack bundles — the delivery vehicle for premium packs, gated by an entitlement check that's StoreKit-ready. |
Import a raw .metal file, or a .vkograph — the graph importer pulls out the embedded shader source, modifier chain, and palette automatically. The shader browser header shows the live total next to its search field, so the library's growth is always visible at a glance.
MIDI
Long-press (or right-click on Mac) almost any control to bind an incoming CC to it. Bindings persist across sessions.
Not mapping a controller? The Settings panel has a MIDI Learn switch that turns the long-press / right-click menu off entirely, so that gesture stops competing with a knob's drag or a button's tap. Anything you've already bound keeps working — the switch only hides the authoring menu.
Separately, and without needing MIDI Learn: MIDI pitch bend re-pitches held notes live and drives the visual jog/scrub; the mod wheel (CC1) is wired to modulation; CC 64 acts as a sustain pedal — hold notes while it's down, release them all when you lift, in both the app and the plug-in; Panic hard-kills every voice instantly for stuck-note recovery.
Sync
Tempo, beat, and phase sync with any Link-enabled app or hardware on the same network, via Ableton's official LinkKit framework (a static, App Store-safe library — not the GPL ableton/link source). The AUv3 plug-in doesn't need its own Link toggle — it syncs to its host DAW's tempo instead.
Link lives in the Settings panel, alongside the MIDI Learn switch. Tapping ABLETON LINK joins the session and opens Ableton's own native settings sheet (peer count, Start/Stop sync) — which has a Done button to close it. Once sync is enabled, the standalone app's arpeggiator switches its clock from free-running Hz to the shared Link beat grid automatically.
AI Co-Piloting
MESA can run a local MCP server — the same protocol AI coding agents like Claude Code speak — so an agent can write and iterate Metal shaders, see real compile errors and rendered previews, push a shader onto the live terrain, sculpt the sound with real parameters, drive the Performance FX pad, steer Ableton Link, play the keyboard and pitch-bend wheel itself to audition what it built, and save the result as a preset. It's off by default; you turn it on from the sparkles icon in the status bar.
Security: the server binds 127.0.0.1 only. It is never reachable from the network, and only apps on the same Mac can connect.
Or, for any other MCP client (Cursor, Windsurf, VS Code):
Two things have to both be true: the toggle in the settings sheet must be on (that's what actually starts the server listening), and claude mcp add is a one-time registration step — running it doesn't retroactively add tools to a client session that's already open. Restart the client (or start a new session) after adding, and it'll pick up the 27 tools below.
| Tool | What it does |
|---|---|
| mesa_catalog | Reference: the AU parameter map, all 26 modifier types, mod-matrix and arp names, and the exact Metal shader contract. Call this first. |
| mesa_state | Full live snapshot — preset, every parameter, mod matrix, Vision, arp, sampler, Performance FX, Ableton Link, telemetry. |
| mesa_list_shaders / mesa_get_shader | List and fetch shaders across all packs. |
| mesa_create_shader / mesa_update_shader | Write or edit a shader in My Shaders — compiles immediately, returns the real Metal compiler error on failure. |
| mesa_load_shader | Push a shader onto the live terrain by name. |
| mesa_preview_shader | Renders an actual 2D PNG of the shader — see it before it's live. |
| mesa_list_presets / mesa_get_preset / mesa_save_preset / mesa_load_preset | Browse, inspect, save, and recall full patches. |
| mesa_randomize | Roll a complete new patch — an unused shader plus a sound built around it, same as the dice button. Applies live with an auto-generated name; mesa_save_preset keeps it. |
| mesa_set_params | Set any subset of parameters by friendly name in one call. |
| mesa_set_mod | Set a mod-matrix slot, including the free-assign source/dest. |
| mesa_set_arp | Set arp on/hold/pattern/rate/octaves in one call. |
| mesa_note_on / mesa_note_off | Trigger and release a MIDI note directly — the agent can play the keyboard. |
| mesa_play_note | One-shot audition: plays a note and releases it after a duration, no second call needed. |
| mesa_pitch_bend | Set the pitch-bend wheel live, −1..+1 — re-pitches sounding notes immediately. |
| mesa_panic | Hard-kill every voice instantly, and reset the arp's held notes and any running sequence — for recovering from a stuck note. |
| mesa_set_volume | Set global output volume, 0–1 — downstream of the whole patch, ahead of the master limiter. Deliberately untouched by mesa_load_preset/mesa_randomize. |
| mesa_set_perf | Drive the Performance FX pad — enable, effect, engage, X/Y, and the drawn motion path (grid cells + rate). |
| mesa_set_link | Join or leave the Ableton Link session and propose a session tempo. (Enabling Start/Stop sync itself is still Ableton's own sheet.) |
| mesa_set_tempo | Set the arp/sequencer's BPM — the standalone app has no host transport, so rates like "1/8" need a real tempo to mean anything. |
| mesa_set_sequence | Play an explicit ordered step list, looping on its own clock — the fix for repeated-note patterns (which the pitch-sorted arpeggiator can't do) and for holding steady tempo (the model-to-tool round-trip is too slow to pace individual notes in real time). |
| mesa_sequence_stop | Stop a running mesa_set_sequence. |
Input
Drag across the terrain preview to play it like a ribbon — left-to-right is two octaves, top-to-bottom is velocity, with faint octave lines. Works in the app, in the plug-in, and in fullscreen.
Touch piano keyboard in the standalone app, with a Hold/Latch toggle. ⌘L toggles it from a keyboard.
Standalone app only. Logic Pro's Musical Typing layout for notes; Z / X shift the octave down/up; ← / → (or ⌘← / ⌘→) step through patches without touching the mouse. Click anywhere along the bottom bar to arm QWERTY input.
Standard CoreMIDI: note on/off with velocity, CC, 14-bit pitch bend, and CC 64 as a sustain pedal.
As an AUv3 instrument, play from the piano roll or a MIDI track like any plug-in.
Switch MOTION to SEQ and the grid plays the line. PLAY and the BPM readout run it on its own clock; in a DAW the host's transport takes over. Hold a key to transpose it — the lowest one wins, and it stays where you left it. Long-press a step for ratchets, per-step velocity, chance and parameter locks.
Arm NOTES OUT to mirror what MESA plays as recordable MIDI, or export a pattern as a .mid and drag it in from Finder.
Tap the expand button on the terrain (or ⌘F) to fill the screen with the live shader — controls fade on their own. Map it to a MIDI footswitch for hands-free mid-set. Still playable as a ribbon.
Reference
| Formats | AUv3 plug-in + standalone app (universal purchase) |
| Platforms | iOS · macOS (Mac Catalyst, "Optimized for Mac") |
| Engine | Native C++17 DSP, Objective-C++ AU bridge, Swift/Metal UI |
| Polyphony | 16 voices, oldest-note stealing |
| Unison | Up to 8 voices per note |
| Wavetable | 64-frame morph, FFT mip-banked per frame for alias-free playback |
| Visual import | .vkograph · native/web-editor VKO1 Metal shaders · full modifier graph · 33 palettes |
| Shader library | 93 shaders in the Starter Pack, live count shown in the browser header |
| Factory presets | 57 patches across 8 categories, live count shown in the browser header |
| Modifiers | 26 VFX node types, per-node wet/dry |
| FX chain | 8-stage stereo rack — tape, flutter, waveshaper, chorus, delay (mix/time/feedback), reverb (mix/size/damp), lo-fi, tape-stop |
| Sequencer | 303-shaped mono line in the DSP — note/gate/accent/slide/octave/tie plus per-step ratchet, velocity, probability and cutoff/morph parameter locks; 1–64 steps, bank of up to 64 patterns (add/duplicate/delete), beat-synced switching, swing; PLAY + tempo transport that defers to the host |
| Arpeggiator | 8 orders (incl. as-played, chord, converge), 1–4 octaves up/down/alternating, gate, swing, ratchet, accent-every-N, BAKE-to-sequencer; one shared control set across plug-in and app |
| Motion | One selector: OFF / ARP / SEQ, sharing a clock. Under SEQ the keys transpose the line |
| Projects | .mesaproject — patch + shaders + full pattern bank + arp setup + transport + trim + MIDI mapping |
| Performance FX | Master-bus XY pad — 6 effects, drawable motion path, fullscreen; real DSP bypass when off |
| Output stage | Global Volume → master limiter, downstream of the whole patch and FX chain |
| MIDI | Full CC Learn (with an on/off switch) · pitch bend · sustain pedal (CC 64) · persistent bindings · notes-out to the host (AUv3) · pattern export as .mid |
| Sync | Ableton Link (standalone) via official LinkKit |
| MCP | Local server, 127.0.0.1:6372, 27 tools, Mac standalone only |
| AU identity | type aumu · subtype Mesa · manufacturer Tmpr |
Tips
Every factory preset is a working example of Vision + palette + VFX chosen for that sound — a fast way to learn what each control actually does to timbre.
A single shader can sound completely different just by scanning a different row — often faster than sculpting with the filter.
Routing an LFO to Pitch on slot 3 gives you vibrato without touching the fixed Morph/Cutoff routes.
Stacking several VFX nodes can take a shader somewhere unrecognizable — save a preset first if you like where you are.