SUPERB

Remaining work

What Superb does not do yet, and the order to build it in. This is the one list: README.md and docs/ARCHITECTURE.md link here instead of keeping their own. What works today is in the README's status section and CHANGELOG.md. Each primitive's page under docs/primitives/ ends with the limits of that module alone.

Last updated: 2026-11-11.

Build order

Each step says why it sits where it does. A step is done when it has a flow verb with a "Made of:" line, a reference note in scripts/reference.py, a page or a row in docs/, an example, and, on the audio path, a no-alloc test.

#whatwhy here
1Inserts on rebuild, then the plugins flowThe memory stores a track's inserts and build_mixer ignores them, so nothing stored as an insert is ever heard. Begin with the built-in dynamics as inserts (no FFI), then CLAP. Decide here how a plugin instance outlives a rebuild.
2Automation in the memory, with a flowEnvelopes exist as primitives, but the memory owns no lanes. Automation needs insert parameters as targets, so it follows step 1.
3Incremental mixer updatesA rebuild replaces the whole mixer. Today that costs a meter reset; once plugins exist it cuts their tails and builds them again on every clip drag.
4Duplex streams, and MIDI on the audio clockHardware MIDI lands at block resolution, which is timing error in every MIDI recording. Input and output run as two streams on two clocks.
5Loop recordingBuilds on the recording that exists. Needs a model for recordings stacked on one range, and a word for them: TERMINOLOGY reserves "take".
6MIDI ports per track, then Standard MIDI FilesEvery connected port feeds every track today. Files are the way MIDI moves between programs. SysEx and MIDI Time Code are rarer and come last.
7Encoders other than WAV, with ditherBouncing to 16-bit truncates without dither. Any encoder has to pass the licence rule in CONTRIBUTING.
8VST3, then ARA 2The largest and the most constrained by licence. ARA 2 needs a plugins flow and VST3 first; see ARA2_DESIGN.md.

Everything not built

Plugins and inserts

itemstatenotes
Stored inserts loaded on rebuildnot startedInsert and its commands are in primitives::session; Mixer::add_insert is in primitives::mixer; session::steps::build_mixer does not join them.
Plugins flownot startedScan, load, place on a track or bus, parameters, presets and state. The host is primitives::plugins (CLAP).
Instrument plugins on MIDI tracksnot startedA monitoring MIDI track gets MonoSynthNode, a stand-in.
VST3 hostingstubprimitives::plugins::vst3 returns unsupported(). The SDK's licence terms have to be reviewed first (CONTRIBUTING).
ARA 2shelved, design onlyARA2_DESIGN.md.

Mixer and engine

itemstatenotes
Incremental mixer updatesnot startedClip gain, fades and mute rebuild the whole mixer; so does every undo, even of a fader.
Pan law in the memorynot startedA pan law is set on the live strip. A rebuild carries it over, but it is not saved.
Multi-bus and sidechain nodesnot startedA node has one input bus and one output bus.
Flows for the dynamicsprimitives onlyCompressor, limiter, gate, de-esser and leveler are nodes; they become reachable as inserts in step 1.
Flow for analysisprimitives onlyexport::stems reports loudness; the meters are otherwise yours to call.

Automation

itemstatenotes
Lanes owned by the sessionnot startedprimitives::automation has envelopes and modes; the memory stores none, per track or per clip.
Automation flownot startedAdd and edit points, modes, write from a moving control.

Tempo and time

itemstatenotes
Hardware MIDI on the audio clocknot startedprimitives::midi::input takes the backend's timestamps as they are.

MIDI

itemstatenotes
A port per tracknot startedA track chooses a channel (track::midi_channel), not a port.
Disconnecting an inputnot startedmidi::connect_input has no counterpart; the bridge closes when removed from Session::midi_inputs.
Standard MIDI Filesnot startedImport and export, through the tempo map.
SysExnot startedMessages are fixed-size on the audio path.
MIDI Time Codenot started

Recording

itemstatenotes
Loop recordingnot startedPunch in and out exist.

Devices

itemstatenotes
Duplex streamsnot startedInput and output are separate streams; a recording lines them up by the device clock.

Files

itemstatenotes
Encoders other than WAVnot startedWriting is WAV only.
Dithernot startedBounce defaults to 16-bit PCM, Stems to 24-bit.

The API itself

Found in review, not features. Each breaks a rule in CONTRIBUTING's "Naming".

itemnotes
session::set_tempo, session::set_loopSetters are nouns without set_.
send::enable, metronome::enableEvery other switch is the noun with on: track::mute(.., on).
The noun "take"In record docs and TERMINOLOGY itself; the word is reserved.
mixer/console.rs, "console" in io::cacheThe word is "mixer".
TrackSend::pre_fader: boolSendTap exists; the memory should carry the enum.
commands::set_track_mute, solo, arm, monitorState never enters the undo history, yet these are undoable commands.
SuperbError::Message(String)Used over a hundred times; an application cannot tell "no such device" from "file missing", and I/O errors lose the path.
src/record.rs2,300 lines: flow, capture, files and recovery in one file.

How to build any of it

  • Flows are free functions over &mut Session. Edits go through the undo history; state goes through session::set_state and never does.
  • prepare may allocate, process never does. Until step 3, structure changes by building a whole mixer and swapping it in.
  • Hardware and codecs stay behind features, off by default.
  • Docs, example and tests land with the code. docs/flows/<flow>.ref.md is generated; every example in the Markdown is compiled by cargo test --doc --features hardware,files.

On this page