Audio Unified Rust Architecture
(DE-Gag: AUdio RAhmenwerk)
CLAP-first plugin framework for LX Audiolabs.
Runtime + formats + build + CLI live here. Agent orientation: agal.
| Status | 0.11.x — basis complete; used in production LX plugins (lx-audiolabs-plugins) |
| Dependency | path / git deps (publish = false); crates.io deferred until API refinement |
| License | GPL-3.0-or-later — see docs/licensing-compliance.md |
| Rust | 1.92+ MSRV (stable channel in rust-toolchain.toml), edition 2024 |
Commercial LX product plugins (aether, lucent, meridian, …) are not in this repository. The official public catalog is lx-audiolabs-plugins. This repo is the framework only — smoke examples prove the ship path.
AURA is intentionally narrow. Wrong stack → use another framework.
| We commit to | We do not ship |
|---|---|
UI: Slint only, via aura-baseview (+ aura-editor host adapter) |
egui, iced, Vizia as first-class UIs |
| Formats: CLAP primary; VST3 / LV2 only on the OS cells below | Audio Units (AU), AAX, VST2; “every format everywhere” |
| Hosts: Bitwig-first, then REAPER and other real CLAP/VST3/LV2 hosts | Pro Tools / Logic-only AU pipelines as a goal; Wine workarounds as product path |
| Platforms: Windows, Linux, macOS | iOS / embedded plugin hosts in v1 |
- Always: Slint UI + baseview host window (embed, scale, keys, clipboard, …).
- Choose renderer (features / project config), not toolkit:
- FemtoVG (OpenGL) — default
- Skia — optional
- Software / wgpu blit — optional
- There is no “raw egui editor” mode and no second UI framework in AURA.
Required UI path: aura-baseview (window/renderer) + aura-editor (host adapter) + aura-build (compile-time).
Same rule as Slint: one primary format, no kitchen-sink matrix.
- CLAP primary — one native path on Linux, Windows, macOS (
cargo aura new, CI validator, Bitwig-first). - VST3 second path: Windows and macOS only. Linux VST3 (Wine etc.) unsupported.
- LV2 = Linux only (process/params/state/UI). No Win/mac ship path.
Ship matrix (what CI installs / what we call a supported host path):
| Format | Linux | Windows | macOS | Role |
|---|---|---|---|---|
| CLAP | yes | yes | yes | Primary — always |
| VST3 | — | yes | yes | Secondary — Win/mac hosts |
| LV2 | yes | — | — | Secondary — Linux |
Wrappers may still compile on other OSes for unit tests. Product support = the table above.
Use another project:
| Need | Go here |
|---|---|
| Flexible Rust plugins, egui / iced / multiple UI styles, broad format matrix | nice-plug (NIH-plug successor) |
| CLAP-centric Rust ecosystem / lower-level CLAP work | clack (and related CLAP crates) |
| Full multi-format framework including AU/AAX paths, egui/iced/Vizia options | truce · truce.audio |
AURA = Slint + baseview + CLAP-first, with thin VST3/LV2 only on the ship matrix. Credit: clack, nice-plug, truce, clap bindings.
# 1) Clone + install the CLI (from this repo)
git clone https://github.com/LX-Audiolabs/aura.git
cd aura
cargo install --path tools/cargo-aura --locked
# 2) Point cargo-aura at the framework (path deps)
export AURA_PATH="$(pwd)" # PowerShell: $env:AURA_PATH = (Get-Location).Path
# 3) Scaffold a plugin (CLAP always; add --vst3 / --lv2 if needed)
# kind: effect (default) | effect-mono | analyzer | instrument
cargo aura new my-plugin
cd my-plugin
# 4) Build & install into the host search path
cargo aura install --clap --release
# 4b) Or stay in the loop: rebuild + reinstall on save
cargo aura watch --clap --hot
# 5) Check toolchain / AURA_PATH / clap-validator
cargo aura doctor
# 6) Optional: clap-validator on the installed .clap
clap-validator validate path/to/my-plugin.clap
# 7) Optional: regenerate the agal orientation mesh
cargo aura meshProve formats + UI without leaving this tree:
export AURA_PATH="$(pwd)"
cargo install --path tools/cargo-aura --locked
cargo aura install --clap --release -plug smoke-gain
# also: smoke-sidechain, smoke-midi-fx, smoke-synth| Example | What it proves |
|---|---|
examples/smoke-gain |
Stereo gain, Slint GUI, state, CLAP/VST3/LV2 |
examples/smoke-sidechain |
Main + one optional sidechain bus |
examples/smoke-midi-fx |
MIDI in/out (transpose thru) |
examples/smoke-synth |
Instrument / note path |
cargo aura preview
# or: cargo run -p aura-preview -- path/to/ui/main.slint
cargo aura preview --component 1 # pick component N (multi-UI files)
cargo aura preview --no-watch # one-shot render, no hot reloadcargo aura new <name> [--vst3] [--lv2] [--kind <k>] # scaffold a plugin workspace
cargo aura init [path] [--vst3] [--lv2] [--kind <k>] # scaffold into an existing empty dir
cargo aura add <name> [--vst3] [--lv2] [--kind <k>] # add another plugin under plugins/<name>/
cargo aura add-ui <name> # shared Slint UI crate under crates/<name>/
cargo aura build [--clap|--vst3|--lv2] [--release] [-plug <crate>…]
cargo aura install [--clap|--vst3|--lv2] [--release] [--hot] [-plug <crate>…]
cargo aura watch [--clap|--vst3|--lv2] [--release] [-plug <crate>…] [--no-install] [--hot]
cargo aura preview [path] [--component N] [--no-watch]
cargo aura run [-plug <name> | path.clap] […] # aura-host: load .clap, audio, MIDI, GUI
cargo aura preset list [-plug <name> | path.clap] # factory presets (discovery)
cargo aura preset pull [-plug <name> | path.clap] --key <K> --out <file>
cargo aura mesh [agal-args…] # run agal orientation mesh
cargo aura doctor # toolchain / AURA_PATH / clap-validatorkinds: effect (default) · effect-mono · analyzer · instrument. CLAP is always on;
--vst3 / --lv2 add the extra format. install --hot writes the aura-hot proxy
(Name.clap + Name.impl.*) so watch can replace DSP under a loaded host.
cargo build --workspace
cargo test --workspace # on non-Linux: --exclude aura-lv2
cargo clippy --workspace --all-targets- Slint + baseview only — renderer is a backend choice (FemtoVG / Skia / software); toolkit is not.
- CLAP first, thin formats — one plugin logic API; VST3/LV2 only on the ship matrix; no format-shaped core.
- Framework layout —
crates/·examples/·tools/(product catalogs keep their own plugins outside AURA). - One CLI:
cargo aura—new,init,add,add-ui,build,install,watch,preview,run,preset,mesh,doctor - KISS for humans and agents —
aura.toml, boring paths; orientation in agal.
| Layer | Name |
|---|---|
| Product name | AURA |
| Umbrella crate | aura → use aura::prelude::* |
| CLI package | cargo-aura → invoke as cargo aura … |
| Config | aura.toml |
| Crate / tool | Role |
|---|---|
aura |
Umbrella re-exports + features clap / vst3 / lv2 |
aura-core |
PluginLogic, process, buffer, state, host fence |
aura-params + aura-derive |
Params, smoothers, #[derive(Params)] with explicit id = N |
aura-clap / aura-vst3 / aura-lv2 |
Thin format wrappers |
aura-baseview + aura-editor + aura-build |
Slint window stack + host adapter + @aura widgets |
aura-dsp + aura-midi |
Portable DSP / MIDI helpers |
aura-hot |
CLAP hot-reload proxy (cargo aura watch --hot) |
aura-host |
Standalone dev host — load .clap, MIDI in, params, plugin GUI (CLI + Slint shell) |
lx-aura-test (aura_test) |
State round-trip + process smokes ([dev-dependencies]) |
cargo-aura |
Scaffold, build, install, watch, doctor, preview, run, mesh |
aura-preview |
Slint UI preview (cargo aura preview) |
Cross-plugin shared-memory IPC (spectrum/relay + CV) moved out of AURA — it now lives in the product catalog as
lx-shm(lx-audiolabs-dev).
use aura::prelude::*;
#[derive(Params)]
pub struct GainParams {
#[param(id = 1, name = "Gain", range = "linear(-24, 24)", default = 0.0, unit = "db")]
pub gain: FloatParam,
}
pub struct MyGain;
pub struct DspState;
impl PluginLogic for MyGain {
type Params = GainParams;
type DspState = DspState;
fn info() -> PluginInfo { /* clap_id, vst3_id, … */ }
fn process(
_ctx: &mut PluginContext,
params: &GainParams,
_state: &mut DspState,
buf: &mut AudioBuffer,
_pc: &ProcessContext,
) -> ProcessStatus {
// realtime-safe DSP here
ProcessStatus::Continue
}
}
#[cfg(feature = "clap")]
aura::export!(MyGain);Param IDs are required and wire-stable — reordering fields does not renumber automation.
More detail: crate docs (cargo doc -p aura --open), docs/versioning.md, docs/dsp-layout.md, docs/aura-host-idea.md, crates/aura-clap/README.md.
| Area | State |
|---|---|
PluginLogic + #[derive(Params)] |
done |
| CLAP process / params / state / GUI | done (Bitwig host smoke) |
| Sample-accurate automation + mono mod | done |
| Sidechain (one optional bus) + MIDI I/O | done |
| Aux out (one optional bus) | done (BusLayout::with_aux, smoke-aux) |
| Latency / remote-controls / tail / render | done |
| VST3 (Win/mac) | done (host smoke) |
| LV2 (Linux) process + UI extension | done (UI host smoke depends on host) |
| crates.io publish | last — after framework test pass; path/git only until then |
clap.preset-load + factory discovery |
done (factory_presets) |
| Poly mod / note expression | done (CLAP → ProcessContext.notes; NoteVoiceTable + NOTE_END) |
| Native MIDI 2 process | done (ProcessContext.ump / ump_out; 7-bit midi remains) |
| notes_out / arp-seq path | done (CLAP native; VST3/LV2 map On/Off/Choke) |
aura-host standalone dev host |
done (CLI + Slint shell; MIDI in, params, plugin-GUI embed) |
Changelog: CHANGELOG.md. Releases are tagged vX.Y.Z.
Issues and PRs welcome on this framework repo.
- Keep the scope (Slint + CLAP-first ship matrix). Do not add AU/egui/AAX “just in case.”
- Prefer small, tested changes. One assert for non-trivial logic.
- Match workspace versioning: single version in root
Cargo.toml+CHANGELOG.md. - CI: Framework (build/install smokes per OS matrix) + Quality (fmt, clippy, tests).
cargo fmt --all
cargo test --workspace
cargo clippy --workspace --all-targetsaura-dsp draws ideas from:
| Project | Link | Notes |
|---|---|---|
| naad (rust-old) | MacCracken/naad | DSP graph / Faust-like ops |
| fundsp | SamiPerttu/fundsp | Composable / SIMD-friendly AudioUnit graphs |
| infinitedsp | infinitedsp | Typed compile-time DSP graphs |
Also: truce, CLAP, Slint, and the Rust audio community.
Copyright © 2026 LX Audiolabs
This project is free software under the GNU General Public License v3.0 or later.
Distributing plugins that link AURA implies GPL obligations for that combined work. Selling with source is fine; closed-only ships are not the goal.
Third-party notes (including Slint triple license — default ship path GPLv3):
docs/licensing-compliance.md.