{"id":49495102,"url":"https://github.com/hyperfocusdsp/niner","last_synced_at":"2026-06-08T20:01:06.396Z","repository":{"id":350762934,"uuid":"1202826050","full_name":"hyperfocusdsp/niner","owner":"hyperfocusdsp","description":"Monophonic analogue kick drum synthesizer — 3 voices, compression, distortion, EQ.   VST3/CLAP/Standalone for Linux, Windows, macOS","archived":false,"fork":false,"pushed_at":"2026-06-05T20:26:20.000Z","size":17302,"stargazers_count":29,"open_issues_count":2,"forks_count":1,"subscribers_count":1,"default_branch":"master","last_synced_at":"2026-06-05T22:13:31.069Z","etag":null,"topics":["analog","audio","bass-drum","clap-plugin","dsp","kick-drum","linux","macos","music-production","nih-plug","rust","synthesizer","vst-plugin","windows"],"latest_commit_sha":null,"homepage":"","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-3.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hyperfocusdsp.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-04-06T12:48:51.000Z","updated_at":"2026-06-05T20:26:24.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/hyperfocusdsp/niner","commit_stats":null,"previous_names":["hornfisk/slammer","hyperfocusdsp/slammer","hyperfocusdsp/niner"],"tags_count":23,"template":false,"template_full_name":null,"purl":"pkg:github/hyperfocusdsp/niner","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hyperfocusdsp%2Fniner","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hyperfocusdsp%2Fniner/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hyperfocusdsp%2Fniner/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hyperfocusdsp%2Fniner/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hyperfocusdsp","download_url":"https://codeload.github.com/hyperfocusdsp/niner/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hyperfocusdsp%2Fniner/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34078019,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-08T02:00:07.615Z","response_time":111,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["analog","audio","bass-drum","clap-plugin","dsp","kick-drum","linux","macos","music-production","nih-plug","rust","synthesizer","vst-plugin","windows"],"created_at":"2026-05-01T09:03:56.007Z","updated_at":"2026-06-08T20:01:06.389Z","avatar_url":"https://github.com/hyperfocusdsp.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Niner\n\n\u003e **Formerly known as Slammer.** Renamed in v0.7.0 due to a trademark\n\u003e conflict with another product. CLAP/VST3 plugin IDs changed — existing\n\u003e DAW projects saved with the old \"Slammer\" plugin must be re-wired.\n\nA three-layer synthesized kick drum plugin with a parallel 909-style\nclap voice. SUB sine, MID sine+noise, and a band-passed click TOP mix\ninto a five-voice distortion palette, a tilt/low/notch master EQ, and a\nfull master bus (RMS compressor → transformer drive → brickwall limiter\n→ auto tube warmth). Ships with a 16-step pattern sequencer, a factory\n+ user preset browser, one-shot WAV/AIFF bounce, and a fully\ninteractive standalone editor.\n\n![Niner](docs/niner.webp?v=1.0.0-2)\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"https://hyperfocusdsp.com/plugins/niner/\"\u003e\u003cimg src=\"https://img.shields.io/badge/Plugin_page-hyperfocusdsp.com-f59e0b?style=for-the-badge\" alt=\"Niner on hyperfocusdsp.com\" /\u003e\u003c/a\u003e\n  \u003ca href=\"https://hyperfocusdsp.com/docs/niner/\"\u003e\u003cimg src=\"https://img.shields.io/badge/Docs-Read-2d3748?style=for-the-badge\" alt=\"Niner documentation\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n**Formats:** VST3, CLAP, Standalone\n**Platforms:** Linux, macOS (Apple Silicon + Intel), Windows\n**License:** GPL-3.0-or-later\n\n## Listen\n\n▶ **[Play sound samples in your browser](https://hyperfocusdsp.github.io/niner/)**\n\nTen one-shots bounced straight out of the plugin via the BOUNCE button —\nclean kicks, 808/909 emulations, claps, snares, toms, and hats. No\ndownload, just hit play.\n\n## Quick start\n\nDownload the latest build for your platform from the\n[Releases](https://github.com/hyperfocusdsp/niner/releases/latest) page,\nextract, and run the installer:\n\n```bash\n# Linux / macOS\n./install.sh\n\n# Windows (run as Administrator)\ninstall.bat\n```\n\nRescan plugins in your DAW. Niner appears as **Hyperfocus DSP / Niner**.\n\n## Download\n\n| Platform                  | File                               |\n|---------------------------|------------------------------------|\n| Linux x86_64              | `niner-linux-x86_64.tar.gz`        |\n| macOS ARM (Apple Silicon) | `niner-macos-arm64.tar.gz`         |\n| macOS Intel               | `niner-macos-x86_64.tar.gz`        |\n| Windows x86_64            | `niner-windows-x86_64.zip`         |\n\nEach archive contains the standalone binary, VST3 and CLAP plugin\nbundles, and an install script.\n\n### Verify your download\n\nEvery release ships a `SHA256SUMS.txt` file on the\n[Releases](https://github.com/hyperfocusdsp/niner/releases/latest) page.\nDownload it alongside the archive and verify before running:\n\n```bash\n# Linux / macOS\nsha256sum -c SHA256SUMS.txt\n\n# Windows (PowerShell)\nGet-Content SHA256SUMS.txt | ForEach-Object {\n  $hash, $file = $_ -split '\\s+'\n  $actual = (Get-FileHash $file -Algorithm SHA256).Hash.ToLower()\n  if ($actual -eq $hash) { \"$file OK\" } else { \"$file FAILED\" }\n}\n```\n\nYou can also upload the archive to [VirusTotal](https://www.virustotal.com/gui/home/upload)\nfor a third-party scan before running — niner is unsigned open-source\nsoftware, so extra caution is welcome.\n\n## macOS setup — step by step\n\nThe binaries are **not codesigned or notarized**, so macOS will block\nthem on first launch. Here's the complete boomer-friendly walkthrough:\n\n### 1. Extract the archive\n\nDouble-click the `.tar.gz` file in Finder — macOS extracts it\nautomatically into a folder next to the archive. Or, if you prefer\nTerminal:\n\n```bash\ncd ~/Downloads\ntar xzf niner-macos-arm64.tar.gz\ncd niner-macos-arm64\n```\n\n### 2. Remove the quarantine flag\n\nmacOS marks every downloaded file as untrusted. You need to clear that\nflag on everything inside the extracted folder. Open Terminal, `cd` into\nthe folder, and run:\n\n```bash\nxattr -dr com.apple.quarantine .\n```\n\n(The dot at the end is important — it means \"this folder and\neverything in it\".)\n\n### 3. Run the standalone\n\nUse the included launch script — it configures the audio buffer size so\nCoreAudio plays nicely with nih-plug's backend:\n\n```bash\n./niner-macos.sh\n```\n\nIf macOS still blocks the binary after you've removed the quarantine\nflag, open **System Settings → Privacy \u0026 Security**, scroll to the\nbottom, and click **Open Anyway** next to the Niner warning. You\nonly need to do this once; future launches will go straight through.\n\n### 4. Install the plugins for your DAW\n\nCopy the VST3 and CLAP bundles into the standard macOS plugin\nlocations:\n\n```bash\ncp -r niner.vst3 ~/Library/Audio/Plug-Ins/VST3/\ncp -r niner.clap ~/Library/Audio/Plug-Ins/CLAP/\n```\n\nThen rescan plugins in your DAW.\n\n**Note on the launch script:** `niner-macos.sh` starts the standalone\nwith `--period-size 4096` to work around a CoreAudio variable-buffer\nissue in nih-plug's CPAL backend\n([upstream bug](https://github.com/robbert-vdh/nih-plug/issues/266)).\nThis adds slight latency in standalone mode only. VST3 and CLAP running\ninside a DAW are unaffected.\n\n**Audio Unit (AU) is not supported.** Most macOS DAWs (Ableton Live,\nBitwig, REAPER, Renoise, FL Studio) support VST3 or CLAP. Logic Pro is\nAU-only and will not see Niner.\n\n## Features\n\n### Signal chain\n\n```\nSUB + MID + TOP voices  (+ parallel CLAP voice)\n  → per-voice saturation (5-mode palette)\n  → master EQ (tilt / low shelf / notch)\n  → master bus (RMS comp → transformer drive → brickwall limiter)\n  → auto tube warmth (engages above 0 dB master)\n  → master volume → out\n```\n\n### DSP\n\n- **Three-layer kick engine** — SUB sine with pitch envelope, MID\n  sine+noise blend, TOP bandpass-filtered click transient. Each layer\n  has independent tuning, amp + pitch envelopes, and drift.\n- **909-style CLAP layer** — parallel voice, white noise → 2-pole SVF\n  bandpass → baked 3-burst + exponential tail envelope. Tunable\n  independently of the kick (level, center frequency 500–5000 Hz, tail\n  50–400 ms). Toggleable; bit-identical bypass when off.\n- **Five-voice distortion palette** — each mode is a genuinely\n  different curve, not just gain+tanh:\n  - *Sat Clip* — split-band rational hard-shoulder (`x/√(1+x²)`) with\n    a 60 Hz low-pass bypass that keeps the sub clean.\n  - *Sat Diode* — asymmetric exponential pair.\n  - *Sat Tape* — drive-reactive low-pass plus hysteresis memory; the\n    only mode with dynamic/frequency-dependent behavior.\n  - *Transformer drive* (master bus) — polynomial 2nd+3rd harmonic\n    blend with a feed-forward 60 Hz \"bloom\" filter.\n  - *Master warmth* — asymmetric cubic bias shaper that auto-engages\n    above 0 dB master volume; bit-exact bypass below unity.\n- **Master bus compressor** — three macros (Amount, Reaction,\n  Transformer drive) for fast moves, plus a precision strip with\n  independent Attack (0.3–50 ms), Release (20–800 ms), and soft Knee\n  (0–12 dB, Reiss \u0026 McPherson quadratic). Brickwall limiter LED, GR\n  meter. RCT acts as a link macro — moving it writes Attack and\n  Release together via the host parameter API. Knee = 0 is\n  bit-identical to a hard-knee path.\n- **Master EQ** — tilt, low shelf, and variable-Q notch.\n- **One-shot bounce** — render the current sound with the full chain\n  to a 16-bit / 44.1 kHz WAV or AIFF via a dedicated BOUNCE button.\n  Runs offline on the GUI thread against a fresh DSP instance, so live\n  audio keeps flowing during the render and the result is bit-for-bit\n  reproducible.\n\n### UI\n\n- **Single-window editor** — 680 × 444 rack panel with aspect-ratio\n  locked scaling; resize the DAW window and the UI scales without\n  distortion.\n- **Header preset bar** — 7-segment LED display, dropdown browser,\n  inline rename (double-click to edit), save, delete. Up/Down arrow\n  keys cycle presets. Factory presets are protected from deletion.\n- **16-step pattern sequencer** — four-on-the-floor default, click or\n  drag to paint steps. Runs standalone with internal transport, or\n  locks to host tempo and transport inside a DAW.\n- **Interactive tempo entry** (standalone only) — single-click the BPM\n  readout to arm, drag vertically to scrub, double-click to type a\n  value, or use Left/Right arrows (±10, Shift for ±1). Host-synced\n  mode keeps the readout read-only.\n- **Waveform scope** — live output waveform display fed post-comp, so\n  the trace visibly shrinks under compression and caps under the\n  limiter. GR meter sits next to it.\n- **Test trigger** — press `T` anywhere in the editor to fire a kick\n  without MIDI.\n- **In-plugin MIDI Learn** — right-click any knob, the BPM, or the PLAY\n  button to bind a MIDI CC or NoteOn. Three relative-encoder encodings\n  auto-detected (Absolute, BinaryOffset, Centered) with a manual\n  override picker. Bindings persist across DAW projects and standalone\n  sessions.\n- **BOUNCE button** — one click renders a single hit, opens a native\n  save dialog (remembered between bounces), writes WAV or AIFF.\n\n### Persistence\n\n- **Factory + user presets** — stored as forward-compatible JSON with\n  `#[serde(default)]` on every field, so new parameters in later\n  versions won't break existing files.\n- **Last preset recall** (standalone) — the editor remembers the last\n  loaded preset and restores it on next launch.\n- **DAW state** — full parameter + sequencer pattern persistence\n  inside DAW project files.\n\n## Controls\n\n| Input                     | Action                                    |\n|---------------------------|-------------------------------------------|\n| `T` key                   | Fire a test kick                          |\n| MIDI NoteOn               | Trigger the engine (velocity → VEL knob)  |\n| BOUNCE button             | Render current sound to WAV / AIFF        |\n| Click + vertical drag     | Adjust any knob                           |\n| Shift + drag              | Fine control                              |\n| Ctrl + click (knob)       | Reset knob to default                     |\n| Double-click (knob)       | Reset to default                          |\n| Arrow Up / Down           | Cycle presets (prev / next)               |\n| Arrow Left / Right        | Tempo ±10 BPM (when tempo armed)          |\n| Shift + Left / Right      | Tempo ±1 BPM (when tempo armed)           |\n| Space                     | Play / stop sequencer (standalone only)   |\n| Click on BPM readout      | Arm tempo widget                          |\n| Double-click BPM readout  | Enter tempo value by keyboard             |\n\n## Preset and log locations\n\nResolved via the `directories` crate — correct on every platform:\n\n| Platform | Presets                                       | Logs                                        |\n|----------|-----------------------------------------------|---------------------------------------------|\n| Linux    | `~/.local/share/niner/presets/`               | `~/.local/share/niner/niner.log`            |\n| macOS    | `~/Library/Application Support/Niner/presets/`| `~/Library/Application Support/Niner/niner.log` |\n| Windows  | `%APPDATA%\\Niner\\niner\\data\\presets\\`         | `%APPDATA%\\Niner\\niner\\data\\niner.log`      |\n\nOn first launch after upgrading from Slammer, Niner auto-migrates the\nold `slammer` data directory to the new `niner` location so existing\npresets, hidden-preset filters, and UI scale settings carry over.\n\n## Building from source\n\n### Prerequisites\n\n**Rust** (stable, 1.75+):\n\n```bash\ncurl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh\n```\n\n**System dependencies** (Linux only — macOS and Windows need nothing\nextra beyond Rust):\n\n\u003cdetails\u003e\n\u003csummary\u003eDebian / Ubuntu / Pop!_OS\u003c/summary\u003e\n\n```bash\nsudo apt update\nsudo apt install build-essential pkg-config cmake \\\n    libx11-dev libx11-xcb-dev libxcb1-dev libxcb-icccm4-dev libxcb-keysyms1-dev \\\n    libxcursor-dev libxkbcommon-dev libgl-dev libasound2-dev libjack-dev\n```\n\u003c/details\u003e\n\n\u003cdetails\u003e\n\u003csummary\u003eArch Linux / Manjaro\u003c/summary\u003e\n\n```bash\nsudo pacman -S --needed base-devel pkg-config cmake \\\n    libx11 libxcb xcb-util xcb-util-wm xcb-util-keysyms \\\n    libxcursor libxkbcommon mesa alsa-lib jack2\n```\n\u003c/details\u003e\n\n### Build\n\n```bash\ngit clone https://github.com/hyperfocusdsp/niner.git\ncd niner\n\n# Standalone only (quick dev loop)\ncargo run --release --bin niner-standalone\n\n# Full plugin bundles → target/bundled/niner.{vst3,clap}\ncargo xtask bundle niner --release\n```\n\nThe project is pinned to a specific `nih-plug` commit for reproducible\nbuilds — see `Cargo.toml` for the current SHA.\n\n### Development\n\n```bash\ncargo test                                  # DSP unit tests\ncargo clippy --all-targets -- -D warnings   # lint gate used by CI\ncargo fmt                                   # rustfmt\n```\n\n## Project layout\n\n```\nsrc/\n├── lib.rs              crate root + nih_plug exports\n├── main.rs             thin standalone wrapper\n├── plugin.rs           Plugin impl: process(), editor(), MIDI\n├── params.rs           NinerParams + ParamSnapshot (preset round-trip)\n├── presets.rs          factory presets + user preset I/O\n├── sequencer.rs        16-step atomic sequencer (audio↔GUI via atomics)\n├── logging.rs          tracing subscriber + log rotation\n│\n├── dsp/\n│   ├── engine.rs       KickEngine: three-layer mix, master EQ\n│   ├── oscillator.rs   band-limited sine\n│   ├── envelope.rs     pitch + amp envelopes\n│   ├── noise.rs        colored noise generator\n│   ├── click.rs        pre-rendered bandpass click buffer\n│   ├── clap.rs         909-style parallel clap voice (bandpass + 3-burst env)\n│   ├── drift.rs        per-trigger analog-style pitch jitter\n│   ├── filter.rs       biquad + master EQ chain\n│   ├── saturation.rs   five-voice distortion palette (pre-EQ)\n│   ├── master_bus.rs   RMS comp (macro + precise) + transformer drive + limiter\n│   └── tube.rs         auto master warmth (post-bus, pre master-vol)\n│\n├── export/\n│   ├── mod.rs          BOUNCE entry point + remembered-path config\n│   ├── render.rs       offline one-shot render mirroring the live chain\n│   └── writer.rs       16-bit WAV (hound) + AIFF writers\n│\n├── ui/\n│   ├── editor.rs       top-level egui shell\n│   ├── panels.rs       layout: header, master row, layer rows, sequencer\n│   ├── preset_bar.rs   preset LED display + dropdown + save/delete\n│   ├── seven_seg.rs    7-segment LED rendering\n│   ├── knob.rs         industrial knob widget\n│   ├── widgets.rs      shared drawing primitives (groove, LED, rack ear)\n│   └── theme.rs        colors, fonts, spacing\n│\n└── util/\n    ├── paths.rs        cross-platform data/preset/log directories\n    ├── telemetry.rs    lock-free audio→UI peak ring buffer\n    └── messages.rs     lock-free UI→audio command queue\n```\n\n## Known limitations\n\n- **No Audio Unit (AU) support** — nih-plug limitation; use VST3 or CLAP.\n- **Window scaling** — aspect ratio is locked, but the window is not\n  free-form resizable (egui-baseview limitation). Host window size\n  snaps to the nearest integer multiple of the 680×444 base layout.\n- **Standalone on macOS Apple Silicon** — requires the included\n  `niner-macos.sh` launch script to set `--period-size 4096`. VST3\n  and CLAP inside a DAW are unaffected.\n- **Standalone on Windows** — the binary probes the default WASAPI\n  output device at launch and uses its mix-format sample rate plus a\n  2048-sample period, because nih-plug's defaults (48 kHz / 512)\n  mismatch many Windows configurations. Pass `--sample-rate` /\n  `--period-size` explicitly to override.\n\n## Support and feedback\n\nBugs, feature requests, or just-saying-hi messages all go to the same\ninbox three different ways:\n\n- **Email:** [feedback@hyperfocusdsp.com](mailto:feedback@hyperfocusdsp.com)\n  — most direct, no JavaScript, no account.\n- **Web form:** [hyperfocusdsp.com/support](https://hyperfocusdsp.com/support)\n  — radios for bug/feature/hi, structured fields, opens your mail client\n  with everything pre-filled.\n- **GitHub Issues:** [bug and feature templates](https://github.com/hyperfocusdsp/niner/issues/new/choose)\n  for everything that benefits from being public and tracked.\n\nSpecific repro steps and your DAW + OS line help most. The plugin's\nlog file (`~/.local/share/niner/niner.log` on Linux,\n`~/Library/Application Support/Niner/niner.log` on macOS,\n`%APPDATA%\\Niner\\niner.log` on Windows) is often the fastest fix path\nwhen something crashes.\n\n## Dependencies\n\nBuilt with [nih-plug](https://github.com/robbert-vdh/nih-plug) (plugin\nframework), [egui](https://github.com/emilk/egui) (GUI),\n[parking_lot](https://crates.io/crates/parking_lot) (locks),\n[rtrb](https://crates.io/crates/rtrb) (lock-free ring buffer), and\n[directories](https://crates.io/crates/directories) (cross-platform\npaths). See `Cargo.toml` for the full list.\n\n## License\n\nGPL-3.0-or-later. See [`LICENSE`](LICENSE) for the full text.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhyperfocusdsp%2Fniner","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhyperfocusdsp%2Fniner","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhyperfocusdsp%2Fniner/lists"}