Rust Scope is a transparent, multi-mode music visualizer for Apple Silicon Macs. It passes mono or stereo audio through unchanged and copies the samples into a lock-free atomic ring buffer for display in its egui editor.
The project builds two self-contained desktop plug-in formats from the same Rust code:
- VST3:
Rust Scope.vst3 - Audio Unit v2:
Rust Scope.component
The AU version is intended for Logic Pro, GarageBand, MainStage, and other macOS AU hosts. This is an AUv2 desktop component, not an AUv3 app extension or iOS plug-in.
The editor has fourteen selectable views:
- Mono oscilloscope with peak and RMS readings
- Split left/right stereo waveform
- Peak and RMS meters
- Waveform persistence trails
- Rising zero-crossing triggered oscilloscope
- Circular waveform
- Log-frequency FFT spectrum analyser
- Scrolling spectrogram
- 24 logarithmic frequency-band bars
- Fundamental pitch, musical note, confidence, and cents offset
- Stereo vectorscope/goniometer
- Phase-correlation meter
- Mid/side waveforms and RMS readings
- Stereo-width history
FFT work, pitch estimation, history management, and drawing happen on the GUI thread. The realtime audio callback only copies left and right samples into preallocated atomic arrays. It takes no locks and performs no heap allocation.
- Apple Silicon Mac (
arm64only) - macOS with Apple Command Line Tools
- Current stable Rust
xcode-select --install
rustup update stableRun the commands from a native Apple Silicon Terminal. A Terminal process running under Rosetta reports x86_64 and is intentionally rejected by the installer.
From the project directory:
./install-macos.shThe script:
- Adds the
aarch64-apple-darwinRust target. - Builds the Rust library in release mode for Apple Silicon.
- Uses
clap-wrapperto create self-contained VST3 and AUv2 bundles. - Ad-hoc signs both bundles for local use.
- Installs them to the per-user plug-in folders.
Installed locations:
~/Library/Audio/Plug-Ins/VST3/Rust Scope.vst3
~/Library/Audio/Plug-Ins/Components/Rust Scope.component
The installer replaces older copies of Rust Scope in those two locations. Restart the DAW or run a full plug-in rescan afterward.
rustup target add aarch64-apple-darwin
cargo build --package rust_scope --release --target aarch64-apple-darwin
cargo bundle --auv2-id aufx:Rscp:LRst \
target/aarch64-apple-darwin/release/librust_scope.dylibGenerated bundles:
target/aarch64-apple-darwin/release/Rust Scope.vst3
target/aarch64-apple-darwin/release/Rust Scope.component
target/aarch64-apple-darwin/release/Rust Scope.clap
The .clap bundle is generated because CLAP is the internal implementation used by both wrappers. The install script installs only VST3 and AUv2.
After installation:
auval -v aufx Rscp LRstThe Audio Unit identifier consists of three four-character codes:
Type: aufx
Subtype: Rscp
Manufacturer: LRst
Change these codes before distributing a derivative, while keeping each code exactly four ASCII characters. Changing them causes DAWs to treat the plug-in as a different Audio Unit.
Inspect either installed binary with:
file "$HOME/Library/Audio/Plug-Ins/VST3/Rust Scope.vst3/Contents/MacOS/Rust Scope"
file "$HOME/Library/Audio/Plug-Ins/Components/Rust Scope.component/Contents/MacOS/Rust Scope"Both should report arm64. No Intel or universal slice is built.
- NIH-plug directly supplies the plug-in's CLAP implementation.
clap-wrapperexposes the same implementation as VST3 and AUv2.- RustFFT performs a 4,096-point Hann-windowed FFT on the GUI thread.
- The spectrogram is derived from logarithmically spaced FFT samples.
- Pitch estimation uses normalized autocorrelation on a downsampled recent window.
- NIH-plug's native VST3 feature is disabled; the project uses the permissively licensed
clap-wrapperVST3 bridge.
src/lib.rs: plug-in definition, stereo realtime capture, editor setup, and export entry points.src/visuals.rs: all analysis routines and fourteen visualization renderers.install-macos.sh: Apple Silicon build, bundling, signing, and installation..cargo/config.toml: locks Cargo's target toaarch64-apple-darwin.xtask/:cargo bundlecommand supplied byclap-wrapper-bundler.