Sanic Boom

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 play statement, 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 |> sine in "intro" and play riff |> saw in "chorus" combine into one riff stem
  • MIDI format option in export dialog with .mid extension 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") |> once plays 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 cycleDuration longer 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 cycleDuration stepping
  • Fix relative sample paths — sample("samples/file.wav") now resolves from the .sanic file's directory
  • Updated sample() tooltip to show begin: and end: 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-sound sqrt(N) scaling; users control volume with gain() and volume()
  • 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/4 and 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 play statements — 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() and notch() 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() on stack() — 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 for gain() 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

On this page