Files

134 lines
5.6 KiB
Markdown
Raw Permalink Normal View History

# Kolmekivi
A stereo delay/echo plugin — Rust, CLAP/VST3, egui.
Scaffolded from [`musiikki/nih-plug-template`](http://pi5-16.local:3005/musiikki/nih-plug-template);
the DSP is a simple stereo delay with independent left/right delay lines, feedback, and a wet/dry mix control.
## Quick Start
```bash
git clone http://pi5-16.local:3005/musiikki/kolmekivi
2026-09-04 16:14:21 +09:00
cd kolmekivi
cargo xtask bundle kolmekivi --release --features vst3
```
2026-09-04 16:14:21 +09:00
## Branding
2026-09-04 16:14:21 +09:00
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).
2026-09-04 16:14:21 +09:00
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/<name>.clap` (and `<name>.vst3` with `--features vst3`), where
`<name>` 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 — params, stereo delay DSP, and egui editor
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.