Manguebyte

Roadmap

What exists and what is planned

Manguebyte aims to become the complete equivalent of JUCE for Rust. That is years of work, so it is split into phases, and each phase leaves the framework useful for a wider set of projects than the one before.

Nothing here is a promise or a schedule. It is a statement of direction, and it changes as people show up and build things. If an item interests you, open an issue and say so.

  • Done
  • In progress
  • Not started

Phase 0: foundation (v0.1)

The types everything else is built on, and enough around them to make sound.

6 of 6 done
  • manguebyte-core: AudioBuffer, Sample, Smoothed, atomic floats, wait-free SPSC queue, decibel conversions
  • manguebyte-dsp: Processor trait, compile-time tuple chains, band-limited oscillator, biquad filters, ADSR, delay line and echo, gain
  • manguebyte-midi: channel voice messages, sample-accurate MidiBuffer
  • manguebyte-formats: WAV reading and writing
  • manguebyte-devices: playback on the default output device
  • manguebyte: facade crate and prelude

Phase 1: a complete audio toolbox

Everything a standalone audio application needs, short of a user interface.

45 of 56 done

Devices

  • Audio input and full-duplex streams
  • Device enumeration and selection; choosing sample rate and buffer size
  • Hot-plug and default-device change notifications
  • Clock-drift compensation between duplex devices by adaptive resampling (the resampler it needs now exists)
  • Choosing the audio host (ASIO, JACK, PipeWire)
  • MIDI input and output ports, with jitter-free timing into the audio thread

MIDI

  • System common, system real-time and SysEx messages
  • Running status and a byte-stream parser
  • Standard MIDI File reading and writing, with tempo-aware timing
  • MIDI 2.0: Universal MIDI Packets with every message type, and MIDI 1.0 to 2.0 translation as the specification prescribes
  • RPN and NRPN, MPE zones, channel allocation and per-note tracking, and a keyboard state an interface can read while the audio thread writes
  • MIDI 2.0 and MPE delivered to processors as per-note events, and through the device and plugin layers

DSP

  • FFT of any length, real FFT and window functions
  • Spectrum analysis: short-time Fourier transform with any size, hop and window, ballistics, peak hold, fractional-octave bands, A and C weighting
  • Overlap-add resynthesis for spectral processing
  • Resampling at any ratio, and oversampling by 2, 4, 8 or 16
  • State-variable filter, stable under audio-rate modulation
  • FIR low-pass design (Kaiser-windowed sinc)
  • One-pole and ladder filters, stable under audio-rate modulation
  • High-order IIR design: Butterworth, Chebyshev I and II, elliptic, order 1 to 16, gliding between designs without blowing up
  • Linkwitz-Riley crossovers, 2 to 5 bands that sum flat
  • FIR filter processor, choosing direct or FFT convolution by length
  • Dynamics: compressor with soft knee, noise gate
  • Look-ahead limiter whose ceiling holds for every sample
  • Expander, and sidechain keying for the compressor, gate and expander, chosen per processor
  • Reverb (feedback delay network)
  • Chorus and flanger, phaser, dry/wet mixing with latency compensation, panner, envelope follower, interpolated delay lines
  • Convolution: uniformly partitioned, with zero latency or a latency of one partition, true stereo, and responses swapped with a crossfade while playing. A non-uniformly partitioned scheme, cheaper for long responses at small block sizes, is not started
  • Noise (white, pink, brown), LFO with tempo sync, waveshaper, DC blocker
  • Wavetable oscillator: band-limited by a mip-map, with morphing between frames and phase modulation
  • Sampler: an SFZ player (manguebyte-sampler): multisamples, velocity layers, round robin and random layers, loop points with crossfades, release triggers, choke groups and polyphony limits, from files or from memory, in WebAssembly too, open so that any program can play the instruments Parabolic exports. Samples are loaded whole, not streamed from disk; filters, LFOs, modulation by controllers and keyswitches are not started
  • Polyphonic voice allocation with per-note expression and modulation, accents and legato slides
  • Instruments: physically modelled plucked strings (guitars and basses), four-operator FM, a tonewheel organ with a rotary speaker, the drums and kick bass of the classic analogue drum machine, and an acid bass; each a Voice with presets, measured for tuning, decay, velocity and accent
  • Drum kits: acoustic drums and cymbals by modal synthesis, calibrated against recordings of a real snare and crash; the 909, 606, CR-78 and 808; kits for trap, techno, house, drum and bass and lo-fi
  • Metering: loudness to ITU-R BS.1770 and EBU R 128 (checked against the EBU’s test signals), true peak, peak, RMS, VU, PPM, stereo correlation
  • Pitch detection (YIN and the McLeod method) with note naming
  • Sample-accurate events, transport and sidechain in the process call
  • SIMD-accelerated buffer operations

