No description
  • C++ 99.3%
  • CMake 0.4%
  • Shell 0.3%
Find a file
Repository files (latest commit first)
Filename Latest commit message Latest commit date
2026-07-07 23:04:36 +01:00
.claude Snoredacity v0: two-mode wave editor on SND (organize + edit + headless batch) 2026-07-06 19:54:11 +01:00
src Host transport: tempo/time-sig via Instance::setTransport -- VST3 gets full musical ProcessContext (projectTimeMusic + barPositionMusic), AU gets HostCallbacks (beat/tempo, musical time, transport state); client SDK processors read transport() each block; WaveBob rack gains a bpm control handed to live chain + bounces 2026-07-07 23:04:36 +01:00
tools WaveBob v1: tabs, menus, transport+meters, rulers, clipboard, multi-undo, record, plugin apply, spectrogram + spectral repair, native dialogs, prefs 2026-07-06 21:28:40 +01:00
.DS_Store Fix loop (gapless in snd Player, live toggle), audio device settings on top bar, wave/spec switch moved to top bar 2026-07-06 22:38:24 +01:00
.gitignore Snoredacity v0: two-mode wave editor on SND (organize + edit + headless batch) 2026-07-06 19:54:11 +01:00
CMakeLists.txt WaveBob v1: tabs, menus, transport+meters, rulers, clipboard, multi-undo, record, plugin apply, spectrogram + spectral repair, native dialogs, prefs 2026-07-06 21:28:40 +01:00
README.md Fix recent-menu corruption + tab reset; custom title bar, alt-drag gestures, fade glyphs, N/F keys, LUFS normalize + limiter + measure; drop Transport menu 2026-07-06 23:57:17 +01:00

WaveBob

A single-file wave editor built on SND (the in-house audio+UI+plugin-hosting foundation). Audacity-grade editing for one file at a time — deliberately not multitrack.

What it does

Tabs — the first tab is Organize; every opened file gets its own tab (drag-drop anywhere, File→Open, or double-click in Organize). Dirty tabs show a marker and refuse to close until saved.

Organize tab — native folder picker, WAV table with length/rate/channels, hover any file to see its lead-in before the first zero crossing, multi-select with batch cut to zero crossing (writes _zc.wav copies unless overwrite originals is ticked) and batch rename with a {n} counter.

Edit view — per-channel waveform lanes with amplitude ruler, adaptive timeline ruler, scrollbar, wheel-zoom around the mouse, click cursor / drag selection, follow-playhead. Right-click for the tool menu. Full menu bar:

  • File: New Recording, Open, Open Folder, Recent, Save, Save As, Close Tab
  • Edit: multi-level Undo/Redo, Cut/Copy/Paste/Delete (audio clipboard, works across tabs, auto-conforms rate/channels on paste), Select All/None, Preferences
  • View: Waveform | Spectrogram, zoom in/out/fit/selection, follow playhead, time units (samples / seconds / hh:mm:ss.ms — or click the readout to cycle)
  • Transport: play/stop, loop selection, go to start/end, record
  • Process: Amplify, Normalize, Fades, Reverse, Invert, Silence, Trim, Remove DC, Resample, channel ops (mono/stereo/swap), Cut Start to Zero Crossing, Spectral Attenuate/Erase, Apply Plugin (VST3 + AU)

Spectral editing — flip a tab to Spectrogram view (toggle on the top bar; dB colormap, frequency ruler, FFT size/floor in Preferences), drag a box in time×frequency, then Attenuate/Erase: SpectraLayers-style repair with feathered mask edges. Verified surgical by selftest: erasing a 2kHz band kills that component by >160dB while an untouched 440Hz tone drifts 0.00dB.

Spectral subtract by profile — give it a sound and erase that sound everywhere: select a region (or right-click any Paste Bucket clip) → Learn Spectral Profile → Process→Spectral Subtract. Classic noise-reduction-style over-subtraction with strength and spectral-floor controls, phases preserved. Selftest: learning a pure 2kHz template and subtracting it from a 440+2kHz mix drops the 2kHz component 60dB while 440Hz moves 0.01dB.

Plugins — Process→Apply Plugin scans VST3 (+AU on macOS) with crash-loop protection, lists everything installed, gives a slider per parameter, applies offline to the selection or whole file. Undoable like everything else.

Recording — transport Record button opens a live "Recording..." tab; Stop turns it into a normal document.

Transport bar — vector-icon play/stop/skip/loop/record, wave|spectrogram switch, Audio device picker (inputs + outputs, persisted), stereo peak meter, and the readout strip (cursor/selection/length/rate/peak-of-selection).

Custom title bar — Murk-style gradient strip with the menus inline, centered title, window controls, drag-to-move, double-click to maximize, and a resize grip (frameless window; native title bar available in Preferences).

Quick gestures — selection edge handles; fade glyphs at the selection's top corners (one click = fade in/out); F/Shift+F fades, N instant normalize, Shift+N normalize dialog; alt-drag a selection into the Paste Bucket to keep it, or drop it elsewhere in the waveform to move the audio.

Mastering tools — Loudness Normalize to a LUFS target (ITU-R BS.1770 gated measurement), brickwall Hard Limit with 5ms lookahead, and Measure Levels (peak / RMS / integrated LUFS).

Paste Bucket — a pop-out side panel (toggle with B, the transport button, or View menu) of little squares holding audio sections you might use later, each with a waveform thumbnail, duration, and an editable name under it. Add from the current selection (button or right-click menu). Click a square to put it on the clipboard, double-click to paste at the cursor, or drag it straight into the waveform to insert at that position. Persists across sessions (each clip saved as a WAV in the app config dir).

Headless

wavebob --batch --vst3 /path/To/Plugin.vst3 [--vst3 more.vst3 ...] \
        [--param <stableId>=<0..1> ...] --in <dir> --out <dir>

Build & test

Expects the SND checkout as a sibling at ~/github/SND (falls back to fetching the private repo, which needs git auth).

tools/build.sh            # configure + build + run --selftest
./build/wavebob           # run the editor
./build/wavebob file.wav

--selftest checks behaviour, not compilation: zero-crossing math, edit ops, clipboard round-trip, undo/redo depth, spectral-erase selectivity, and a full headless batch through SND's TestGain plugin. No CI in this repo, on purpose.

Known gaps (deliberate, for now)

  • Separate-windows mode is a recorded preference but not implemented (tabs always) — needs one GL+ImGui context per window
  • Spectrogram frequency axis is linear only; spectral selection is a rectangle (no brush/lasso yet)
  • No EQ / noise reduction / pitch-tempo yet; never multitrack
  • WAV-only in the Organize table and for saving (decode of flac/mp3/ogg works)