Kadenz

A digital audio workstation written from scratch in Rust. The workflow is a deliberate hybrid: the linear arrangement of Ableton Live next to the pattern playlist of FL Studio, both first class over the same clip and pattern objects rather than two modes.

Built for cinematic scoring, which means expression maps, CC lanes, huge templates and first-class CLAP and VST3 hosting, with Kontakt treated as a case that has to work rather than one that happens to.

26 crates, 212 source files, about 48 000 lines. Windows first, with all platform code isolated in three crates. Milestone one is largely done: audio core, MIDI, a built-in synth, plugin hosting and a working editor that makes sound.

Source on GitHub

The arrangement during playback: tracks with clips along the timeline, the mixer below. The piano roll with notes on the grid and the keyboard along the left edge. The channel rack with the project channels and their controls.

What works today

Audio

An own WASAPI backend on IAudioClient3, no third-party audio library. Sixty seconds at 128 frames without a single xrun. Playback from the GUI runs at 48 kHz and 512 frames at 1.6 per cent callback load. The offline render uses the same graph as realtime and is 74 to 80 times faster.

Graph and document

The audio graph compiles topologically, with plugin delay compensation, buffer-slot reuse and a parallel executor. Output is bit-identical for one, four and eight workers. The document model works with invertible edits and a transactional undo that coalesces. A property test throws random edit sequences at it and checks that they undo exactly.

Plugin hosting

CLAP through a full adapter over clack. For VST3, eight host-implemented COM objects, bus negotiation and two-chunk state. Scanning runs out of process, so a plugin that crashes or hangs is isolated and blocklisted. Plugin state is content-addressed, which is why a 500-track template opens without reading a single state blob.

Editor

A dock with arrangement, piano roll, channel rack, browser, inspector and mixer, all drawn on GPU canvases. The project format is a JSON folder with atomic save and autosave. MIDI input across five enumerated hardware ports, and a played note sounds through the synth even while the transport is stopped.

Measured, not estimated

Every value measured on the development machine, a Ryzen 3700X with an RTX 3060 Ti and a Focusrite audio interface.
QuantityValue
Callback load during playback1.6 % at 48 kHz and 512 frames, 0 xruns
Sustained run at 128 frames60 s, 0 xruns
Offline render74 to 80 times faster than realtime
Editor at 211 tracks and 5300 clips5.8 ms per frame
VST3 modules scanned186
Parameters in Kontakt 84145, in Vital 2852
Tests in the workspace294, plus 15 behind the plugin feature
Size26 crates, 212 files, about 48 000 lines

Clippy runs clean with -D warnings, and so does rustfmt.

Two mistakes that cost a lot

The editor made no sound at all. The application used a fake engine, documented in its own source as a wall-clock transport with no audio, and the binary did not even depend on the engine crate. The transport counted up, the meters wiggled, and nothing ever reached the sound card. The engine itself had been fine the whole time; on the command line it had been playing the same project for days. The lesson: an engine that cannot open its device must be able to say so in the status bar, because silence with no explanation is indistinguishable from a quiet project.

Every edit reloaded every plugin. A plugin may have only one active processor, and the running graph owns it while the next graph is being built. So each rebuild instantiated every plugin again. For a sampler that means re-reading its library from disk, which made editing a project with a large Kontakt instrument useless.