MANUAL · v1.3

Everything MESA does, and how to drive it.

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.

What MESA is

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.

AUv3 + Standalone

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.

iOS & macOS

Mac Catalyst gives MESA a proper "Optimized for Mac" window on the desktop, from the same codebase as the iPad/iPhone build.

Purpose-built

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.

Your first patch

01

Open a preset

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.

02

Play it

Standalone: the on-screen keyboard or a MIDI/Bluetooth keyboard. AUv3: play from your DAW's piano roll or MIDI keyboard track.

03

Look at the terrain — then play it

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.

04

Turn a knob

Every panel below the display is real-time. Long-press (or right-click on Mac) any knob to bind it to a MIDI CC.

MESA main window: shader display, oscillator/filter/envelope/pitch panels, mod matrix, FX sends, tape FX, layer, vision, VFX, arpeggiator

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.

Shader → wavetable

No other wavetable synth works this way. MESA can import a shader and use its picture as the sound source, not just as decoration.

Three source formats, auto-detected

FormatWhat it is
Native .metalA VKO1 iOS/macOS-style shader: one fragment function taking VertexOut + constant GeneratorUniforms&. Used as-is.
Web-editor .metalVKO1 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 JSONA 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.

How the picture becomes a waveform

  1. MESA renders the shader offscreen, 64 times, sweeping the time uniform across the frames of a wavetable.
  2. For each frame it reads one horizontal scanline of pixels and turns each pixel's luminance into one audio sample (Vision panel controls exactly how — see below).
  3. Each frame is band-limited (FFT mip-banked) so the result is alias-free across the whole keyboard range.
  4. The 64 resulting frames become a morphable wavetable — the Morph knob scans across them.

Zero clicks: a newly imported wavetable swaps in lock-free on the audio thread — no glitch, no dropout, even mid-note.

Live backdrop, not just an importer

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.

Layer A / Layer B

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.

Tune how MESA sees

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.

ControlWhat it does
Scan YWhich 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.
ChannelHow R/G/B combine into the luminance sample: RGB (standard weighting), R, G, B only, R−B (chroma axis), or Equal weight.
CurveNonlinear 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.
TimeHow 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.

Hide the visuals to save GPU

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.

33 palettes, not just cosmetic

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.

26 modifiers, stacked

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.

Graph-traced originals
filmLook

Grain + envelope + a waveshaping preset (tanh / S-curve / edge / invert).

bloom

9-tap Gaussian blur — acts as a low-pass on the extracted waveform.

rgbSplit

Re-samples each color channel at an offset — comb-filters the harmonics.

datamosh

Block UV displacement — gritty inter-frame smear and texture.

mask

Blend mode against a greyscale copy: multiply, screen, difference, or plain greyscale.

Color & grading
hueRotate

Rotates hue around the color wheel.

saturation

Push saturation up to 2× or down to greyscale.

colorShift

Channel-offset color shift.

colorControls

Contrast/brightness style adjustment.

colorRamp

Remaps luminance through a gradient ramp.

thermal

False-color thermal-camera style mapping.

posterize

Reduces color/luminance to hard steps — bit-crush for the picture.

chromaKey

Key out a color range.

Texture & glitch
scanlines

CRT-style horizontal scanline overlay.

halftone

Print-style dot/halftone pattern.

feedback

Frame feedback with decay + scale — trailing, echo-like visuals (and waveforms).

glitch

Digital glitch/corruption artifacts.

blur

