No description
  • C++ 86%
  • C 7.4%
  • Objective-C++ 5.1%
  • CMake 1.2%
  • Swift 0.2%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-10-21 02:59:10 +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 plugin build: Windows plugins link snd_ui_retained_gl like the others, with /OPT:REF and /INCREMENTAL:NO so the unused ImGui bridge drops out at link 2026-10-08 14:38:36 +01:00
docs docs: the small knob brief is out again; it goes to the team as text 2026-10-06 18:59:18 +01:00
examples/snd-example ui: a modal opened by a click shows no focus ring, and one without a text entry focuses itself 2026-10-10 21:49:03 +01:00
include/snd ui_retained: a node's finds by id are remembered until the tree's structure changes anywhere (Node::structureVersion, up with every child added or removed), one walk per id per structure and a lookup after, where a tree of thousands of nodes was walked whole for every find; a role's default style is made once and resolvedStyle hands out a reference, where a copy of six std::function, two vectors and a string went out per node per frame; a layout pass keeps its two lists per container between passes. plugin_client: the engine finds a parameter's slot by a table, not a scan of every id, for every automation point; the Windows editor's swap waits for no vertical blank, where the driver's default interval blocked the host's UI thread for up to a frame on every draw 2026-10-21 02:59:10 +01:00
site ui: KnobStyle::Small -- for 24 to 36 px, a plain matte cap lit from above whose lit pointer is the value, no ring, the rim left clear so the modulation arc reads on its own; bipolar marks the centre at the top of the cap. Cap's and Halo's outline, so the three swap in place. The mod arc is 1.5 px at least; a selftest holds a 31 px Small's arc clear of its cap. Library page, guide and gallery carry it 2026-10-06 19:07:24 +01:00
src ui_retained: a node's finds by id are remembered until the tree's structure changes anywhere (Node::structureVersion, up with every child added or removed), one walk per id per structure and a lookup after, where a tree of thousands of nodes was walked whole for every find; a role's default style is made once and resolvedStyle hands out a reference, where a copy of six std::function, two vectors and a string went out per node per frame; a layout pass keeps its two lists per container between passes. plugin_client: the engine finds a parameter's slot by a table, not a scan of every id, for every automation point; the Windows editor's swap waits for no vertical blank, where the driver's default interval blocked the host's UI thread for up to a frame on every draw 2026-10-21 02:59:10 +01:00
test Processor::paramBinding() is paramBindingId(), so the UI helper of that name is reachable again 2026-10-03 20:10:43 +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 ui: Small is a plain black knob; KnobStyle::Small2, the trim's cap at small size 2026-10-14 17:27:19 +01:00
.gitignore Prepare repo for public release 2026-07-09 15:01:57 +01:00
AUDIT.md x11 editor: sized by the content scale -- IPlugViewContentScaleSupport from the host, the desktop's Xft.dpi when the host never sets one; logical sizes in, pixels at the window, the pointer and the framebuffer, and the font atlas baked for the scale 2026-10-10 13:37:49 +01:00
CMakeLists.txt VST3 host and build: the controller-number conditional is a CtrlNumber on gcc too; the SDK's own libraries compile with -w, since Ubuntu's gcc warns on their %lld by default; macOS archives with ar Sqc and ranlib -no_warning_for_no_symbols, so a full build is as quiet as an incremental one 2026-10-08 00:05:13 +01:00
DESIGN.md x11 editor: sized by the content scale -- IPlugViewContentScaleSupport from the host, the desktop's Xft.dpi when the host never sets one; logical sizes in, pixels at the window, the pointer and the framebuffer, and the font atlas baked for the scale 2026-10-10 13:37:49 +01:00
LICENCE Prepare repo for public release 2026-07-09 15:01:57 +01:00
PROGRAMMING-GUIDE.md docs: DESIGN.md gains the plugin client SDK -- Processor, Engine, the three shells, buses, editors, control bus -- and its threading and CI statements match the code; the guide and roadmap drop their stale no-tick and no-CI lines; A3 closed 2026-10-08 14:38:36 +01:00
README.md docs: the plugin processor rules, auval steps, and where the SDK stands after the bruiser work 2026-10-03 20:46:33 +01:00
ROADMAP.md docs: DESIGN.md gains the plugin client SDK -- Processor, Engine, the three shells, buses, editors, control bus -- and its threading and CI statements match the code; the guide and roadmap drop their stale no-tick and no-CI lines; A3 closed 2026-10-08 14:38:36 +01:00
UI_PROGRAMMING_GUIDE.md ui: a modal opened by a click shows no focus ring, and one without a text entry focuses itself 2026-10-10 21:49:03 +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 + editor once and build it as VST3, AU, and a standalone app, which also renders headless (--render) for validation. Sample-accurate parameter events, stepped parameters with value text, latency reporting, mono to 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), half-band Oversampler (x2–x16)
  • 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.