https://github.com/hyperfocusdsp/niner
Monophonic analogue kick drum synthesizer — 3 voices, compression, distortion, EQ. VST3/CLAP/Standalone for Linux, Windows, macOS
https://github.com/hyperfocusdsp/niner
analog audio bass-drum clap-plugin dsp kick-drum linux macos music-production nih-plug rust synthesizer vst-plugin windows
Last synced: 15 days ago
JSON representation
Monophonic analogue kick drum synthesizer — 3 voices, compression, distortion, EQ. VST3/CLAP/Standalone for Linux, Windows, macOS
- Host: GitHub
- URL: https://github.com/hyperfocusdsp/niner
- Owner: hyperfocusdsp
- License: gpl-3.0
- Created: 2026-04-06T12:48:51.000Z (3 months ago)
- Default Branch: master
- Last Pushed: 2026-06-05T20:26:20.000Z (18 days ago)
- Last Synced: 2026-06-05T22:13:31.069Z (18 days ago)
- Topics: analog, audio, bass-drum, clap-plugin, dsp, kick-drum, linux, macos, music-production, nih-plug, rust, synthesizer, vst-plugin, windows
- Language: Rust
- Homepage:
- Size: 16.5 MB
- Stars: 29
- Watchers: 1
- Forks: 1
- Open Issues: 2
-
Metadata Files:
- Readme: README.md
- Changelog: CHANGELOG.md
- License: LICENSE
Awesome Lists containing this project
README
# Niner
> **Formerly known as Slammer.** Renamed in v0.7.0 due to a trademark
> conflict with another product. CLAP/VST3 plugin IDs changed — existing
> DAW projects saved with the old "Slammer" plugin must be re-wired.
A three-layer synthesized kick drum plugin with a parallel 909-style
clap voice. SUB sine, MID sine+noise, and a band-passed click TOP mix
into a five-voice distortion palette, a tilt/low/notch master EQ, and a
full master bus (RMS compressor → transformer drive → brickwall limiter
→ auto tube warmth). Ships with a 16-step pattern sequencer, a factory
+ user preset browser, one-shot WAV/AIFF bounce, and a fully
interactive standalone editor.

