Skip to content

Repository files navigation

danzig

CIZig

A VST3 plugin framework in pure Zig. No JUCE, no Steinberg SDK, no C++ in the core. src/vst3.zig implements the VST3 C ABI directly as extern structs of callconv(.c) function pointers, which is what a C++ vtable is at the machine level.

Read the guide: docs/WIKI.md

Setup

git clone https://github.com/godofecht/danzig
cd danzig
./setup.sh

setup.sh checks your Zig version, builds, runs the tests, packages the universal VST3 bundle, and prints where it landed. It exits non-zero on failure and is safe to run repeatedly. Pass --release for a ReleaseFast build.

By hand:

zig build # Build Summary: 29/29 steps succeeded
zig build test --summary all # Build Summary: 9/9 steps succeeded; 35/35 tests passed
zig build vst3 # universal arm64 + x86_64 bundle in zig-out/
zig build install-vst3 # copy it to ~/Library/Audio/Plug-Ins/VST3/

Then:

lipo -info zig-out/DanzigGain.vst3/Contents/MacOS/DanzigGain
Architectures in the fat file: zig-out/DanzigGain.vst3/Contents/MacOS/DanzigGain are: x86_64 arm64

Requirements

  • Zig 0.14.1 or 0.15.2. Both are tested in CI on every push.
  • macOS for the VST3 bundle, install-vst3, and the GUI example. The library, the unit tests, and the CLI examples are portable Zig.
  • Xcode command line tools, for lipo and the macOS SDK.

What's here

Core library (src/)

FileContents
vst3.zigThe VST3 C ABI: IUnknown, IPluginBase, IComponent, IAudioProcessor, IEditController, and the structs they pass.
plugin.zigPlugin lifecycle and a heap-backed ParameterMap.
audio.zigdBToLinear, GainProcessor, SimpleRamp, AudioBuffer.
params.zigLock-free AtomicParam and ParamStore(N). One cache line per parameter, no heap, no locks.
tests.zig35 unit tests.

Examples (examples/)

ExampleRun it
danzig-minimal. The smallest complete plugin, and the file to copy.zig build run-minimal
danzig-gain. The plugin packaged into the .vst3 bundle.zig build vst3
danzig-test. Drives the built plugin through the raw VST3 C ABI.zig build test-integration
danzig-gain-standalone. Offline WAV gain processing.zig build run-standalone
danzig-webui. An HTTP server in pure std.net../zig-out/bin/danzig-webui
danzig-gain-ui. Native macOS window, WebView plus CoreAudio.zig build run-gui

See examples/README.md for the index.

Build artifacts

zig build installs:

zig-out/
├── bin/
│ ├── danzig-minimal offline demo of the minimal plugin
│ ├── danzig-gain-standalone WAV gain processor
│ ├── danzig-webui HTTP server for the web UI
│ ├── danzig-gain-ui native window (macOS)
│ └── danzig_test VST3 ABI integration harness
└── lib/
├── libDanzigGain.dylib gain plugin, native arch
├── libDanzigGain_arm64.dylib gain plugin, arm64
├── libDanzigGain_x86.dylib gain plugin, x86_64
└── libDanzigMinimal.dylib minimal plugin, native arch

zig build vst3 adds the bundle:

zig-out/DanzigGain.vst3/
└── Contents/
├── Info.plist
├── PkgInfo
└── MacOS/
└── DanzigGain universal arm64 + x86_64

libdanzig.a is not installed. The static library is linked into each target rather than shipped on its own.

Sizes, from zig build -Doptimize=ReleaseFast:

ArtifactSize
DanzigGain.vst3/Contents/MacOS/DanzigGain84 KB (universal)
lib/libDanzigGain.dylib52 KB
lib/libDanzigMinimal.dylib52 KB
bin/danzig-minimal168 KB
bin/danzig-gain-standalone288 KB
bin/danzig-gain-ui572 KB

The default Debug build produces the same artifacts at roughly 1 to 2 MB each.

Current state

The core library, the tests, the build pipeline, the examples, and the VST3 plugin all work. examples/danzig-gain builds a universal .vst3 bundle that a host loads and instantiates, and it passes pluginval at strictness level 5:

pluginval --validate zig-out/DanzigGain.vst3 --strictness-level 5
Num plugins found: 1
Testing plugin: VST3-Danzig Gain
...
SUCCESS

The factory returns a populated PClassInfo, and createInstance builds one object exposing IComponent, IAudioProcessor, and IEditController over a shared lock-free parameter store. See Current state for the detail.

Documentation

Published at godofecht.github.io/danzig.

  • docs/WIKI.md. The single-page guide. Architecture, quickstart, parameters, audio helpers, bundle packaging, testing, troubleshooting.
  • docs/INDEX.md. The older multi-page docs.

Install as a dependency

Fetch danzig into a Zig project:

zig fetch --save git+https://github.com/godofecht/danzig

Then wire the module in your build.zig:

constdanzig=b.dependency("danzig", .{});
your_plugin.root_module.addImport("danzig", danzig.module("danzig"));

Requires Zig 0.14.1, 0.15.2, or 0.16.0.

License

MIT. See LICENSE.

VST is a trademark of Steinberg Media Technologies GmbH. danzig vendors no Steinberg SDK code, and shipping plugins in VST3 format is governed by Steinberg's own terms, independently of danzig's MIT license.

About

VST3 plugin framework in pure Zig — zero dependencies, lock-free params, WebView UI

Topics

Resources

Stars

3 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages