Changelog
Release history for Sanic Boom
v1.2.2
Export
- MIDI export — export songs as Standard MIDI Files (SMF Type 1) with one track per
playstatement, preserving notes, velocities, tempo, and time signature - Stem export — "Export Stems" button creates a folder with individual stereo WAV/FLAC/MP3 files per sound, a stereo master mix, and a combined MIDI file
- Stems with the same variable name merge into one file —
play riff |> sinein "intro" andplay riff |> sawin "chorus" combine into oneriffstem - MIDI format option in export dialog with
.midextension and hidden audio-only settings
UI
- Export dialog auto-sizes to fit content
v1.2.1
Language
- One-shot sample playback —
play sample("vocals.wav") |> onceplays a sample once per section, re-triggers on arrangement loop - Fix
sample() |> begin() |> end()pipe syntax — Instrument values now create proper trigger notes in pipe chains - Fix Pipeline values in sequences —
[sample("file.wav") |> begin(0.3)]now works correctly
Audio Engine
- Fix section overflow — patterns with
cycleDurationlonger than their section no longer schedule events past the section boundary - Voice release at section boundaries — active voices fade out naturally when their section ends instead of ringing indefinitely
- Fix section scheduling alignment on arrangement loop — sounds now start exactly at section boundaries on every loop, not offset by
cycleDurationstepping - Fix relative sample paths —
sample("samples/file.wav")now resolves from the.sanicfile's directory - Updated
sample()tooltip to showbegin:andend:parameters
v1.2.0
Audio Engine
- Fix voice starvation at high tempos — exponential ADSR release with linear floor prevents zombie voices from exhausting the pool when notes are shorter than attack+decay
- Fix offline export dropping notes — offline renderer now uses 256 synth voices (was 32), matching the live engine
- Remove automatic gain normalization — no more per-voice
sqrt(N)or per-soundsqrt(N)scaling; users control volume withgain()andvolume() - Add NaN/Inf sanitization across acid envelope, effects chain, and audio output to recover from filter instability
v1.1.9
Audio Engine
- Fix crash with 33+ simultaneous sounds — buffer overflow in per-sound voice tracking array caused heap corruption and segfaults
- Fix time signature support —
tempo 72, 3/4and other non-4/4 signatures now schedule notes and display beat indicators correctly - Fix
cat()timing — concatenated patterns now rescale event durations correctly instead of stretching each note across the full cycle - Beat indicator now shows actual beats per bar from time signature instead of deriving from pattern length
v1.1.8
Audio Engine
- Per-sound voice tracking for O(1) audio processing —
processForSound()now iterates only voices belonging to that sound instead of scanning all 832 voice slots - Increase synth voice pool from 32 to 256
v1.1.7
Audio Engine
- Fix voice pool exhaustion causing dropped notes with multiple
playstatements — long-tailed samples (cymbals, open hats) would consume all 16 sample voice slots - Increase voice pool sizes: samples 16→64, FM/wavetable 16→32, granular 8→32
- Fix voices not freeing immediately on file switch — synth/FM/wavetable/granular voices now hard-stop instead of entering slow release fade
v1.1.6
Language
- Microtonal music support — cent offsets on notes (e.g.,
C4+50,Eb3-15) for sub-semitone pitch control - Frequency literals in patterns (e.g.,
432hz) for direct pitch specification - Fractional cent offsets for fine microtuning (e.g.,
E4-13.7)
v1.1.5
Language
- Fix lexer rejecting mixed identifiers like
1_hammer_v3_rr1— numbers followed by underscores or letters are now parsed as identifiers
UI
- Add LAME MP3 Encoder LGPL-2.1 attribution to About dialog
- About dialog now shows dynamic version from build
Windows
- Bundle LAME, FLAC, and OGG DLLs in Windows release package
- Include THIRD_PARTY_LICENSES.txt in Windows distribution
v1.1.4
Sample Browser
- Fix hover preview not playing when audio engine is stopped — engine now starts automatically for preview
- Fix hover preview race condition when quickly moving between samples — container-level exit handler prevents cutting off the new sample
Library Import
- Fix import progress not showing download size — displays MB downloaded when server doesn't report content length
- Fix UI freeze (deadlock) after library import completes — release mutex before emitting signals
v1.1.3
Sample Browser
- Hover-to-preview samples in library sidebar — hovering over a sample plays it instantly, moving the mouse away stops playback
- Fix duplicate libraries appearing in sidebar when re-importing the same library
Library Import
- Async library import — GitHub downloads no longer freeze the UI, progress bar now renders during download
- Show error messages in UI when library download or extraction fails
- Allow UI repainting during synchronous imports (interpreter-triggered)
v1.1.2
Audio Export
- Fix offline export timing jitter — render in 512-sample sub-chunks matching the live audio callback size, eliminating ~93ms timing swing that caused gaps at pattern boundaries and uneven riff intervals
- Fix duration and tail spinners in export dialog not being editable — replace broken SpinBox components with plain TextInput fields
v1.1.1
Audio Engine
- Fix multi-sound distortion — master output now normalizes by 1/√N across sounds, replacing hard clipper that caused periodic buzzing with 4+ simultaneous voices
Rendering
- Force OpenGL RHI backend — fixes extreme slowness with multiple inline waveform visualizations on macOS (Metal backend caused software fallback for QQuickPaintedItem)
Editor
- Fix backspace deleting multiple lines when inline visualizations are present — cursor now skips over visualization placeholder lines
- Block typing, Enter, and Delete on visualization placeholder lines
- Auto-nudge cursor off placeholder lines when navigating
Miscellaneous
- Add
acidenv()autocomplete tooltip
v1.1.0
New Effects & Synthesis
- Add
bandpass()andnotch()filters - Add
clip()hard clipper effect - Add
diode()ladder filter — warm, squelchy 4-pole filter with self-oscillation - Add
acidenv()— TB-303 style acid envelope with per-voice filter sweep - Add
perlin()noise modulation source for organic LFO movement
Sample Playback
- Add
begin()/end()for sample slicing - Short-name library imports —
import "salamander-drumkit"instead of full GitHub URL - Fix destructured import aliases for sample libraries
Waveform Visualization
- Per-sound inline waveform scopes — each
waveform()shows its own sound's wave shape - Scrolling min/max waveform display with fine detail (wave shapes visible)
- Amplitude overview visualization (
amplitude()) - GPU-accelerated rendering via QQuickPaintedItem with FBO + MSAA antialiasing
- Filled and outline waveform modes (
waveform(filled: true/false)) - Phase-locked master oscilloscope with zero-crossing trigger
- Fix min/max buffer initialization that caused phantom center line
Quality of Life
- Auto-gain compensation (1/√N) to prevent volume clipping with multiple voices
- Remember last opened directory across file dialog sessions
- Fix offline renderer: master bus effects, acid envelope, sample begin/end, arrangement offset
v1.0.2
- Fix
gain()onstack()— master effects now apply to the mixed output, not individual tracks - Implement
compressor()effect (threshold, ratio, attack, release) - Fix convolution reverb clipping — use real IR library and energy-normalize impulse responses
- Per-group master bus support for multiple play/stack statements
v1.0.1
- Fix chord duration weights —
[Dm:4]syntax now works (was only supported for notes) - Fix
|> volume()in pipelines — now works as an alias forgain()instead of muting sound - Add in-app update checker with auto-check on startup and every 24 hours
- Fix empty email display in Account menu
v1.0.0
Initial release.
- Custom scripting language for live-coding music
- FM, wavetable, and granular synthesis
- Sample playback and library management
- Audio export (WAV, FLAC, MP3)
- Convolution reverb and effects
- Kaleidoscope and particle visualizations