Skip to content

Releases: BillTribble/Sangha-Looper

🎙️ The Native Microphone Permission & Device Recovery Update

Choose a tag to compare

@BillTribble BillTribble released this 29 Aug 20:37
  • 🎙️ Apple AVFoundation: Added native AVCaptureDevice requestAccessForMediaType:AVMediaTypeAudio to trigger macOS TCC microphone permission dialogs on fresh installations.
  • ⚡ Audio Device Recovery: Standalone app now automatically falls back to system default input devices if a saved device is missing.
  • 🔄 Dynamic Input Re-binding: CoreAudio streams restart seamlessly as soon as the user grants microphone access without requiring an app reboot.
  • 🛡️ Framework Integration: Linked macOS AVFoundation framework directly into CMake build pipeline for robust standalone permission checks.
  • 📦 Build & Release: Release v0.9.4 compiled with full optimizations.

🌊 The Meters Fix Update

Choose a tag to compare

@BillTribble BillTribble released this 18 Jul 15:46

🌊 The Meters Fix Update ✨

  • ✨ Bugfix: Mixer meters now properly decay and drop to zero when playback is stopped.
  • ✨ C++ Engine: The RiffPlaybackEngine now implements a decayPeaks() method so levels drop instantly and accurately rather than freezing in place.
  • ✨ Audio DSP: Replaced Nebula with a new 'Swap' buffer-shuffle effect with 8 patterns and gap gating.
  • ✨ Audio DSP: Added 6 new Trance Gate patterns with Y-axis depth control and variable speed.
  • ✨ Audio DSP: Aligned FX auto-leveling to -12dBFS and refined effect bounds (delay/reverb wet scaling by Y, lower RingMod/Multicomb freq floor).
  • ✨ Audio DSP: Fixed Swap clicks using equal-power sin/cos crossfades at slice boundaries.
  • ✨ Audio DSP: Normalized First Loop Recording handling.
  • ✨ Persistence: Per-jam FX and input settings now save and load correctly in meta.json.
  • ✨ Web UI: Updated mixer player colors to use proper 500-900 graduation.
  • ✨ Build: All automated C++ (Catch2) and UI (Vitest) test suites passed.

🎯 The Add Player Fix

Choose a tag to compare

@BillTribble BillTribble released this 12 Jul 11:42

🎯 The Add Player Fix

🐛 Bug Fixes

  • 🖤 Fixed black screen on Add Player — a temporal dead zone violation in PlayerSetupModal caused a ReferenceError when the modal rendered before the engine confirmed the new player. The entire React tree would crash, leaving a blank screen while audio continued. Reordered the function declarations to eliminate the race.
  • 🛡️ Wrapped Header in ErrorBoundary — any future render crash in the Header or PlayerSetupModal now shows a graceful fallback instead of a black screen.

🔧 The Epic Bug Fix Update

This is a massive maintenance release containing every fix and improvement since v0.7.12. Over 60 commits have gone into making Samsara more stable, smoother, and click-free.

🎵 Audio Engine

  • 🤫 Fixed click sound on new layer addition — the fade-in ramp now only applies to newly added layers, not existing ones. No more discontinuity when stacking loops. Fade length increased from 6ms to 23ms for buttery smooth transitions.
  • 🔄 Runtime equal-power crossfade for seamless loop seams in Layer 1 playback
  • 🧹 Fixed ring-modulated garbage on new layer captures
  • 🎚️ Fixed audio thread violations causing crackling at 32-sample buffer sizes — removed mutex locks from telemetry broadcast on the audio thread
  • ⚡ Replaced SMBPitchShift with Signalsmith Stretch for higher-quality pitch shifting with better performance
  • 📉 Throttled bass-peak metering to ~500ms on the audio thread to reduce CPU load
  • 🛡️ Guarded peak/bass metering by inputActive state; resetPlayer now properly clears metering state
  • 🔗 Offline crossfade loop implemented in RetrospectiveBuffer for clean loop captures
  • 🎯 Fixed first loop quantization to properly snap to 1, 2, 4, 8 bars
  • 🚫 Fixed NaN poisoning in LevelMeter
  • 🎨 Decoupled master reverb algorithm from input reverb algorithm for independent control

