A trance synthesizer plugin. Supersaw leads, plucks, pads, offbeat and rolling basses, 303-style acid, arps, stabs, gated chords and risers, with the effects trance is built on: ping-pong delay, a lush hall, the trance gate and sidechain pump. It is a CLAP first, wrapped as VST3, Audio Unit (AUv2) and a standalone app, and it is MIT-licensed.
https://wavelength.run/trance/ has the download and a version you can play in the browser: the same engine and editor, compiled to WebAssembly.
wavelength-trance-macos.zip has the CLAP, VST3, Audio Unit and standalone app for macOS 11 or later, universal (Apple silicon and Intel).
- Copy
Wavelength Trance.clapto~/Library/Audio/Plug-Ins/CLAP,.vst3to~/Library/Audio/Plug-Ins/VST3and.componentto~/Library/Audio/Plug-Ins/Components, and the app wherever you like. - The builds aren't notarized by Apple yet, so macOS quarantines them after a download. Clear that once in Terminal:
xattr -dr com.apple.quarantine ~/Library/Audio/Plug-Ins/*/Wavelength\ Trance.* xattr -dr com.apple.quarantine /Applications/Wavelength\ Trance.app
- Rescan plugins in your DAW. Logic and GarageBand see the Audio Unit after a restart.
Windows and Linux builds aren't released yet. The code is written for them (WebView2 on Windows, no editor on Linux so far), but neither has been tested.
- Two unison oscillators, each with up to 9 voices: saw, square (pulse width), triangle, sine and a dual saw for hoovers. Seven saws follow the Roland JP-8000's uneven voice spacing, so the supersaw shimmers the way the records do. Detune, blend (side voices against the centre), stereo width, octave, semitone, fine, phase retrigger. Osc A can phase-modulate Osc B (FM) for bells, keys and psy leads.
- Sub oscillator (sine, square, triangle; one or two octaves down) and stereo noise with a colour control, before the filter or after it (clicks and hats whatever the cutoff).
- Filter: a zero-delay-feedback 4-pole ladder (LP 24), an Acid mode (a 303-style squelch: a high-pass in the resonance loop and a harder-driven loop), a state-variable filter for LP 12, BP 12, HP 12 and notch, and a Vowel filter (three formants morphing u, o, a, e, i as the cutoff rises from 200 Hz to 4 kHz, so sweeps sound sung). Drive, key tracking, velocity and a bipolar envelope amount.
- Three envelopes (amp, filter, mod) with analog-style curves, two LFOs (seven shapes, free or tempo-synced, per-note retrigger or free-running, fade-in delay).
- Mod matrix: 8 slots from 15 sources (LFOs, envelopes, velocity, key, mod wheel, aftertouch, per-note random, 4 macros, and a Release ramp that rises after note-off for hoover dives) to 40 destinations: pitch, levels, pulse width, detune, unison width, FM, cutoff, resonance, drive, glide, amp envelope times, LFO rates and depths, mod-envelope depth, and the effects (delay and reverb mix, gate depth and length, pump depth, drive, arp gate and octaves). The factory leads put vibrato depth on the mod wheel.
- Four macros per preset with their own names, for one-knob performance moves (brightness, space, detune, drive). Brightness loads centred at 50%, so it darkens as well as brightens.
- Voice modes: poly (up to 16 voices), mono and legato with glide (always or legato-only), pitch bend range, transpose, velocity sensitivity and analog drift.
- Arpeggiator: up, down, up/down, down/up, as played, random and chord modes, 1 to 4 octaves, gate, swing and latch, and a 16-step pattern of rests and accents (an accent plays about 4 dB louder with a filter kick, like a 303's), locked to the host's song position.
- Trance gate: a 16-step pattern at any note value with length, attack, release and depth, sample-accurate against the host's transport, after the delay and reverb (crisp) or before them (the echoes fill the gaps). Tempo divisions run from 32 bars to 1/64.
- Effects: distortion (soft, hard, tube, wavefolder at 2x oversampling, and a bit crusher), chorus (classic, or a Juno-60 style ensemble), phaser, delay (ping-pong, stereo or mono; tempo-synced or in milliseconds; filters and saturation in the feedback; tape wobble; ducking so echoes bloom between notes), reverb (an 8-line feedback delay network hall), EQ, sidechain-style pump, master width and an output limiter. The low end below ~110 Hz is always kept mono.
- 54 factory presets in Lead, Pluck, Pad, Bass, Acid, Arp, Stab, Gate, FX and Keys, levelled so browsing doesn't jump in loudness. Basses carry a sub an octave down, so write them around E2 to C3. The risers sweep over LFO 2's division (8 bars up, 4 down by default), so they land on the drop at any tempo.
- User presets save as JSON (
.wtpreset) to~/Library/Application Support/Wavelength Trance/Presetson macOS (%APPDATA%\Wavelength Trance\Presetson Windows,~/.local/share/wavelength-trance/presetson Linux). - Host integration: every parameter is automatable with readable names and values, state saves by parameter key (presets from older versions keep loading), CLAP preset discovery lists the factory and user presets in hosts that read it (Bitwig Studio, Wavelength) and loads factory presets by name, and the plugin reports its tail (release, reverb and delay) so offline renders keep it.
- Editor: an HTML interface in an embedded WebView (WKWebView on macOS, WebView2 on Windows), with a light that shows when the output limiter is working.
- Computer-keyboard piano (standalone app): with Caps Lock on, the keyboard plays notes in the layout DAWs use: A to ' are the white keys from C3, W E T Y U O P the black keys, Z and X shift the octave, C and V change velocity. Inside a DAW the plugin leaves the keyboard to the host.
Wavelength, the music engine for AI agents, plays Wavelength Trance like any other CLAP: a track names the plugin and a preset ("plugin": "Wavelength Trance", "preset": "Euphoria Lead") and renders, with no screen and no DAW. For Claude Desktop, Cursor and other MCP clients, Wavelength's MCP server (wavelength mcp) does the same: it lists the presets and parameters, draws a patch card of how a preset sounds, and renders songs. Setup: https://wavelength.run/#mcp. In Claude Code, the Wavelength plugin brings the server and a skill for the whole songwriting process:
/plugin marketplace add austinginder/wavelength
/plugin install wavelength@wavelength
Needs CMake 3.21+, Ninja and a C++20 compiler (Xcode's clang on macOS). Dependencies are fetched at configure time.
cmake -S . -B build -G Ninja -DCMAKE_BUILD_TYPE=Release
ninja -C buildThe plugins land in build/plugins/: Wavelength Trance.clap, .vst3, .component and Wavelength Trance.app (the standalone). For a universal macOS build add -DCMAKE_OSX_ARCHITECTURES="arm64;x86_64".
To try them in a DAW, copy them to ~/Library/Audio/Plug-Ins/CLAP, VST3 and Components (macOS).
build/wt-render --all --out DIRrenders every factory preset through the plugin's CLAP interface with a test pattern that suits its category (chords for pads, an offbeat line for basses, a 303 line for acid, held chords for arps) and prints peak, RMS, stereo correlation, CPU and NaN counts.--preset NAME,--pattern,--set key=text(e.g.--set filter.cutoff=800Hz),--bpm,--bars.build/wt-test-statesaves a randomized state, reloads it into a new instance and compares every parameter.build/wt-test-textchecks that every parameter's value text parses back to the same value, andbuild/wt-test-choruschecks the ensemble chorus.build/wt-test-editorchecks that everything the editor reads from the plugin (parameters, presets, the poll after loading each preset and playing a note) parses as JSON, under a decimal-comma locale too.build/wt-test-arpplays chords through the arp with the transport running at 140 BPM and checks its first steps: each note once, in order, with no second step stacked on the first.build/wt-paramsprints the parameter table as JSON (the same data the editor gets).tools/fxtest_time.cppandtools/fxtest_dyn.cpptest the effects on their own (transparency at mix 0, stability, reverb decay times, gate and pump timing, aliasing, CPU). They aren't CMake targets; each file's header has its compile line.node ui/dev/preview.mjsscreenshots the editor in headless Chromium againstui/dev/mock.jsand checks its controls (setPLAYWRIGHTto Playwright'sindex.mjsif it isn't in~/node_modules).node web/smoke.mjsrenders every factory preset through the browser build and compares it withwt-render(see web/readme.md).- Validation: the CLAP passes clap-validator (its two preset-discovery crawl tests deadlock inside the validator itself on any plugin that lists more than one preset; Wavelength and Bitwig read the same presets fine), the AU passes
auval -v aumu WvTr Wvln, and the VST3 passes pluginval at strictness 7 with its editor tests. pluginval's current release can't load the AU: its JUCE asks every continuous parameter for billions of value strings because clap-wrapper marks AU parameters "values have strings" (newer JUCE caps this; Logic and GarageBand rely on auval).
web/ builds the same engine to WebAssembly with Emscripten and wraps the editor page in a small demo: audio in an AudioWorklet, a loop player, the computer keyboard and an on-screen piano, Web MIDI, presets saved in the browser and downloadable as .wtpreset files. web/readme.md has the build and how to put it on a site.
scripts/build-release.sh v0.1.0 [--web] [--upload] builds a tag on a Mac: the universal plugins (signed ad hoc), a smoke render through wt-render, wavelength-trance-macos.zip with the licences of everything linked in, the browser demo as wavelength-trance-web.zip with --web, and SHA256SUMS.txt, uploaded to the GitHub release with --upload.
src/params.*: the parameter table. Every module reads it: the DSP, the host, presets, state and the editor. IDs are stable once released.src/dsp/: oscillators, filters, envelopes, LFOs and small helpers.src/voice.*,src/engine.*: voices, voice allocation and stealing, mono/legato, the arpeggiator, global LFOs and the effect chain.src/fx/: the effects, header-only.src/presets.*,src/factory_presets.cpp: the preset format, user presets and the factory bank (written in real units: Hz, seconds, labels).src/plugin.cpp: the CLAP plugin (params, state, notes and MIDI, transport, preset discovery and loading, the editor bridge).src/entry.cppexports it; clap-wrapper builds the other formats from the same code.src/gui/editor.*,ui/index.html: the editor.ui/dev/runs the page in a browser with a mock of the plugin for development.web/: the browser build (wt_web.cppis the C API over the engine;host.js,worklet.jsandshell.htmlare the page) andcmake/web.cmakebuilds it.
A preset is JSON: a name, a category, the four macro names and every parameter by key. Keys that a version doesn't know are ignored, and missing keys take their defaults.
{"format": "wavelength-trance", "version": 1, "name": "My Lead", "category": "Lead",
"macros": ["Brightness", "Space", "Detune", "Drive"],
"params": {"oscA.wave": 0, "oscA.unison": 7, "filter.cutoff": 0.79, "delay.on": 1}}Continuous values are the parameter's published value: real units for linear parameters (dB, percent as 0 to 1), and 0 to 1 positions for curved ones (cutoff, times); wt-params lists each parameter's range and mapping.
MIT, see license. Third-party code is listed in third_party.md: the Audio Unit also contains Apple's AudioUnitSDK (Apache 2.0), and the release archive carries every licence text.