**Formats:** VST3, CLAP, Standalone
**Platforms:** Linux, macOS (Apple Silicon + Intel), Windows
**License:** GPL-3.0-or-later
## Listen
▶ **[Play sound samples in your browser](https://hyperfocusdsp.github.io/niner/)**
Ten one-shots bounced straight out of the plugin via the BOUNCE button —
clean kicks, 808/909 emulations, claps, snares, toms, and hats. No
download, just hit play.
## Quick start
Download the latest build for your platform from the
[Releases](https://github.com/hyperfocusdsp/niner/releases/latest) page,
extract, and run the installer:
```bash
# Linux / macOS
./install.sh
# Windows (run as Administrator)
install.bat
```
Rescan plugins in your DAW. Niner appears as **Hyperfocus DSP / Niner**.
## Download
| Platform | File |
|---------------------------|------------------------------------|
| Linux x86_64 | `niner-linux-x86_64.tar.gz` |
| macOS ARM (Apple Silicon) | `niner-macos-arm64.tar.gz` |
| macOS Intel | `niner-macos-x86_64.tar.gz` |
| Windows x86_64 | `niner-windows-x86_64.zip` |
Each archive contains the standalone binary, VST3 and CLAP plugin
bundles, and an install script.
### Verify your download
Every release ships a `SHA256SUMS.txt` file on the
[Releases](https://github.com/hyperfocusdsp/niner/releases/latest) page.
Download it alongside the archive and verify before running:
```bash
# Linux / macOS
sha256sum -c SHA256SUMS.txt
# Windows (PowerShell)
Get-Content SHA256SUMS.txt | ForEach-Object {
$hash, $file = $_ -split '\s+'
$actual = (Get-FileHash $file -Algorithm SHA256).Hash.ToLower()
if ($actual -eq $hash) { "$file OK" } else { "$file FAILED" }
}
```
You can also upload the archive to [VirusTotal](https://www.virustotal.com/gui/home/upload)
for a third-party scan before running — niner is unsigned open-source
software, so extra caution is welcome.
## macOS setup — step by step
The binaries are **not codesigned or notarized**, so macOS will block
them on first launch. Here's the complete boomer-friendly walkthrough:
### 1. Extract the archive
Double-click the `.tar.gz` file in Finder — macOS extracts it
automatically into a folder next to the archive. Or, if you prefer
Terminal:
```bash
cd ~/Downloads
tar xzf niner-macos-arm64.tar.gz
cd niner-macos-arm64
```
### 2. Remove the quarantine flag
macOS marks every downloaded file as untrusted. You need to clear that
flag on everything inside the extracted folder. Open Terminal, `cd` into
the folder, and run:
```bash
xattr -dr com.apple.quarantine .
```
(The dot at the end is important — it means "this folder and
everything in it".)
### 3. Run the standalone
Use the included launch script — it configures the audio buffer size so
CoreAudio plays nicely with nih-plug's backend:
```bash
./niner-macos.sh
```
If macOS still blocks the binary after you've removed the quarantine
flag, open **System Settings → Privacy & Security**, scroll to the
bottom, and click **Open Anyway** next to the Niner warning. You
only need to do this once; future launches will go straight through.
### 4. Install the plugins for your DAW
Copy the VST3 and CLAP bundles into the standard macOS plugin
locations:
```bash
cp -r niner.vst3 ~/Library/Audio/Plug-Ins/VST3/
cp -r niner.clap ~/Library/Audio/Plug-Ins/CLAP/
```
Then rescan plugins in your DAW.
**Note on the launch script:** `niner-macos.sh` starts the standalone
with `--period-size 4096` to work around a CoreAudio variable-buffer
issue in nih-plug's CPAL backend
([upstream bug](https://github.com/robbert-vdh/nih-plug/issues/266)).
This adds slight latency in standalone mode only. VST3 and CLAP running
inside a DAW are unaffected.
**Audio Unit (AU) is not supported.** Most macOS DAWs (Ableton Live,
Bitwig, REAPER, Renoise, FL Studio) support VST3 or CLAP. Logic Pro is
AU-only and will not see Niner.
## Features
### Signal chain
```
SUB + MID + TOP voices (+ parallel CLAP voice)
→ per-voice saturation (5-mode palette)
→ master EQ (tilt / low shelf / notch)
→ master bus (RMS comp → transformer drive → brickwall limiter)
→ auto tube warmth (engages above 0 dB master)
→ master volume → out
```
### DSP
- **Three-layer kick engine** — SUB sine with pitch envelope, MID
sine+noise blend, TOP bandpass-filtered click transient. Each layer
has independent tuning, amp + pitch envelopes, and drift.
- **909-style CLAP layer** — parallel voice, white noise → 2-pole SVF
bandpass → baked 3-burst + exponential tail envelope. Tunable
independently of the kick (level, center frequency 500–5000 Hz, tail
50–400 ms). Toggleable; bit-identical bypass when off.
- **Five-voice distortion palette** — each mode is a genuinely
different curve, not just gain+tanh:
- *Sat Clip* — split-band rational hard-shoulder (`x/√(1+x²)`) with
a 60 Hz low-pass bypass that keeps the sub clean.
- *Sat Diode* — asymmetric exponential pair.
- *Sat Tape* — drive-reactive low-pass plus hysteresis memory; the
only mode with dynamic/frequency-dependent behavior.
- *Transformer drive* (master bus) — polynomial 2nd+3rd harmonic
blend with a feed-forward 60 Hz "bloom" filter.
- *Master warmth* — asymmetric cubic bias shaper that auto-engages
above 0 dB master volume; bit-exact bypass below unity.
- **Master bus compressor** — three macros (Amount, Reaction,
Transformer drive) for fast moves, plus a precision strip with
independent Attack (0.3–50 ms), Release (20–800 ms), and soft Knee
(0–12 dB, Reiss & McPherson quadratic). Brickwall limiter LED, GR
meter. RCT acts as a link macro — moving it writes Attack and
Release together via the host parameter API. Knee = 0 is
bit-identical to a hard-knee path.
- **Master EQ** — tilt, low shelf, and variable-Q notch.
- **One-shot bounce** — render the current sound with the full chain
to a 16-bit / 44.1 kHz WAV or AIFF via a dedicated BOUNCE button.
Runs offline on the GUI thread against a fresh DSP instance, so live
audio keeps flowing during the render and the result is bit-for-bit
reproducible.
### UI
- **Single-window editor** — 680 × 444 rack panel with aspect-ratio
locked scaling; resize the DAW window and the UI scales without
distortion.
- **Header preset bar** — 7-segment LED display, dropdown browser,
inline rename (double-click to edit), save, delete. Up/Down arrow
keys cycle presets. Factory presets are protected from deletion.
- **16-step pattern sequencer** — four-on-the-floor default, click or
drag to paint steps. Runs standalone with internal transport, or
locks to host tempo and transport inside a DAW.
- **Interactive tempo entry** (standalone only) — single-click the BPM
readout to arm, drag vertically to scrub, double-click to type a
value, or use Left/Right arrows (±10, Shift for ±1). Host-synced
mode keeps the readout read-only.
- **Waveform scope** — live output waveform display fed post-comp, so
the trace visibly shrinks under compression and caps under the
limiter. GR meter sits next to it.
- **Test trigger** — press `T` anywhere in the editor to fire a kick
without MIDI.
- **In-plugin MIDI Learn** — right-click any knob, the BPM, or the PLAY
button to bind a MIDI CC or NoteOn. Three relative-encoder encodings
auto-detected (Absolute, BinaryOffset, Centered) with a manual
override picker. Bindings persist across DAW projects and standalone
sessions.
- **BOUNCE button** — one click renders a single hit, opens a native
save dialog (remembered between bounces), writes WAV or AIFF.
### Persistence
- **Factory + user presets** — stored as forward-compatible JSON with
`#[serde(default)]` on every field, so new parameters in later
versions won't break existing files.
- **Last preset recall** (standalone) — the editor remembers the last
loaded preset and restores it on next launch.
- **DAW state** — full parameter + sequencer pattern persistence
inside DAW project files.
## Controls
| Input | Action |
|---------------------------|-------------------------------------------|
| `T` key | Fire a test kick |
| MIDI NoteOn | Trigger the engine (velocity → VEL knob) |
| BOUNCE button | Render current sound to WAV / AIFF |
| Click + vertical drag | Adjust any knob |
| Shift + drag | Fine control |
| Ctrl + click (knob) | Reset knob to default |
| Double-click (knob) | Reset to default |
| Arrow Up / Down | Cycle presets (prev / next) |
| Arrow Left / Right | Tempo ±10 BPM (when tempo armed) |
| Shift + Left / Right | Tempo ±1 BPM (when tempo armed) |
| Space | Play / stop sequencer (standalone only) |
| Click on BPM readout | Arm tempo widget |
| Double-click BPM readout | Enter tempo value by keyboard |
## Preset and log locations
Resolved via the `directories` crate — correct on every platform:
| Platform | Presets | Logs |
|----------|-----------------------------------------------|---------------------------------------------|
| Linux | `~/.local/share/niner/presets/` | `~/.local/share/niner/niner.log` |
| macOS | `~/Library/Application Support/Niner/presets/`| `~/Library/Application Support/Niner/niner.log` |
| Windows | `%APPDATA%\Niner\niner\data\presets\` | `%APPDATA%\Niner\niner\data\niner.log` |
On first launch after upgrading from Slammer, Niner auto-migrates the
old `slammer` data directory to the new `niner` location so existing
presets, hidden-preset filters, and UI scale settings carry over.
## Building from source
### Prerequisites
**Rust** (stable, 1.75+):
```bash
curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh
```
**System dependencies** (Linux only — macOS and Windows need nothing
extra beyond Rust):
Debian / Ubuntu / Pop!_OS
```bash
sudo apt update
sudo apt install build-essential pkg-config cmake \
libx11-dev libx11-xcb-dev libxcb1-dev libxcb-icccm4-dev libxcb-keysyms1-dev \
libxcursor-dev libxkbcommon-dev libgl-dev libasound2-dev libjack-dev
```
Arch Linux / Manjaro
```bash
sudo pacman -S --needed base-devel pkg-config cmake \
libx11 libxcb xcb-util xcb-util-wm xcb-util-keysyms \
libxcursor libxkbcommon mesa alsa-lib jack2
```
### Build
```bash
git clone https://github.com/hyperfocusdsp/niner.git
cd niner
# Standalone only (quick dev loop)
cargo run --release --bin niner-standalone
# Full plugin bundles → target/bundled/niner.{vst3,clap}
cargo xtask bundle niner --release
```
The project is pinned to a specific `nih-plug` commit for reproducible
builds — see `Cargo.toml` for the current SHA.
### Development
```bash
cargo test # DSP unit tests
cargo clippy --all-targets -- -D warnings # lint gate used by CI
cargo fmt # rustfmt
```
## Project layout
```
src/
├── lib.rs crate root + nih_plug exports
├── main.rs thin standalone wrapper
├── plugin.rs Plugin impl: process(), editor(), MIDI
├── params.rs NinerParams + ParamSnapshot (preset round-trip)
├── presets.rs factory presets + user preset I/O
├── sequencer.rs 16-step atomic sequencer (audio↔GUI via atomics)
├── logging.rs tracing subscriber + log rotation
│
├── dsp/
│ ├── engine.rs KickEngine: three-layer mix, master EQ
│ ├── oscillator.rs band-limited sine
│ ├── envelope.rs pitch + amp envelopes
│ ├── noise.rs colored noise generator
│ ├── click.rs pre-rendered bandpass click buffer
│ ├── clap.rs 909-style parallel clap voice (bandpass + 3-burst env)
│ ├── drift.rs per-trigger analog-style pitch jitter
│ ├── filter.rs biquad + master EQ chain
│ ├── saturation.rs five-voice distortion palette (pre-EQ)
│ ├── master_bus.rs RMS comp (macro + precise) + transformer drive + limiter
│ └── tube.rs auto master warmth (post-bus, pre master-vol)
│
├── export/
│ ├── mod.rs BOUNCE entry point + remembered-path config
│ ├── render.rs offline one-shot render mirroring the live chain
│ └── writer.rs 16-bit WAV (hound) + AIFF writers
│
├── ui/
│ ├── editor.rs top-level egui shell
│ ├── panels.rs layout: header, master row, layer rows, sequencer
│ ├── preset_bar.rs preset LED display + dropdown + save/delete
│ ├── seven_seg.rs 7-segment LED rendering
│ ├── knob.rs industrial knob widget
│ ├── widgets.rs shared drawing primitives (groove, LED, rack ear)
│ └── theme.rs colors, fonts, spacing
│
└── util/
├── paths.rs cross-platform data/preset/log directories
├── telemetry.rs lock-free audio→UI peak ring buffer
└── messages.rs lock-free UI→audio command queue
```
## Known limitations
- **No Audio Unit (AU) support** — nih-plug limitation; use VST3 or CLAP.
- **Window scaling** — aspect ratio is locked, but the window is not
free-form resizable (egui-baseview limitation). Host window size
snaps to the nearest integer multiple of the 680×444 base layout.
- **Standalone on macOS Apple Silicon** — requires the included
`niner-macos.sh` launch script to set `--period-size 4096`. VST3
and CLAP inside a DAW are unaffected.
- **Standalone on Windows** — the binary probes the default WASAPI
output device at launch and uses its mix-format sample rate plus a
2048-sample period, because nih-plug's defaults (48 kHz / 512)
mismatch many Windows configurations. Pass `--sample-rate` /
`--period-size` explicitly to override.
## Support and feedback
Bugs, feature requests, or just-saying-hi messages all go to the same
inbox three different ways:
- **Email:** [feedback@hyperfocusdsp.com](mailto:feedback@hyperfocusdsp.com)
— most direct, no JavaScript, no account.
- **Web form:** [hyperfocusdsp.com/support](https://hyperfocusdsp.com/support)
— radios for bug/feature/hi, structured fields, opens your mail client
with everything pre-filled.
- **GitHub Issues:** [bug and feature templates](https://github.com/hyperfocusdsp/niner/issues/new/choose)
for everything that benefits from being public and tracked.
Specific repro steps and your DAW + OS line help most. The plugin's
log file (`~/.local/share/niner/niner.log` on Linux,
`~/Library/Application Support/Niner/niner.log` on macOS,
`%APPDATA%\Niner\niner.log` on Windows) is often the fastest fix path
when something crashes.
## Dependencies
Built with [nih-plug](https://github.com/robbert-vdh/nih-plug) (plugin
framework), [egui](https://github.com/emilk/egui) (GUI),
[parking_lot](https://crates.io/crates/parking_lot) (locks),
[rtrb](https://crates.io/crates/rtrb) (lock-free ring buffer), and
[directories](https://crates.io/crates/directories) (cross-platform
paths). See `Cargo.toml` for the full list.
## License
GPL-3.0-or-later. See [`LICENSE`](LICENSE) for the full text.