Formats

  • Streaming readers and writers that do not load whole files, with sample-exact seeking, RF64, and wait-free bridges for playing and recording from an audio callback
  • AIFF and AIFF-C reading and writing
  • FLAC decoding
  • Recognising a file’s format from its contents
  • Ogg Vorbis and MP3 decoding, gapless and with exact seeking
  • Opus decoding
  • FLAC encoding, checked against FFmpeg
  • Ogg Vorbis encoding
  • Metadata, cue points and loop markers

Networking

  • Open Sound Control: codec, address patterns, UDP and TCP, and a real-time bridge that puts time-tagged bundles on their exact frame

Core

  • Parameter system: ranges, skew, text conversion, smoothing
  • Sample-accurate parameter automation events
  • Change gestures (begin and end of a user edit): a Gesture guard in the editor contract, sent to CLAP hosts as gesture events and to VST 3 hosts as beginEdit, performEdit and endEdit
  • Parameter state save and restore, tolerant of version changes
  • Parameter descriptions as data and as JSON (range, curve, steps, names, smoothing), for editors outside Rust such as Aratu’s
  • Denormal protection: NoDenormals, held by the wrappers, the standalone engine, the device streams and the test harness
  • Allocation checking in debug builds (today it is a test-only allocator)
  • no_std support for manguebyte-core and manguebyte-dsp

Phase 2: plugins

Write a processor once and ship it in every format.

4 of 11 done
  • manguebyte-plugin: the format-independent plugin API, plugin state, and a harness that runs a plugin in a unit test with no host
  • CLAP: audio and note ports, sample-accurate events in, parameters, state, latency, reporting of parameter changes to the host. Checked in CI by the CLAP project’s validator
  • CLAP gui, timer-support and posix-fd-support for plugins with an editor, tested through the C interface against fake editors and hosts, including manguebyte-gui editors in a headless window; not yet opened in a real host
  • CLAP extensions still to come: per-note automation, note-end and voice info, 64-bit audio, tail, presets, remote controls
  • VST 3: audio and event buses, every automation point on its frame, notes with ids, tuning and note expression, the MIDI controllers a plugin declares through hidden parameters, parameters, units, state, latency. Checked in CI by Steinberg’s validator on Windows, Linux and macOS
  • VST 3 editor interfaces: the component handler kept and used for edits, IPlugView with content scale, showing the editor once attached, IPlugFrame and IRunLoop, tested against fake host objects, including manguebyte-gui editors in a headless window; not yet opened in a real host
  • VST 3 still to come: 64-bit audio, changing the bus layout, program lists
  • Audio Unit (AUv2 and AUv3)
  • LV2: audio and sidechain ports, parameters as control ports, MIDI and transport on their frames, state, latency and generated Turtle files, tested in process through the C interface; .lv2 bundles written by cargo mangue bundle --format lv2, and the examples’ found and read by lilv in CI. Not yet checked by lv2lint or run in a host; no editor
  • Standalone application wrapper: sound card, MIDI ports, input for effects
  • Tooling: cargo mangue bundles (CLAP, VST 3 and LV2), installs and validates plugins and creates new plugin crates from templates; macOS bundles get an ad-hoc signature and universal binaries. Signing with a real identity and notarisation are not started, and there is no LV2 validator in it

AAX depends on a proprietary SDK and will be considered once the other formats are solid.

Phase 3: user interface

An editor contract in the plugin API, rendering on the CPU first, a thin window layer of the framework’s own, and nothing claimed before its test exists.

