# Kolmekivi A stereo delay/echo plugin — Rust, CLAP/VST3, egui. Scaffolded from [`musiikki/nih-plug-template`](http://192.168.2.199:3005/musiikki/nih-plug-template); the DSP is not written yet, the plugin currently passes audio through an example gain stage. ## Quick Start ```bash git clone http://192.168.2.199:3005/musiikki/kolmekivi cd kolmekivi cargo xtask bundle kolmekivi --release --features vst3 ``` ## Branding Identity lives in `tools/branding.conf`; `sh tools/check-branding.sh` asserts every copy of it agrees, and CI runs that on each push. To rename the plugin, use `sh tools/brand-plugin.sh` — it derives the package and type names, refuses to move the frozen `CLAP_ID`/`VST3_CLASS_ID` without `--allow-identity-change`, and verifies itself with the checker afterwards. The toolkit and the reasoning behind it live in [`musiikki/nih-plug-template`](http://192.168.2.199:3005/musiikki/nih-plug-template). The repository keeps the name `kolmekivi` even if the plugin is renamed — that is the development codename, fixed at creation. ## Build ```bash # Install Rust via rustup: https://rustup.rs # No VST3 SDK needed — NIH-plug bundles its own bindings. # Build + bundle the CLAP (default) cargo xtask bundle kolmekivi --release # Add the VST3 as well — see the licensing note below before you do this cargo xtask bundle kolmekivi --release --features vst3 ``` **Output:** `target/bundled/.clap` (and `.vst3` with `--features vst3`), where `` is the `name` set in `bundler.toml` — **not** the crate name. Out of the box that means `target/bundled/Kolmekivi.clap`. On Linux the egui editor needs the GUI development headers: ```bash sudo apt install pkg-config libgl-dev libx11-dev libxcursor-dev libxcb1-dev \ libxcb-icccm4-dev libxcb-dri2-0-dev libx11-xcb-dev libxkbcommon-dev libxkbcommon-x11-dev ``` ## Deploy ### FL Studio Build with `--features vst3` first if you want the VST3 (see the licensing note below). FL Studio scans `C:\Program Files\Common Files\VST3` by default, **ignores directory junctions** (so a symlinked bundle is invisible to its scanner), and caches failed scans. 1. Copy the `.vst3` bundle to a folder FL scans (e.g. `C:\Program Files\Common Files\VST3`). 2. Copy the `.clap` bundle to a folder FL scans (e.g. `C:\Program Files\Common Files\CLAP`). 3. In FL Studio: **Options → Manage plugins → tick "Rescan previously failed plugins" → Find installed plugins**, then search for your plugin name (set in `bundler.toml`). ### Linux ```bash # CLAP cp -r "target/bundled/Kolmekivi.clap" ~/.clap/ # VST3 (only exists if you built with --features vst3) cp -r "target/bundled/Kolmekivi.vst3" ~/.vst3/ # Or globally: # sudo cp -r "target/bundled/Kolmekivi.clap" /usr/lib/clap/ # sudo cp -r "target/bundled/Kolmekivi.vst3" /usr/lib/vst3/ ``` ## Project Structure ``` Cargo.toml # Package deps + the opt-in `vst3` feature — NIH-plug pinned to codename-206's rev bundler.toml # Bundle name for `cargo xtask bundle` src/lib.rs # Plugin skeleton — params, DSP, and egui editor, with one example gain param xtask/ # Bundler xtask (cargo xtask bundle) .cargo/config.toml # xtask alias tools/ # Branding toolkit — see Renaming .gitattributes # Pins *.sh to LF so Windows checkouts keep a valid shebang .github/workflows/ # CI: branding check, both feature sets build, test, bundle ``` ## CI `.github/workflows/ci.yaml` gates pushes and PRs on the branding check, a build of both feature sets, `cargo test`, and a bundle — enough to catch a rename that only half-landed, a `cfg(feature = "vst3")` gate that stopped compiling, or a `bundler.toml` that no longer matches the crate name. It targets `runs-on: rust-audio`, an **org-scoped** runner label. A plugin cloned into a different org will not see that runner and its jobs will queue indefinitely rather than fail — register a runner advertising the label for that org, or change `runs-on`. Deliberately not covered: plugin performance. Realtime cost can only be measured meaningfully against a real audio deadline, and `Plugin::process()` cannot be called from a test at all (`ProcessContext` requires a `Transport`, whose constructor and fields are `pub(crate)` to nih-plug). Benchmark your DSP types directly if you need it. ## License **GPL-3.0-or-later.** See `LICENSE` for the terms and `NOTICE` for third-party attribution. Plugins cloned from this template inherit GPL-3.0-or-later, because the template's own code is under it. If you need a permissive plugin, this is the wrong starting point — write the skeleton yourself against NIH-plug directly, which is ISC. Parts of `src/lib.rs` derive from Robbert van der Helm's NIH-plug cookiecutter template and `gain` example, both ISC. ISC is GPL-compatible, so that notice is retained in `NOTICE` rather than superseded. ## VST3 and Steinberg `vst3-sys`, which `nih_export_vst3!()` needs, is GPLv3-or-later — chosen by its own authors, who describe their port as a derivative of Steinberg's SDK that "was not made in isolation." That obligation is what makes a distributed VST3 build GPL-licensed, and it holds regardless of any question about Steinberg's own rights. Being GPL-3.0-or-later already, this template satisfies it. No Steinberg SDK source is vendored or redistributed here, so there is nothing to accept at build time. Separately from copyright, **"VST" is a trademark of Steinberg Media Technologies GmbH**; describing a distributed product as a VST plugin is governed by their trademark terms. If you intend to distribute commercially under that name, that is the part worth legal advice. CLAP carries none of this — no GPL dependency and no trademark encumbrance.