🖥️ Web UI & Performance

  • ⚡ Implemented state delta system — the engine now sends incremental state updates instead of full state broadcasts, dramatically reducing WebSocket traffic
  • 🎬 Event-driven telemetry rendering at a stable 30fps — bypasses WKWebView App Nap and throttling issues
  • 🏖️ Fixed UI beachball by throttling high-frequency WebSocket events (FX_PAD/SET_VOLUME) and adding a Watchdog thread
  • 📊 Implemented true event-driven canvas rendering for smooth meter tracking
  • 🔄 Refactored WebSocketController into smaller, focused files
  • 💾 Cached studio scenes/players and debounced device change callbacks to fix audio underruns
  • 🎯 Optimistic UI updates for volume fader changes with volumeTouched indicator
  • 📋 Made FX toggles optimistic for instant visual feedback
  • 🎨 Refined input panel XY pads, controls styling, and effect button chevrons
  • 🔍 FXControlSurface detail pane now stays open when switching effects
  • 📐 Improved Effects Panel vertical spacing

🎛️ Mixer & Layers

  • 🔇 Fixed muted layers showing -3.1dB (0.7f linear gain) after commit
  • 🎚️ Fixed AGC ducking empty tracks
  • 🏷️ Added volume touched indicator at top of fader with reserved space
  • 💪 Fixed commit mix to preserve empty slots for muted layers
  • 🎨 Fixed layer color freshness on muted layer replacement
  • 💥 Fixed muted layer replacement crash
  • 📭 Fixed muted layer state persistence on empty layers in new riffs
  • 🔄 Refactored layer selection to be completely global across all players
  • ⚙️ Fixed layer mute/volume to be 100% non-destructive metadata

📂 Jam Management

  • 🚀 Fast Jam Loading with Lazy Audio + LRU Buffer Cache — jams now open instantly with metadata, audio loads in the background with priority queuing
  • 🗑️ Fixed UI not updating after trashing or creating jams — bypassed 200ms websocket lockout
  • 🆕 Fixed CREATE_JAM to automatically load the newly created jam
  • 🔐 Fixed ERR_UNKNOWN_COMMAND for CREATE_JAM
  • 📥 Fixed auto input switcher restored to App.tsx
  • ⏱️ All Jamlist and Settings UI interactions now bypass the 200ms websocket lockout for instant response

🎸 FX & DSP

  • 🎛️ Fixed FX Reverb Algorithm setting and state delta bug
  • 🔄 Fixed FX bounce bug and Auto All button
  • 🎚️ Fixed FX processing on all layers and First Loop waveform rendering issues
  • 🎨 UI styling updates for FxPanel, ModPanel, and UnifiedFXGrid
  • 🗑️ Removed unused SMBPitchShift.h
  • 🔊 Restored Input Panel Pitch Effect using SignalsmithStretch
  • 🧹 Fixed garbled FX and silent Reverse — two bugs from 2x buffer pre-allocation
  • 🔁 Fixed master reverb algorithm now persists across sessions

🧪 Infrastructure

  • 📦 LRU buffer cache with ~384MB memory bound, evicts oldest non-playing riffs
  • 🔄 Split manifest loading into fast metadata load + deferred audio decoding
  • 📋 Play-before-loaded safety net — promotes riff to front of disk queue, shows spinner, auto-plays on load
  • 🌊 Deep link handling for loading specific jams and riffs
  • 📝 Patent application draft completed
  • 🔧 Refactored WebSocketController into modular components

🔧 The Epic Bug Fix Update

Choose a tag to compare

@BillTribble BillTribble released this 12 Jul 10:36

🔧 The Epic Bug Fix Update

This is a massive maintenance release containing every fix and improvement since v0.7.12. Over 60 commits have gone into making Samsara more stable, smoother, and click-free.

🎵 Audio Engine

  • 🤫 Fixed click sound on new layer addition — the fade-in ramp now only applies to newly added layers, not existing ones. No more discontinuity when stacking loops. Fade length increased from 6ms to 23ms for buttery smooth transitions.
  • 🔄 Runtime equal-power crossfade for seamless loop seams in Layer 1 playback
  • 🧹 Fixed ring-modulated garbage on new layer captures
  • 🎚️ Fixed audio thread violations causing crackling at 32-sample buffer sizes — removed mutex locks from telemetry broadcast on the audio thread
  • ⚡ Replaced SMBPitchShift with Signalsmith Stretch for higher-quality pitch shifting with better performance
  • 📉 Throttled bass-peak metering to ~500ms on the audio thread to reduce CPU load
  • 🛡️ Guarded peak/bass metering by inputActive state; resetPlayer now properly clears metering state
  • 🔗 Offline crossfade loop implemented in RetrospectiveBuffer for clean loop captures
  • 🎯 Fixed first loop quantization to properly snap to 1, 2, 4, 8 bars
  • 🚫 Fixed NaN poisoning in LevelMeter
  • 🎨 Decoupled master reverb algorithm from input reverb algorithm for independent control