2 of 8 done
  • Editor contract and parameter gestures in the plugin API and both wrappers, each tested through the format’s real interface against fake hosts
  • 2D renderer on the CPU (manguebyte-gfx): paths, gradients, images, clips, layers, a columns primitive for meters and spectra, damage-limited repaint that matches a full repaint bit for bit, and text with an embedded Inter subset. GPU rendering later, never the default while CI cannot test its pixels
  • Windowing, including embedding inside a plugin host: Win32 child windows inside a host’s window and a headless backend for tests (manguebyte-window), and the glue that opens an editor in them (manguebyte-gui), tested on Windows, with two plugin binaries’ editors open in one process; macOS and Linux follow as CI proves each
  • Editors for the example plugins: Mangue Duck’s (knobs, a bypass switch and a gain-reduction meter) and Mangue Pluck’s (a knob for each parameter), tested headless and in real Win32 windows; not yet opened in a host by hand
  • Layout, styling and a widget set (manguebyte-ui): row, column and stack layout, theme tokens, label, knob, slider, toggle, meter and canvas done; text entry (a text field, and values typed into knobs and sliders, with the clipboard), popup menus with submenus, a combo box, hover and tooltips done; drag and drop, scrolling and lists not started
  • Audio widgets: waveform, spectrum, keyboard, envelope and EQ editors
  • Accessibility: every widget describes itself (the method has no default) and the test harness finds widgets only that way; platform adapters not started
  • High-DPI: scale flows from the host through the contract to the renderer, and a Win32 window takes the system’s scale when the host gives none; a change of scale while a window is open is handled but untested

Phase 4: hosting and graphs

The graph and the hosting of CLAP and VST 3 plugins are done. Scanning and hosted plugins’ editors are not started.

2 of 5 done
  • Audio processing graph, rewired while it plays, with automatic latency compensation
  • Graph extras: sidechain and per-node event routing, feedback through an explicit delay, crossfaded swaps, buffer reuse
  • Hosting CLAP and VST 3 plugins as processors, through one interface for both formats, with every event on its frame
  • Plugin scanning (out of process), hosted plugins’ editors, AU and LV2
  • Transport, tempo map and timeline primitives

Phase 5: everywhere

The browser engine is under way; mobile and embedded targets are not started.

0 of 3 done
  • iOS and Android
  • WebAssembly and Web Audio: manguebyte-web, an engine in a browser’s AudioWorklet, fed 32-byte timestamped records through a shared-memory ring, with a synth, a drum kit, an SFZ sampler, the instruments of manguebyte-dsp, thirteen effects and a master bus with a true-peak limiter; tested natively and in Node.js, not yet under load in a browser. Aratu plays on it
  • Embedded targets

Beyond parity

Matching JUCE is the baseline, not the finish line. These are the places where a framework designed for Rust can do better. They are goals: what is already proven has its own page.

  • Compile-time checked real-time safety for user code
  • Processing graphs that the compiler can inline end to end
  • Deterministic offline rendering for testing audio code in CI
  • First-class CLAP support, including its newer extensions
  • A plugin API in which sharing state between threads incorrectly does not compile

Against JUCE, module by module

JUCE 9.0.4 has 24 modules. Parity means the same capability, not the same classes: where Rust or its ecosystem already solves something well, the plan is to not rebuild it. JUCE_PARITY.md explains every row.

JUCE module Manguebyte crates Status
juce_audio_basics core, midi, dsp, sampler In progress
juce_audio_devices devices In progress
juce_audio_formats formats In progress
juce_audio_processors params, plugin, host, graph In progress
juce_audio_processors_headless params, plugin, host, graph Done
juce_audio_plugin_client clap, vst3, lv2, standalone In progress
juce_audio_utils Not started
juce_dsp dsp In progress
juce_midi_ci Not started
juce_osc osc Done
juce_graphics gfx In progress
juce_gui_basics ui, window, gui In progress
juce_gui_extra Not started
juce_animation Not started
juce_opengl Not started
juce_video Not planned
juce_core core Not planned
juce_events Not planned
juce_data_structures Not started
juce_cryptography Not planned
juce_javascript Not planned
juce_box2d Not planned
juce_analytics Not planned
juce_product_unlocking Not planned

This page follows ROADMAP.md and docs/JUCE_PARITY.md at commit c5835bf. One item follows the README instead, which is newer: ROADMAP.md still lists Ogg Vorbis and MP3 decoding as not started, while the README and the changelog say both are read.