Repository navigation
Releases: BillTribble/Sangha-Looper
Release list
🎙️ The Native Microphone Permission & Device Recovery Update
- 🎙️ Apple AVFoundation: Added native
AVCaptureDevice requestAccessForMediaType:AVMediaTypeAudioto 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
🌊 The Meters Fix Update ✨
- ✨ Bugfix: Mixer meters now properly decay and drop to zero when playback is stopped.
- ✨ C++ Engine: The
RiffPlaybackEnginenow implements adecayPeaks()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
🎯 The Add Player Fix
🐛 Bug Fixes
- 🖤 Fixed black screen on Add Player — a temporal dead zone violation in
PlayerSetupModalcaused aReferenceErrorwhen 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
🔧 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
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
🎨 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-mixstyling 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
RiffPlaybackEnginecollapsed 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
🌊 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
SessionControllerinto five sub-controllers to drastically improve thread safety and long-term stability. - 💾 Disk IO Optimization: Improved
DiskWriterand 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
✨ 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
✨ 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
✨ 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