github byrongamatos/slopsmith-desktop v0.2.8

one day ago

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:restart event when A-B loop wraps (#198)
  • feat(plugin-api): emit song:seek on every audio reposition (#199)
  • feat(plugin-api): expose setLoop / clearLoop / getLoop on window.slopsmith (#200)
  • feat(plugin-api): enrich song:play/pause/ended with audioT, chartT, perfNow (#201)
  • feat(plugin-api): emit beats:loaded when 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.scoreChord IPC 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.slopsmithAudioBarrier for 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:visibility contract 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)

  • fix: cold-load race + audio.muted to survive volume listener (#8)
  • feat: quick volume control (#15)

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:

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

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

Full Changelog: v0.2.7...v0.2.8

Don't miss a new slopsmith-desktop release

NewReleases is sending notifications on new releases.