🖥️ Web UI & Performance

  • ⚡ Implemented state delta system — the engine now sends incremental state updates instead of full state broadcasts, dramatically reducing WebSocket traffic
  • 🎬 Event-driven telemetry rendering at a stable 30fps — bypasses WKWebView App Nap and throttling issues
  • 🏖️ Fixed UI beachball by throttling high-frequency WebSocket events (FX_PAD/SET_VOLUME) and adding a Watchdog thread
  • 📊 Implemented true event-driven canvas rendering for smooth meter tracking
  • 🔄 Refactored WebSocketController into smaller, focused files
  • 💾 Cached studio scenes/players and debounced device change callbacks to fix audio underruns
  • 🎯 Optimistic UI updates for volume fader changes with volumeTouched indicator
  • 📋 Made FX toggles optimistic for instant visual feedback
  • 🎨 Refined input panel XY pads, controls styling, and effect button chevrons
  • 🔍 FXControlSurface detail pane now stays open when switching effects
  • 📐 Improved Effects Panel vertical spacing

🎛️ Mixer & Layers

  • 🔇 Fixed muted layers showing -3.1dB (0.7f linear gain) after commit
  • 🎚️ Fixed AGC ducking empty tracks
  • 🏷️ Added volume touched indicator at top of fader with reserved space
  • 💪 Fixed commit mix to preserve empty slots for muted layers
  • 🎨 Fixed layer color freshness on muted layer replacement
  • 💥 Fixed muted layer replacement crash
  • 📭 Fixed muted layer state persistence on empty layers in new riffs
  • 🔄 Refactored layer selection to be completely global across all players
  • ⚙️ Fixed layer mute/volume to be 100% non-destructive metadata

📂 Jam Management

  • 🚀 Fast Jam Loading with Lazy Audio + LRU Buffer Cache — jams now open instantly with metadata, audio loads in the background with priority queuing
  • 🗑️ Fixed UI not updating after trashing or creating jams — bypassed 200ms websocket lockout
  • 🆕 Fixed CREATE_JAM to automatically load the newly created jam
  • 🔐 Fixed ERR_UNKNOWN_COMMAND for CREATE_JAM
  • 📥 Fixed auto input switcher restored to App.tsx
  • ⏱️ All Jamlist and Settings UI interactions now bypass the 200ms websocket lockout for instant response

🎸 FX & DSP

  • 🎛️ Fixed FX Reverb Algorithm setting and state delta bug
  • 🔄 Fixed FX bounce bug and Auto All button
  • 🎚️ Fixed FX processing on all layers and First Loop waveform rendering issues
  • 🎨 UI styling updates for FxPanel, ModPanel, and UnifiedFXGrid
  • 🗑️ Removed unused SMBPitchShift.h
  • 🔊 Restored Input Panel Pitch Effect using SignalsmithStretch
  • 🧹 Fixed garbled FX and silent Reverse — two bugs from 2x buffer pre-allocation
  • 🔁 Fixed master reverb algorithm now persists across sessions

🧪 Infrastructure

  • 📦 LRU buffer cache with ~384MB memory bound, evicts oldest non-playing riffs
  • 🔄 Split manifest loading into fast metadata load + deferred audio decoding
  • 📋 Play-before-loaded safety net — promotes riff to front of disk queue, shows spinner, auto-plays on load
  • 🌊 Deep link handling for loading specific jams and riffs
  • 📝 Patent application draft completed
  • 🔧 Refactored WebSocketController into modular components

🎯 The First Loop Optimization Update

Choose a tag to compare

@BillTribble BillTribble released this 03 Jul 21:22