Plain radius blur (distinct from bloom's threshold-based glow).

Geometry
mirror

Mirrors the frame.

kaleidoscope

2–16 radial segments.

pixelate

Blocky pixel resolution reduction.

rotate

0–360° rotation.

waveWarp

Sinusoidal UV warp.

affineTransform

Scale/skew style affine warp.

perspective3D

Perspective/tilt warp.

edgeDetect

Edge-detection outline pass.

Oscillator & unison

ControlRangeNotes
Morph0–1Position across the 64-frame wavetable.
Unison1–8 voicesStacked, detuned copies with stereo spread; loudness-normalized so more voices don't just get louder.
Detune0–50 centsSpread between unison voices, symmetric around center.
Level0–100%Output gain.
Sub0–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.

Filter · ZDF

A zero-delay-feedback state-variable low-pass, one per voice.

ControlRangeNotes
Cutoff20 Hz – 20 kHz 
Resonance0–1Self-oscillates at the top of the range.
Drive0–1A 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.

Envelope & Pitch

Amp envelope — full ADSR

StageRange
Attack~1 ms – 8 s (exponential)
Decay~1 ms – 8 s (exponential)
Sustain0–1 level
Release~10 ms – 12 s (exponential)

Glide

Portamento between notes. 0 disables it; otherwise ~5 ms – 2 s exponential. Each new note glides from the pitch of the previously played note.

Pitch Envelope

A dedicated pitch-only envelope on top of the amp envelope — for percussive drum-like drops, or upward "blip" attacks.

ControlRange
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.

Mod matrix

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.

SlotSourceDestinationAmount
1LFO 1 (fixed)Morph (fixed)0–100%
2LFO 2 (fixed)Cutoff (fixed)0–100%
3LFO 1 / LFO 2 / Wheel / Velo — tap to cycleMorph / 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.

FX chain — 8 stages

Always in this order, post-mix, allocation- and lock-free:

TapeWow & FlutterWaveshaperChorusDelayReverbLo-FiTape Stop
StageWhat it does
TapeHF roll-off + asymmetric soft-clip saturation — the "Tape" knob.
Wow & FlutterTape-speed pitch instability: a slow ~0.6 Hz wow plus a fast ~11 Hz flutter, via a variable delay line — the "Flutter" knob.
WaveshaperShared with the Drive knob — soft saturation/wavefolding.
ChorusModulated stereo delay, fixed depth character (no dedicated Chorus knob in the current build — it's part of the fixed chain).
DelayStereo 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%).
ReverbFreeverb-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-FiSample-rate reduction + bit-depth crush (14 bits down to ~4 at full amount) — "Lo-fi" knob.
Tape StopOne-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 FX

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.

EffectX axisY axis
FILTERCutoff, LP ‹ › HPResonance
STUTTERSlice lengthDecay
CRUSHSample-rate crushBit depth
GATERateDepth
DELAYTimeFeedback
SPACESizeAmount

Draw a motion path

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.

Fullscreen

The same pad edge to edge, for a bigger target during a set.

Global volume & master limiter

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.

Play your own audio

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.

ControlWhat it does
Mix0 = wavetable only, 1 = sample only, between = blend.
LoopToggle looping on/off for the sample.
Start / EndLoop region, as a fraction of the sample's length.
ClearRemoves 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 — OFF / ARP / SEQ

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.

SourceWhat playsWhat the keys do
OFFNothing generated.Play straight through.
ARPThe notes you hold, cycled.They are the pattern.
SEQThe 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.

The arpeggiator

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.

ControlWhat it does
OrderEight 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.
Rate1/4 · 1/8 · 1/8T · 1/16 · 1/16T · 1/32.
Octaves + direction1–4 octaves of range, and whether the stack is walked up ↑, down ↓ or alternating ↕ above and below.
GateHow much of its step each note holds — spiky staccato through to legato that runs into the next step.
SwingPushes the off-steps late, the same feel as the sequencer's swing.
Ratchet1 (off) to 4 — retriggers the note that many times inside a single step for a roll.
AccentOff, or every 2nd / 3rd / 4th step at full velocity with the rest sat back — what turns a flat run into a pattern.
HoldLatches 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.

Step sequencer

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.

Transport — PLAY and tempo

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.

The grid

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 stepWhat it does
PitchSemitones above the pattern's root.
Octave−1 / 0 / +1 — what stops a line reading as a scale exercise.
GATEOff is a rest: silent, but the clock keeps moving.
ACCAccent — louder, and it reads as the emphasis in the line.
SLIDEPortamento 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.
TIEHold the previous note through this step without retriggering.

The step sheet — long-press a step

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 sheetWhat it does
RATCHETSplit 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.
VELOCITYOverride the two accent levels with an exact number. Defaults to "follow the ACC flag".
CHANCE0–100%. Below 100 the step becomes a sometimes — it either plays whole, ratchets and all, or sits out that time round.
CUTOFF / MORPH lockPark 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.

Roll a line

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.

Pattern and bank

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.

Recording MESA into a DAW

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".

NOTES OUT

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.

Play it, or record it — two different jobs

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.

Just hear MESA drive something else

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.

Actually record the MIDI

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.

The one rule, everywhere

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.

Or skip the routing: export the pattern

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.

Then mute the internal pattern

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.

Logic Pro on Mac, end to end

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."

  1. Build the line on MESA's step sequencer on track 1. The transport is Logic's — MESA follows it.
  2. Arm NOTES OUT. The slash badge clears once a track is actually reading MESA.
  3. New software-instrument track; set its input to MESA's track via Internal MIDI In.
  4. Record-arm it and roll. What lands is MESA's line as editable MIDI.
  5. Drag the region onto MESA's own track, then mute the internal pattern so the two don't double.

Or skip steps 2–4 entirely: export the pattern as a .mid and drag it from Finder.

In iOS hosts

HostHow
AUMOpen 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 ProLoad 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.
DramboRecords AUv3 MIDI output natively (2.20+). Route MESA's MIDI out to a recorder module.
apeMatrixSame idea as AUM — MESA is a node with a MIDI output; patch it wherever.
Logic Pro for iPadApple 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.

Presets

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.

BasicsPadsBassLeads Plucks & BellsKeys & Lo-FiAtmos & Drones FX & TexturesUser

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).

Save

Name it, pick a category (defaults to "User"), done.

Export / Import / Delete

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.

iCloud sync

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.

