Skip to content

Repository files navigation

AURA

License Rust CI Slint agal

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.


Scope (hard)

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

Slint + baseview (always)

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

CLAP first (formats)

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.

Looking for egui, iced, AU, or every-format-everywhere?

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.


Quick start

# 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 mesh

In-repo smoke examples

Prove 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

UI preview (no DAW)

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 reload

CLI reference

cargo 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-validator

kinds: 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.

Build / test the framework

cargo build --workspace
cargo test --workspace          # on non-Linux: --exclude aura-lv2
cargo clippy --workspace --all-targets

Design principles

  1. Slint + baseview only — renderer is a backend choice (FemtoVG / Skia / software); toolkit is not.
  2. CLAP first, thin formats — one plugin logic API; VST3/LV2 only on the ship matrix; no format-shaped core.
  3. Framework layoutcrates/ · examples/ · tools/ (product catalogs keep their own plugins outside AURA).
  4. One CLI: cargo auranew, init, add, add-ui, build, install, watch, preview, run, preset, mesh, doctor
  5. KISS for humans and agentsaura.toml, boring paths; orientation in agal.

Workspace map

Layer Name
Product name AURA
Umbrella crate aurause 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).


Author surface (minimal)

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.


Status & maturity

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.


Contributing

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-targets

Acknowledgments

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


License

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.

About

Audio Unified Rust Architecture — CLAP-first plugin framework. Slint UI + baseview, CLAP/VST3/LV2. GPL-3.0+.

Topics

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Contributors

Languages