No description
  • C++ 86.2%
  • C 8%
  • Objective-C++ 4.4%
  • CMake 1.2%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
100mountains 88b3e262ee
Some checks are pending
build / linux (push) Waiting to run
build / windows (push) Waiting to run
plugin editor view: hover from the display-link tick, no tracking area
A host that runs the editor out of process (Logic 11, GarageBand) hands
every NSMouseMoved the service window receives to -[NSWindow sendEvent:],
which first asks the host synchronously over XPC whether a modal sheet
is attached. While the host's main thread is busy saving, and asking
this very unit for its state, that question is never answered and the
two main threads deadlock; both Logic spindumps show exactly that. The
view now registers no tracking area and reads the pointer once per tick
instead: the same MouseMove, delta, hover and tooltips. Presses and
drags still arrive as events, and a held button leaves the pointer to
the drag.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-09-07 00:33:36 +01:00
.claude Complete retained UI menu and graph accessibility 2026-07-10 00:55:07 +01:00
.forgejo/workflows ci: drop the shared FetchContent cache 2026-07-29 10:01:44 +01:00
cmake Linux plugins export only their entry points (blind); Windows keeps the snd umbrella for now 2026-09-04 01:14:09 +01:00
docs graphSurface: modifier state on the cable callbacks 2026-08-23 11:06:32 +01:00
examples/snd-example plugins: native AUv2 shell over a shared Engine; aumi/aumf load 2026-09-02 23:20:11 +01:00
include/snd Processor::stateLoaded: one moment a processor may write parameters 2026-09-05 03:31:00 +01:00
site Bob1 parity set: ledSwitch, switchMatrix, stepper, Davies face options 2026-08-04 12:27:44 +01:00
src plugin editor view: hover from the display-link tick, no tracking area 2026-09-07 00:33:36 +01:00
test VST3 host never spins across a plugin call; DemoSynth honours note offsets 2026-09-04 01:13:36 +01:00
third_party gl: vendor GLAD so Windows and Linux can build the GL renderers 2026-07-29 07:40:06 +01:00
tools hygiene: third-party headers as -isystem, the last unused captures, 3.8.1 StringConvert 2026-09-03 02:10:36 +01:00
.gitignore Prepare repo for public release 2026-07-09 15:01:57 +01:00
AUDIT.md AUDIT.md: B3/B5 closed, B4 closed on macOS, B2 narrowed to Windows, A3 updated 2026-09-04 01:14:37 +01:00
CMakeLists.txt plugins: no Dear ImGui unless snd_add_plugin() is given IMGUI 2026-09-03 02:34:46 +01:00
DESIGN.md DESIGN.md: testing section describes the CI that exists, not the one sworn off 2026-09-04 01:14:09 +01:00
LICENCE Prepare repo for public release 2026-07-09 15:01:57 +01:00
PROGRAMMING-GUIDE.md Polish retained UI resizing and widgets 2026-07-14 13:47:51 +01:00
README.md docs: CI + tag-release notes in LUIGI.md and README 2026-07-29 09:01:19 +01:00
ROADMAP.md plugins: native AUv2 shell over a shared Engine; aumi/aumf load 2026-09-02 23:20:11 +01:00
UI_PROGRAMMING_GUIDE.md retained window: draw on demand; plugin editor on a display link 2026-09-02 18:18:08 +01:00

SND

SND is a small, in-house audio+UI foundation library — cross-platform audio I/O, a GUI shell, plugin hosting, and a write-once plugin SDK. Apps build on SND instead of on JUCE/iPlug. Free for any noncommercial use; commercial use needs a licence — see License.