We've made several important backend optimizations and bug fixes to improve reliability, particularly around First Loop behavior and layer selection. Here's what's new:

  • 🌍 Global Layer Selection: Refactored layer selection to be completely global across all players.
  • 🎛️ First Loop Fixes: Fixed FX processing issues across all layers and First Loop waveform rendering.
  • 🛡️ Stability Improvements: Resolved thread-safety issues, NaN poisoning in the LevelMeter, and clock-skew bugs.

🐛 The Stereo Loop Bug Fix Update

Choose a tag to compare

@BillTribble BillTribble released this 02 Jul 10:07

🎨 The Dynamic Shadows Update

The latest version of Samsara Looper brings a beautiful visual refresh with dynamic theme syncing and several important audio bug fixes!

  • 🎨 Dynamic Theme Accents: Replaced static RGBA drop shadows across the entire UI with dynamic color-mix styling that links directly to your chosen theme accent, ensuring glowing components perfectly match your custom vibe!
  • 📱 iPad Layout Polish: Fixed clashing green panel border shadows in the widescreen/iPad layouts, bringing them in line with the uniform cyan theme accent.
  • 🎧 Stereo Submix Fix: Addressed a critical multitrack routing bug where RiffPlaybackEngine collapsed stereo loops to mono when 8-channel mode was enabled. Loops now properly maintain their stereo field while summing to the main mix and routing to dedicated multi-outs.
  • 🎛️ Scratch FX Updates: Refined the "Scratch" effect to start at a higher pitch for more aggressive divebombs, and temporarily swapped the "Gate" effect back to "Pan" on the UI grid.

🛠️ The Refactor Update

Choose a tag to compare

@BillTribble BillTribble released this 02 Jul 07:49

🌊 The Smooth Reverb Update

The latest version of Samsara introduces significantly smoother dynamics, tighter multiplayer interfaces, and a massive architectural refactoring for better stability!

  • 🎚️ AGC / Auto-Ducking Upgrade: Overhauled the internal ducking logic to use an RMS-balanced uniform approach instead of a peak-based one, completely eliminating the compounding volume drop when adding new layers.
  • 👤 Impersonation UI Fix: The player input dashboard now accurately renders only the active impersonated player's layout, rather than redundantly showing all connected players.
  • 🛠️ Refactoring Architecture: Decomposed the SessionController into five sub-controllers to drastically improve thread safety and long-term stability.
  • 💾 Disk IO Optimization: Improved DiskWriter and safely extracted thread-blocking export logic away from the main Message Thread.
  • 🎛️ Mod Panel Fixes: Restored missing desktop mod panels and properly synced mod dial names instantly without UI latency.
  • 🎸 Resonator Effect: Fully migrated and configured the new Resonator FX, replacing the old Zap Delay, now tuned specifically for 4ths/5ths/Octaves.
  • ⚡ Performance Logging: Improved system diagnostics, including real-time toast notifications for audio routing and export actions.

✨ The Setup Ghostbuster Update

Choose a tag to compare

@BillTribble BillTribble released this 28 Jun 22:48

✨ The Ghostbuster Update

  • 👻 Removed the hardcoded default Ghost emoji for Player 1, randomizing it on scene load like other players
  • 🎛️ Replaced "Zap Delay" with a brand new "Resonator" effect
  • 🔊 Implemented offline static normalization for loop captures
  • 📉 Removed hardcoded -3dB auto-ducking to take full advantage of the new Automatic Gain Control (AGC)
  • 🎨 UI Polish: Refined the active player border, increased spacing, and added a divider before the jam name
  • 🖥️ UI Polish: Added text to the "Add Player" button on wider screens
  • 🐛 Fixed a bug where C++ backend emoji generation caused mojibake encoding issues (moved randomization logic to React frontend)

✨ The Ghostbuster Update

Choose a tag to compare

@BillTribble BillTribble released this 28 Jun 21:59

✨ The Ghostbuster Update

  • 👻 Removed the hardcoded default Ghost emoji for Player 1
  • 🎲 Player 1 now starts completely randomized on a fresh scene load like all other players

✨ The Expressive Emoji Update

Choose a tag to compare

@BillTribble BillTribble released this 28 Jun 21:44

✨ The Expressive Emoji Update

  • 🦄 Added a curated set of factory default emojis exclusively from the non-yellow-face collection
  • 🐼 Players are now automatically assigned completely unique emojis when they join or are initialized
  • 🚀 Fixed deep C++ text encoding issues that caused mojibake when restoring sessions