Projects

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.

Randomizer

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.

Point it at a genre

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.

StyleWhat a roll does
ANYTHINGNo 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.

What the dice touches

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.

Packs

PackWhat it is
Starter Pack93 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 ShadersYour own imports and saves, each with its full settings (modifier chain, palette, Vision) preserved.
Installed packsSideloadable .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 Learn

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.

What's learnable

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.

MCP Control Standalone app, Mac only

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.

Connect

$ claude mcp add --transport http mesa http://127.0.0.1:6372/mcp

Or, for any other MCP client (Cursor, Windsurf, VS Code):

{ "mcpServers": { "mesa": { "url": "http://127.0.0.1:6372/mcp" } } }

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.

27 tools

ToolWhat it does
mesa_catalogReference: the AU parameter map, all 26 modifier types, mod-matrix and arp names, and the exact Metal shader contract. Call this first.
mesa_stateFull live snapshot — preset, every parameter, mod matrix, Vision, arp, sampler, Performance FX, Ableton Link, telemetry.
mesa_list_shaders / mesa_get_shaderList and fetch shaders across all packs.
mesa_create_shader / mesa_update_shaderWrite or edit a shader in My Shaders — compiles immediately, returns the real Metal compiler error on failure.
mesa_load_shaderPush a shader onto the live terrain by name.
mesa_preview_shaderRenders an actual 2D PNG of the shader — see it before it's live.
mesa_list_presets / mesa_get_preset / mesa_save_preset / mesa_load_presetBrowse, inspect, save, and recall full patches.
mesa_randomizeRoll 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_paramsSet any subset of parameters by friendly name in one call.
mesa_set_modSet a mod-matrix slot, including the free-assign source/dest.
mesa_set_arpSet arp on/hold/pattern/rate/octaves in one call.
mesa_note_on / mesa_note_offTrigger and release a MIDI note directly — the agent can play the keyboard.
mesa_play_noteOne-shot audition: plays a note and releases it after a duration, no second call needed.
mesa_pitch_bendSet the pitch-bend wheel live, −1..+1 — re-pitches sounding notes immediately.
mesa_panicHard-kill every voice instantly, and reset the arp's held notes and any running sequence — for recovering from a stuck note.
mesa_set_volumeSet 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_perfDrive the Performance FX pad — enable, effect, engage, X/Y, and the drawn motion path (grid cells + rate).
mesa_set_linkJoin or leave the Ableton Link session and propose a session tempo. (Enabling Start/Stop sync itself is still Ableton's own sheet.)
mesa_set_tempoSet 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_sequencePlay 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_stopStop a running mesa_set_sequence.

Playing MESA

Play the visuals

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.

On-screen keyboard

Touch piano keyboard in the standalone app, with a Hold/Latch toggle. ⌘L toggles it from a keyboard.

Mac/Bluetooth 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.

MIDI input

Standard CoreMIDI: note on/off with velocity, CC, 14-bit pitch bend, and CC 64 as a sustain pedal.

Inside a DAW

As an AUv3 instrument, play from the piano roll or a MIDI track like any plug-in.

The step sequencer

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.

Send it to the DAW

Arm NOTES OUT to mirror what MESA plays as recordable MIDI, or export a pattern as a .mid and drag it in from Finder.

Fullscreen visuals

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.

Specs

FormatsAUv3 plug-in + standalone app (universal purchase)
PlatformsiOS · macOS (Mac Catalyst, "Optimized for Mac")
EngineNative C++17 DSP, Objective-C++ AU bridge, Swift/Metal UI
Polyphony16 voices, oldest-note stealing
UnisonUp to 8 voices per note
Wavetable64-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 library93 shaders in the Starter Pack, live count shown in the browser header
Factory presets57 patches across 8 categories, live count shown in the browser header
Modifiers26 VFX node types, per-node wet/dry
FX chain8-stage stereo rack — tape, flutter, waveshaper, chorus, delay (mix/time/feedback), reverb (mix/size/damp), lo-fi, tape-stop
Sequencer303-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
Arpeggiator8 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
MotionOne 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 FXMaster-bus XY pad — 6 effects, drawable motion path, fullscreen; real DSP bypass when off
Output stageGlobal Volume → master limiter, downstream of the whole patch and FX chain
MIDIFull 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
SyncAbleton Link (standalone) via official LinkKit
MCPLocal server, 127.0.0.1:6372, 27 tools, Mac standalone only
AU identitytype aumu · subtype Mesa · manufacturer Tmpr

Good habits

Start from a factory patch

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.

Move Scan Y before you reach for EQ

A single shader can sound completely different just by scanning a different row — often faster than sculpting with the filter.

Use the free mod slot for pitch

Routing an LFO to Pitch on slot 3 gives you vibrato without touching the fixed Morph/Cutoff routes.

Save before big VFX experiments

Stacking several VFX nodes can take a shader somewhere unrecognizable — save a preset first if you like where you are.