Plugins
This content is for v0.7. Switch to the latest version for up-to-date documentation.
Resonon supports CLAP and VST3 audio plugins for effects processing and virtual instruments. Most built-in effects (delay, filters, overdrive) are native DSP — no plugins needed. Two reverb plugins are bundled; third-party plugins require a scan step.
Bundled Plugins
Section titled “Bundled Plugins”Resonon ships with two built-in reverb plugins. These are embedded in the binary and auto-extracted on first use — no scan required.
| Plugin Name | Filename | Plugin ID |
|---|---|---|
| RESONON Reverb | resonon-reverb | com.resonon.reverb |
| RESONON Plate Reverb | resonon-reverb-plate | com.resonon.reverb-plate |
// Bundled plugins load instantly -- no plugin_scan() neededlet reverb = Effect("resonon-reverb");let plate = Effect("resonon-reverb-plate");Plugin Discovery
Section titled “Plugin Discovery”plugin_scan()
Section titled “plugin_scan()”Scan standard CLAP and VST3 directories for installed third-party plugins and cache the results. Returns the total number of plugins found:
let count = plugin_scan();show(count); // e.g. 42The scan searches OS-specific directories in priority order:
| OS | Format | Search Paths (highest priority first) |
|---|---|---|
| macOS | CLAP | /Library/Audio/Plug-Ins/CLAP, ~/Library/Audio/Plug-Ins/CLAP, ~/.clap |
| macOS | VST3 | /Library/Audio/Plug-Ins/VST3, ~/Library/Audio/Plug-Ins/VST3 |
| Linux | CLAP | /usr/lib/clap, /usr/local/lib/clap, ~/.clap |
| Linux | VST3 | /usr/lib/vst3, /usr/local/lib/vst3, ~/.vst3 |
| Windows | CLAP | C:\Program Files\Common Files\CLAP, C:\Program Files (x86)\Common Files\CLAP |
| Windows | VST3 | C:\Program Files\Common Files\VST3, C:\Program Files (x86)\Common Files\VST3 |
Results are written to a JSON cache file so that subsequent plugin_list() calls and name-based loading are fast.
plugin_list()
Section titled “plugin_list()”List all discovered plugins from the cache, deduped by name. Plugins available in both CLAP and VST3 are shown once with format tags. Returns the number of unique plugins:
let count = plugin_list();// 5 plugins:// RESONON Delay — Resonon [CLAP]// RESONON Filter — Resonon [CLAP]// Surge XT — Surge Synth Team [CLAP, VST3]// Valhalla Room — Valhalla DSP [VST3]// ...If no cache exists, run plugin_scan() first.
Loading Plugins
Section titled “Loading Plugins”Effect(name) / Effect(name, plugin_id)
Section titled “Effect(name) / Effect(name, plugin_id)”Load an effect plugin (CLAP or VST3). The format is auto-detected — by default CLAP is tried first, then VST3. You can override this globally or per-plugin in config.toml. The name argument is resolved in this order:
- Full path — if the name ends in
.clap/.vst3or points to an existing file - Filename — search OS plugin directories for a matching
.clapor.vst3file - Registry name — look up by display name in the scan cache
- Error with suggestions — list available plugins
let reverb = Effect("resonon-reverb"); // By filename (bundled)let shimmer = Effect("Valhalla Shimmer"); // By display name (after scan)let fx = Effect("/path/to/plugin.clap"); // By full pathlet room = Effect("ValhallaRoom"); // Auto-detects CLAP or VST3For plugins that contain multiple effect types in a single bundle, specify the plugin ID as the second argument:
let chorus = Effect("Multi-FX", "com.vendor.multi-fx.chorus");If you omit the plugin ID for a multi-plugin bundle, Resonon lists the available IDs.
Instrument(name) / Instrument(name, plugin_id)
Section titled “Instrument(name) / Instrument(name, plugin_id)”Load an instrument plugin (CLAP or VST3). Format auto-detection, name resolution, and config-based preference follow the same rules as Effect():
let synth = Instrument("Surge XT");let lead = AudioTrack("lead");lead.load_instrument(synth);lead << [C4 E4 G4 C5];Troubleshooting Plugin Loading
Section titled “Troubleshooting Plugin Loading”When a plugin cannot be found, Resonon shows which paths were searched and lists available plugins:
Plugin not found: 'Surge'
Searched locations: - /Library/Audio/Plug-Ins/CLAP/Surge.clap - ~/Library/Audio/Plug-Ins/CLAP/Surge.clap - /Library/Audio/Plug-Ins/VST3/Surge.vst3 - ~/Library/Audio/Plug-Ins/VST3/Surge.vst3
Available plugins: - resonon-reverb - resonon-reverb-plate ...
Tip: Run plugin_scan() to discover installed plugins.If multiple plugins share the same display name, Resonon asks you to disambiguate with a plugin ID:
// Specify the exact plugin IDlet delay = Effect("Delay", "com.resonon.delay");Plugin Methods
Section titled “Plugin Methods”Method Overview
Section titled “Method Overview”| Method | Args | Returns | Description |
|---|---|---|---|
.name() | — | String | Plugin display name |
.params() | — | Nul | Print all parameters as a table |
.params(filter) | String | Nul | Print parameters matching the filter substring |
.param(path) | String | Number | Read a parameter’s current value |
.set_param(path, value) | String, Number | Self | Set a parameter value (chainable) |
.set_param_norm(path, value) | String, Number | Self | Set a parameter using normalized 0–1 value (chainable) |
.supports_gui() | — | Boolean | Whether the plugin has a GUI |
.show_gui() | — | Nul | Open the plugin GUI window |
.hide_gui() | — | Nul | Close the plugin GUI window |
.save_state(path) | String | Self | Save full plugin state to a file (chainable) |
.load_state(path) | String | Self | Load plugin state from a file (chainable) |
Parameter Discovery
Section titled “Parameter Discovery”.params() prints all parameters with their ranges, defaults, and current values:
let reverb = Effect("resonon-reverb");reverb.params();Output is a formatted table:
Parameter Range Default Value─────────────────────────────────────────────────Room [0.0-1.0] 0.5 0.5Damp [0.0-1.0] 0.5 0.5Width [0.0-1.0] 1.0 1.0Mix [0.0-1.0] 0.33 0.33.params(filter) accepts a substring to narrow results. This is useful for plugins with many parameters:
let synth = Instrument("Surge XT");synth.params("osc"); // Only show oscillator-related parameterssynth.params("filter"); // Only show filter parametersReading Parameters
Section titled “Reading Parameters”.param(path) returns a parameter’s current value:
show(delay.param("Time")); // 0.25show(filter.param("Cutoff")); // 1000.0Setting Parameters
Section titled “Setting Parameters”.set_param(path, value) sets a parameter and returns the plugin for chaining:
delay.set_param("Time", 0.3) .set_param("Feedback", 0.6) .set_param("Mix", 0.8);.set_param_norm(path, value) sets a parameter using a normalized 0–1 value. The value is mapped to the parameter’s actual range (including non-linear curves for VST3 plugins):
delay.set_param_norm("Time", 0.5) // midpoint of the Time range .set_param_norm("Mix", 1.0); // maximum mixShorthand: plugin.Param << value
Section titled “Shorthand: plugin.Param << value”Dot-access with the parameter name and << provides a concise syntax:
filter.Cutoff << 2000;filter.Resonance << 3.0;This shorthand also accepts signals for continuous modulation:
filter.Cutoff << Sine(2).range_exp(400, 4000);filter.Resonance << Tri(0.5).range(0.5, 4.0);See Signals & Automation for the full set of signal generators.
Plugin Name
Section titled “Plugin Name”.name() returns the plugin’s display name:
let reverb = Effect("resonon-reverb");show(reverb.name()); // "RESONON Reverb"Plugin GUI
Section titled “Plugin GUI”Some CLAP and VST3 plugins provide a graphical interface for editing parameters.
Checking GUI Support
Section titled “Checking GUI Support”let synth = Instrument("Surge XT");show(synth.supports_gui()); // true or falseOpening and Closing
Section titled “Opening and Closing”synth.show_gui(); // Open the plugin windowsynth.hide_gui(); // Close itExample: GUI Workflow
Section titled “Example: GUI Workflow”plugin_scan();
let synth = Instrument("Surge XT");let lead = AudioTrack("lead");lead.load_instrument(synth);
// Open the GUI to design a soundif synth.supports_gui() { synth.show_gui();}
// Save the preset for latersynth.save_state("presets/lead_patch.preset");
lead << [C4 E4 G4 C5];PLAY;State Persistence
Section titled “State Persistence”.save_state(path)
Section titled “.save_state(path)”Save the full plugin state (all parameters and internal state) to a file. Returns the plugin for chaining:
delay.save_state("presets/my_delay.preset");.load_state(path)
Section titled “.load_state(path)”Load a previously saved state into a plugin instance. Returns the plugin for chaining:
let reverb2 = Effect("resonon-reverb");reverb2.load_state("presets/my_reverb.preset");If the preset was saved by a different plugin, a warning is printed but the state is still loaded:
warning: preset 'presets/my_delay.preset' was saved for 'RESONON Delay', loading into 'RESONON Filter'Both methods are chainable:
let reverb = Effect("resonon-reverb");reverb.set_param("Room", 0.8) .save_state("presets/big_room.preset") .set_param("Room", 0.3);Loading Plugins into Tracks
Section titled “Loading Plugins into Tracks”Effects
Section titled “Effects”drums.load_effect(delay);drums.load_effect(filter);Effects chain in the order they are loaded. See Effects for the full effect management API.
Instruments
Section titled “Instruments”let synth = Instrument("Surge XT");let lead = AudioTrack("lead");lead.load_instrument(synth);Full Examples
Section titled “Full Examples”Effects Chain with Bundled Reverb
Section titled “Effects Chain with Bundled Reverb”Drums through a filter and delay (native DSP) into a reverb (bundled plugin):
use "std/instruments" { Sampler, Kit };
let drums = AudioTrack("drums");drums.load_instrument(Sampler(Kit("cr78")));drums << [bd sd [bd bd] sd];
// Native DSP effectslet lp = Lowpass(3000, 2.0);let echo = Delay(0.2, 0.4);
// Bundled reverb pluginlet verb = Reverb(0.6, 0.4, 1.0, 0.3);
drums.load_effect(lp);drums.load_effect(echo);drums.load_effect(verb);
PLAY;Third-Party Instrument
Section titled “Third-Party Instrument”Scan for plugins, load an external synth, and configure it:
plugin_scan();
let synth = Instrument("Surge XT");let lead = AudioTrack("lead");lead.load_instrument(synth);
// Discover parameterssynth.params("osc");
// Set parameterssynth.set_param("osc/type", 1) .set_param("osc/pitch", 0);
lead << [C4 _ E4 _ | G4 _ C5 _ | E5 _ G5 _ | C6 _ _ _];
PLAY;GUI and State Workflow
Section titled “GUI and State Workflow”Design a sound with the plugin GUI, save it, and recall it later:
plugin_scan();
let synth = Instrument("Surge XT");let lead = AudioTrack("lead");lead.load_instrument(synth);
// Open GUI to design the patchif synth.supports_gui() { synth.show_gui();}
// Play a pattern while tweakinglead << [C4 E4 G4 C5];PLAY;
// Save the resultsynth.save_state("presets/my_lead.preset");
// Later, in another script:let synth2 = Instrument("Surge XT");synth2.load_state("presets/my_lead.preset");See Also
Section titled “See Also”- Effects & Routing — effect chain management, send effects, routing
- Signals & Automation — signal generators for parameter modulation
- Samplers — built-in sample engine (also CLAP-based internally)
- Functions Reference —
plugin_scan(),plugin_list(),Effect(),Instrument() - Effects Reference — bundled effect parameter details