Slopsmith Desktop v0.2.8 delivers the most substantial audio-engine overhaul to date: a native polyphonic chord scorer running on a JUCE background thread, a sandboxed VST3/LV2 host with inline MIDI, engine-side note verification for the Note Detection plugin, and Basic Pitch / ONNX Runtime for ML note detection — all paired with a wave of 3D Highway rendering upgrades (bends, HO/PO markers, chord-frame verdict tinting, frethand-mute indicators), new library formats (loose folder CDLC), a Guitar Pro repeat/coda expander, and the AGPL-3.0-only relicense across the full stack.
Desktop runtime (slopsmith-desktop)
Features
- feat(audio): stream raw input frames to the renderer for chord scoring (#61)
- feat(audio): native polyphonic chord scorer (Constitution II — JUCE background thread) (#62)
- feat(audio): sandboxed VST3 host for Qt-using plugins, Windows (#63)
- feat(sandbox): inline MIDI in audio shared-memory + audio-thread sync, protocol v2 (#64)
- feat(audio): scan VST plugins out-of-process on Windows (#95)
- feat(audio): polyphonic ML note detection via Basic Pitch + ONNX Runtime (#130)
- feat(audio): auto-sandbox VST3s that crash the app + embed sandboxed editors (#133)
- feat(audio): engine-side note verification for note_detect (NoteVerifier background thread, ChordScorer harmonicVerify, OnsetDetector) (#158)
- feat(branding): adopt community-contributed app icon (#71)
- feat(desktop): opt-in debug logging to a single file (#105)
Fixes
- fix(dev): rscli env vars + JUCE backing-track diagnostics (#50)
- fix: make desktop plugin hooks idempotent (#51)
- fix: localhost media permissions + Linux PipeWire flag (#60)
- fix(build): verify bundled ffmpeg has libvorbis encoder, macOS static binaries (#66)
- fix(build): bundle ffmpeg/ffprobe shared libs (#77)
- fix(audio): disable LV2 plugin host on Windows and macOS (#80)
- fix: low notes on bass not being detected (#102)
- fix(desktop): make debug stderr redirect work without a console (#115)
- fix(audio): tone output gain no longer moves song volume (#116)
- fix(audio): chord scorer FFT must be out-of-place (#132)
- fix(audio): MP3 backing support + monitor-mute suppression (#142)
- fix(audio-engine): keep a hand-built chain across song start (#143)
- fix(audio): restore VST state when the tone-switcher rebuilds a chain (#144)
- fix(build): build RsCli from slopsmith source so Mac PSARCs decode (#147)
- fix(python): kill the server's process group so the port is freed on exit (#159)
Other
- docs: add install section with prebuilt download links (#84)
- fix(dev): flexible Slopsmith path, ffmpeg/vgmstream checks, plugin dir docs (#91)
- chore: relicense to AGPL-3.0-only (#149)
Slopsmith core (slopsmith)
Features — 3D Highway
- feat(highway-3d): chart anchors, nut/tuning, and visual polish: camera, lanes, chords (#215)
- feat(highway-3d): 3D bend and hammer-on/pull-off markers (#304)
- feat(highway-3d): chord-frame verdict tint + skip per-note sparkle on chord constituents (#316)
- feat(highway-3d): frethand-mute chord strum indicator, sustain bloom, technique marker overhaul v3.17.0 (#329)
- feat(highway-3d): visual improvements, render order fixes, speed tuning (#303)
- feat(highway-3d): enhance visuals and customization controls (#257)
- fix(highway-3d): fix missing arpeggio notes inside frame boxes (#262)
- fix(highway-3d): single sustain trail for open strings inside a chord shape (#327)
Features — Plugin API
- feat(plugin-api): emit
loop:restartevent when A-B loop wraps (#198) - feat(plugin-api): emit
song:seekon every audio reposition (#199) - feat(plugin-api): expose
setLoop/clearLoop/getLooponwindow.slopsmith(#200) - feat(plugin-api): enrich
song:play/pause/endedwith audioT, chartT, perfNow (#201) - feat(plugin-api): emit
beats:loadedwhen WS delivers the beats array (#249) - feat(plugin-api): expose
highway.getAudioElement()(#250) - feat(plugin-api): monotonic
highway.getTime()via perfNow interpolation (#251) - feat(highway): per-note judgment hook so scorers can light up gems and sustains (#256)
Features — Library & Content
- feat: loose folder support as a first-class library format (#255)
- feat(gp-import): support extended-range guitar (7/8-string) and bass (5/6-string) (#258)
- feat(gp-import): expand repeats, voltas, and D.S./D.C./Coda/Fine jumps (#260)
- feat: upload songs via UI (#263)
- feat(tour-engine): consolidate per-plugin
?triggers into one menu (#272) - feat(plugins): bundled Library and Settings guided tours (#290)
- feat(sloppak): sweep orphaned
s2p_*temp dirs on startup (#292)
Fixes
- fix(highway): surface JUCE backing-track load failures via HTML5 fallback (#213)
- fix: guard plugin script rehydration (#214)
- fix/song volume — fixes volume controls on 3D highway view (#211)
- fix(highway): skip rAF draw when hidden; emit
highway:visibility(#252) - fix(splitscreen): don't flash the library in pop-out windows (#253)
- fix(ffmpeg): prefer bundled binary + libvorbis fallback for sloppak conversion (#273)
- fix(ui): scroll plugins navbar dropdown when list exceeds viewport (#283)
- fix(sloppak): atomic write in
convert_psarc_to_sloppak(#291) - fix(sloppak): carry guitar tones through PSARC→sloppak conversion (#308)
- fix(highway): await native-audio barrier before backing-track load (#310)
- fix(audio-mixer): Song fader drives the stems master gain (#324)
- fix(audio): re-route song audio when the JUCE engine starts/stops (#325)
- fix(audio-mixer): guard the JUCE setGain call against a synchronous throw (#326)
Other
- Honor left hand setting (#209)
- Add inline A/V offset slider to player controls (#274)
- chore: relicense to AGPL-3.0-only (#275)
- chore: close out
print()audit for server.py + lib/ (#278) - feat: Add Simplify Chords plugin to the collection (README) (#295)
- docs: note_detect tuning workflow + benchmark sloppak (#265)
- Updated README with Apache reverse proxy configuration (#259)
- Added Docker/Portainer Setup Guide to README (#271)
- Add Tuner plugin to README (#244)
- Shell script to build the rootfs (#212)
Bundled plugin updates
🎸 Note detection — engine-side verification
Note detection scores a player's guitar against the loaded CDLC chart, always ending in recordJudgment() driving the HUD and live-scoring events. What changed in 0.2.8 is where and how that scoring runs on desktop.
The browser path — Web Audio / getUserMedia, detection entirely in the renderer — is unchanged and remains the fallback when the desktop engine or its NoteVerifier API is unavailable.
Browser path (unchanged fallback):
Previously, the detect loop lived in the renderer as a ~50 ms setInterval. Each tick reached into the JUCE engine over IPC — getPitchDetection for a monophonic pitch readout, scoreChord to verify it against the chart. This worked, but the loop was at the mercy of the renderer: during dense passages the WebGL highway kept the renderer busy for 1–3 seconds at a stretch, and any notes that came due during the stall were simply never scored. Whole runs of 10–15 notes could disappear silently.
Before — renderer loop, per-tick IPC:
In 0.2.8, the chart is pushed to the engine once at song/arrangement load via setChart. A dedicated JUCE background thread — the NoteVerifier, running at ~100 Hz — handles all scoring independently, so the renderer's frame budget is no longer part of the critical path. The renderer pushes a playhead position and drains completed verdicts with a single getNoteVerdicts IPC call per tick.
Two precision improvements come with it. Timing now comes from a spectral-flux onset detector with ~5 ms resolution, replacing the coarse ~85 ms FFT window. Pitch is verified by a harmonic-comb scorer with a fundamental-presence gate, which rejects octave doublings and harmonically-related false positives that the old path would occasionally accept.
Now — engine-side NoteVerifier:
Note Detection (byrongamatos/slopsmith-plugin-notedetect)
- feat: route Detect through slopsmith-desktop JUCE bridge when present (#27)
- feat: consume desktop input-frame stream for chord scoring on Electron (#28)
- feat: consume desktop
audio.scoreChordIPC for chord scoring (#29) - feat: light up the highway gem on a hit; keep held sustains glowing (#30)
- feat: drill mode — per-iteration scoring driven by
loop:restart(#26) - feat: note-detect tuning toolkit — miss diagnostic, recording, A/V auto-calibrate (#31)
- fix: make settings popover scrollable on short displays (#34)
- fix: portable static-dir resolution — native uvicorn + desktop + Docker (#32)
- fix: refresh arrangement/tuning on
song:loaded(#33) - fix: lower audio-input latency (latencyHint + smaller ScriptProcessor frame) (#35)
- feat: auto-tune from current session + Detection-confidence slider (#37)
- fix: separate chord timing-OK window from single-note (#39)
- feat: polyphonic ML note detection (detectNotes) + chord-timing fixes (#44)
- feat: arm-for-training + auto-upload to curated pCloud dataset (#45)
- feat: end-of-song summary modal + auto-re-enable Detect across songs (#36)
- feat(notedetect): engine-side chart verification on the desktop bridge (#46)
NAM Tone (byrongamatos/slopsmith-plugin-nam-tone)
- feat: expose
window.slopsmithAudioBarrierfor song-entry sequencing (#10) - fix(nam): Amp fader drives guitar-only chain gain, not master (#11)
Editor (byrongamatos/slopsmith-plugin-editor)
- feat: replace audio for loaded sessions (#13)
- feat: extended-range guitar/bass support and sloppak fallback on build (#24)
Splitscreen (topkoa/slopsmith-plugin-splitscreen)
- fix: stop 3D Highway viz leaking full-screen behind splitscreen panels (#49)
- feat: per-panel viz controls in a "3D ⚙" popover (descriptor-driven) (#50)
- fix(popout): dedup time broadcasts, re-install follower audio shim, reap dead popups (#51)
- Use
highway:visibilitycontract instead of hand-hiding viz overlays (#52) - Harden pop-out (follower-window) feature (#53)
- feat: add guided tour (1.9.0) (#54)
- Rename per-panel "Mastery" slider to "Difficulty" (#55)
Sloppak Converter (topkoa/slopsmith-plugin-sloppak-converter)
- fix(ui): scroll progress panel when many conversions queued (#21)
- feat(queue): persist jobs across server restarts (#22)
Stems (topkoa/slopsmith-plugin-stems)
Update Manager (masc0t/slopsmith-update-manager)
- feat: surface plugin versions; pin to specific version; detect bundled-install updates (#6)
- feat: per-plugin Check button for on-demand recheck (#7)
- fix: pick freshest of marker / .git in
_resolve_source(#8) - fix: detect external restarts so pending-restart UI auto-clears (#9)
- fix: bulk /updates never spends api.github.com budget; Check button always on external rows (#10)
Drums (byrongamatos/slopsmith-plugin-drums)
- fix: gear insert selector matching nested mixer button (#3)
Tones (byrongamatos/slopsmith-plugin-tones)
- feat: read tone data from converted sloppaks (#13)
JumpingTab (renanboni/slopsmith-plugin-jumpingtab)
- docs(spec-kit): add retrospective specs and tooling (#14)
Idempotent hooks fixes (multiple plugins)
The following plugins received an idempotent hooks installation fix that prevents double-registering event listeners when the desktop reloads a plugin: fretboard (#3), metronome (#1), midi (#2), practice (#1), profileimport (#1), sectionmap (#3), setlist (#1), studio (#1), tabview (#12), tones (#5).
Contributors
Thank you to everyone who shipped code into this release:
- @ahonnecke
- @barlind
- @bkranendonk
- @byrongamatos
- @hoblin
- @hjaeger-reporic
- @Johnnycyan
- @jweibel22
- @mbanks850
- @OmikronApex
- @obb8888
- @rodsakuramoto
- @sakrafd
- @topkoa
- @vdwstoffel
Full desktop changelog: v0.2.7...v0.2.8
What's Changed
- fix(dev): rscli env vars + JUCE backing-track diagnostics by @byrongamatos in #50
- fix: make desktop plugin hooks idempotent by @barlind in #51
- fix: localhost media permissions + Linux PipeWire flag (closes #52) by @byrongamatos in #60
- feat(audio): stream raw input frames for renderer-side chord scoring by @byrongamatos in #61
- feat(audio): native polyphonic chord scorer (Constitution II) by @byrongamatos in #62
- feat(audio): sandboxed VST3 host for Qt-using plugins (Windows) [WIP] by @byrongamatos in #63
- feat(sandbox): inline MIDI in audio shm + audio-thread sync (protocol v2) by @byrongamatos in #64
- fix(build): verify bundled ffmpeg has libvorbis encoder (+ macOS static binaries) by @byrongamatos in #66
- feat(branding): adopt community-contributed app icon (closes #53) by @byrongamatos in #71
- fix(build): bundle ffmpeg/ffprobe shared libs (closes #68) by @byrongamatos in #77
- fix(audio): disable LV2 plugin host on Windows and macOS by @byrongamatos in #80
- docs: add install section with prebuilt download links by @hjaeger-reporic in #84
- feat(audio): scan VST plugins out-of-process on Windows by @byrongamatos in #95
- feat(desktop): opt-in debug logging to a single file by @byrongamatos in #105
- fix: Low notes on Bass not being detected at all. by @Johnnycyan in #102
- fix(desktop): make debug stderr redirect work without a console by @byrongamatos in #115
- fix(audio): tone output gain no longer moves the song volume by @byrongamatos in #116
- fix(dev): flexible Slopsmith path, ffmpeg/vgmstream checks, plugin dir docs by @sakrafd in #91
- feat(audio): polyphonic ML note detection via Basic Pitch + ONNX Runtime by @byrongamatos in #130
- Auto-sandbox VST3s that crash the app + embed sandboxed editors by @byrongamatos in #133
- fix(audio): chord scorer FFT must be out-of-place by @hoblin in #132
- fix(audio): MP3 backing support + monitor-mute suppression by @byrongamatos in #142
- fix(audio): restore VST state when the tone-switcher rebuilds a chain by @byrongamatos in #144
- fix(audio-engine): keep a hand-built chain across song start by @byrongamatos in #143
- chore: relicense to AGPL-3.0-only by @topkoa in #149
- fix(build): build RsCli from slopsmith source so Mac PSARCs decode by @byrongamatos in #147
- fix(python): kill the server's process group so the port is freed on exit by @byrongamatos in #159
- feat(audio): engine-side note verification for note_detect by @byrongamatos in #158
New Contributors
- @hjaeger-reporic made their first contribution in #84
- @Johnnycyan made their first contribution in #102
- @sakrafd made their first contribution in #91
- @hoblin made their first contribution in #132
- @topkoa made their first contribution in #149
Full Changelog: v0.2.7...v0.2.8
What's Changed
- fix(dev): rscli env vars + JUCE backing-track diagnostics by @byrongamatos in #50
- fix: make desktop plugin hooks idempotent by @barlind in #51
- fix: localhost media permissions + Linux PipeWire flag (closes #52) by @byrongamatos in #60
- feat(audio): stream raw input frames for renderer-side chord scoring by @byrongamatos in #61
- feat(audio): native polyphonic chord scorer (Constitution II) by @byrongamatos in #62
- feat(audio): sandboxed VST3 host for Qt-using plugins (Windows) [WIP] by @byrongamatos in #63
- feat(sandbox): inline MIDI in audio shm + audio-thread sync (protocol v2) by @byrongamatos in #64
- fix(build): verify bundled ffmpeg has libvorbis encoder (+ macOS static binaries) by @byrongamatos in #66
- feat(branding): adopt community-contributed app icon (closes #53) by @byrongamatos in #71
- fix(build): bundle ffmpeg/ffprobe shared libs (closes #68) by @byrongamatos in #77
- fix(audio): disable LV2 plugin host on Windows and macOS by @byrongamatos in #80
- docs: add install section with prebuilt download links by @hjaeger-reporic in #84
- feat(audio): scan VST plugins out-of-process on Windows by @byrongamatos in #95
- feat(desktop): opt-in debug logging to a single file by @byrongamatos in #105
- fix: Low notes on Bass not being detected at all. by @Johnnycyan in #102
- fix(desktop): make debug stderr redirect work without a console by @byrongamatos in #115
- fix(audio): tone output gain no longer moves the song volume by @byrongamatos in #116
- fix(dev): flexible Slopsmith path, ffmpeg/vgmstream checks, plugin dir docs by @sakrafd in #91
- feat(audio): polyphonic ML note detection via Basic Pitch + ONNX Runtime by @byrongamatos in #130
- Auto-sandbox VST3s that crash the app + embed sandboxed editors by @byrongamatos in #133
- fix(audio): chord scorer FFT must be out-of-place by @hoblin in #132
- fix(audio): MP3 backing support + monitor-mute suppression by @byrongamatos in #142
- fix(audio): restore VST state when the tone-switcher rebuilds a chain by @byrongamatos in #144
- fix(audio-engine): keep a hand-built chain across song start by @byrongamatos in #143
- chore: relicense to AGPL-3.0-only by @topkoa in #149
- fix(build): build RsCli from slopsmith source so Mac PSARCs decode by @byrongamatos in #147
- fix(python): kill the server's process group so the port is freed on exit by @byrongamatos in #159
- feat(audio): engine-side note verification for note_detect by @byrongamatos in #158
New Contributors
- @hjaeger-reporic made their first contribution in #84
- @Johnnycyan made their first contribution in #102
- @sakrafd made their first contribution in #91
- @hoblin made their first contribution in #132
- @topkoa made their first contribution in #149
Full Changelog: v0.2.7...v0.2.8