Modules

  • snd::audio — device playback/capture, file decode (wav/aiff/flac/mp3/ogg), streaming reads, encoders (FLAC, MP3), resampling, a gapless Player
  • snd::ui — shared audio UI toolkit with two front ends: retained/aGooey (snd_ui_retained_gl, no ImGui target) and Dear ImGui compatibility (snd_ui_imgui). Widgets share paint helpers for knobs, meters, faders, keyboard, pattern grid, sequencer matrix, envelope editor, graph surface, menus, and custom painter hooks. The retained tree adds layout, keyboard focus, and accessibility semantics. See UI_PROGRAMMING_GUIDE.md.
  • snd::plugin — VST3 + AU hosting (editor GUIs in native windows, MIDI, host transport) and a client SDK: write a Processor + ImGui editor once and build it as VST3, AU, and a standalone app. Multichannel buses, an inter-plugin control-bus API, out-of-process crash-safe scanning.
  • snd::midi — MIDI events + CoreMIDI/ALSA/WinMM device I/O
  • snd::dsp — real FFT + COLA STFT (PFFFT)
  • snd::state — a ValueTree-shaped state tree with XML round-trip + undo
  • snd::platform — native file dialogs, per-OS config dir

Mac, Linux, and Windows are supported. DESIGN.md records the architecture, PROGRAMMING-GUIDE.md the how-to, and AUDIT.md the current architecture audit.

Every push is built and selftested on self-hosted Linux and Windows runners (Forgejo Actions — see the repo's Actions tab; workflow in .forgejo/workflows/build.yml).

Build & test

Everything vendors or fetches automatically (CMake FetchContent); there is no package manager to set up. OpenGL needs nothing installed on any platform: on macOS the system framework provides GL 3.2, everywhere else the vendored GLAD loader (third_party/glad) resolves the modern entry points at runtime.

Prerequisites

  • macOS — Xcode command-line tools (xcode-select --install), CMake 3.24+.

  • Windows — Visual Studio 2022 (Community is fine) with the Desktop development with C++ workload, CMake 3.24+, git. Any shell works — the Visual Studio generator finds the toolchain itself.

  • Linux — gcc/clang, CMake 3.24+, and the X11/audio dev packages GLFW and the audio backend compile against:

    sudo apt install build-essential cmake libx11-dev libxrandr-dev \
        libxinerama-dev libxcursor-dev libxi-dev libasound2-dev
    

Build

macOS / Linux:

tools/build.sh            # configure + build + run --selftest
tools/build.sh --no-test  # configure + build only

Or by hand on any platform (on Windows this produces a Visual Studio build; add --config Debug to the build step and find binaries under build/Debug/):

cmake -S . -B build
cmake --build build
./build/snd-example --selftest   # headless checks
./build/snd-example --selftest-retained # focused retained UI contract
./build/snd-example              # window + audio device demo

--selftest verifies real behaviour, not just compilation: decode+playback, capture, VST3/AU hosting (parameter behaviour + stable-ID state round-trip), and the plugin-client SDK.

Last verified builds: macOS (arm64, AppleClang), Linux (Mint 22 / Ubuntu 24.04, gcc 13, selftest + headless GL render under Xvfb), Windows 11 (VS 2022, x64).

There is no CI here, and there won't be — private-repo Actions minutes are metered and easy to over-trigger. This repo only builds when someone runs the script by hand.

What's vendored vs. original

  • Vendored, unmodified, pinned (via CMake FetchContent): miniaudio, Dear ImGui, GLFW, VST3 SDK, Apple AudioUnitSDK, PFFFT, NFD, imgui-knobs, libFLAC
  • Original: everything under include/snd/ and src/ — SND's own API and the backends behind it

Dev workflow

See AGENTS.md for the multi-agent dev workflow that applies to work in this repo.

License

SND is source-available, not open source. It is licensed under the PolyForm Noncommercial License 1.0.0: free to use, modify, and share for any noncommercial purpose (personal projects, research, education, non-profits, evaluation).

Commercial use requires a separate commercial licence from the author. If you want to ship SND — or anything built on it — in a product or service for commercial advantage or monetary compensation, open an issue at https://github.com/100mountains/snd or contact @100mountains on GitHub to arrange one.

Copyright 2026 100mountains. The dependencies SND fetches keep their own licences (mostly permissive: ImGui, GLFW, miniaudio, PFFFT, NFD, libFLAC, imgui-knobs, nanosvg, stb_image, AudioUnitSDK). One to note: the VST3 SDK is GPLv3-or-Steinberg — if you build VST3 targets, your use of that SDK is governed by Steinberg's terms, separately from SND's licence.