- C++ 99.3%
- CMake 0.4%
- Shell 0.3%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
|
||
| .claude | ||
| src | ||
| tools | ||
| .DS_Store | ||
| .gitignore | ||
| CMakeLists.txt | ||
| README.md | ||
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)