Nightly Changelog We are approaching 1.4.0. This changelog was last edited as of 22b29197 (Mar 30, 2026).
Wavetable Script Editor
- New Lua scripting environment, allowing for the generation, programming, and configuration of wavetables from Lua code
- Generated wavetables are applied directly to the wavetable oscillator and can be exported as
.wav and .wt files or specifically for Serum and VCV Rack
- Exported wavetables include metadata to preserve the generating scripts and parameters
- Support for a new
.wtscript preset format that generates the resulting wavetable when loaded
- FFT functions and a new Prelude library with helper functions specifically for wavetable scripting
- Added parameters
voice_count, voice_id, poly_limit, is_rendering_to_ui, scene_mode, play_mode, split_point, mpe_enabled and tuned_key
- Added a global table named
shared which is available to all Formula instances across all voices
- Custom Formula output names now save in Formula presets
- Deprecated macro subscriptions; macros are now always available by default
- Added missing
channel, key, velocity, phase and is_voice parameters to the Formula init function state
- New “Ranged Keytrack” and “Euclidean Sequencer” presets
- The Formula tutorials “Both Time And Space” and “Reich - Piano Phase” now use exact BPM values
- Added confirmation alert when closing the editor with unapplied changes via keybindings
- Fixed a possible crash when switching to an unused output
- Toggleable actions now also accept numeric values (0 or 1) in addition to booleans
- Custom clamp / limit_range function moved to prelude
- Prelude changes:
- Moved registered C functions
clamp and its alias limit_range to Prelude library
- Added
lin_to_dB, dB_to_lin, cumprod, cumsum, linspace, logspace, full, zeros, ones, offset, max_abs and sinc math functions to Prelude
- Added
pb_to_st and cosine_fade modulation functions to Prelude
Code Editor
- Added search (Ctrl/Cmd+F), replace (Ctrl/Cmd+H) and go to line (Ctrl/Cmd+G) functionality
- New syntax highlighting color schemes
- Added occurrence highlighting for selected text, search results and current line for readability
- Syntax highlighting now supports multiline comments
- Code editor now auto-indents for
function, while and if statements
- New line will keep the current indentation level, tab now always adds an indent at the caret position and tab also indents selections
- Backspace now removes one indentation level at a time instead of a single space
- Added auto-insert and auto-enclosure for square brackets, parentheses, curly braces and quotation marks
- Code apply now trims trailing whitespace
- Code editor can scroll and select at the same time and scroll horizontally (Shift+Mousewheel)
- Double-click now selects only one word at a time, triple click selects a line and quadruple click selects all
- Undo/Redo now respond to keys set in the Keyboard Shortcut Editor
- Code editor now saves state for caret position, selection and search/replace/go to line on focus loss
- Code editor state is cleared if a Formula
.modpreset, .wtscript or an .fxp is loaded
- Formula debugger now groups variables into User Variables, Shared and Built-in Variables sections that can be collapsed
- Debugger now always updates on code compilation
- Debugger UI buttons are now accessible to screen readers
- Fixed a possible crash due to recursion in the debugger
- Fixed a bug where moving an LFO parameter with the debugger open would cause the LFO display to stop working
Other Lua Changes
- Added
pairs, unpack, next, type, tostring, tonumber, setmetatable, pcall and xpcall functions to sandbox environment
- Added
string, table function tables and bit module
- Added
print function for console output
- Improved error reporting for script compilation
Plugin
- Don’t use VST3/CLAP host-side context menus in case of an unknown host (fixes crashing on right-click in Mixcraft)
- Surge XT Effects related changes:
- Now responds to
reset() properly
- Improved behavior when changing the zoom level
- Cleaned up the UI code
- Added the necessary entitlements to the macOS standalone app
Standalone
- Added ASIO audio device support on Windows!
MIDI
- Added option to use MPE Timbre as unipolar or bipolar (right-click the MPE Timbre modbutton)
- MIDI learn is now enabled for boolean or integer parameters as well
- Fixed soft takeover of MIDI learned parameters not working properly after loading a patch
Effects
- Added two new effects: Floaty Delay and Convolution:
- For Convolution effect, over 500 factory impulse responses are included
- You can load your own impulse response by drag-and-dropping it onto any Convolution effect parameter or the impulse response menu
- Nimbus now uses the same resampling method as Twist oscillator
- Fixed a problem where CHOW effect’s Mix parameter was stuck at 100%
- Fixed extendable parameters in Waveshaper not responding to Extend Range
DSP
- Added two new Multi filters: Xpander (15 subtypes) and Fast SVF (6 subtypes)!
- Added a new Type 3 subtype for Vintage Ladder filter (based on the corrected model from Huovilainen paper - it is similar to Type 1 in sound but a lot more performant!)
- Fixed wavetable oscillator morph starting from zero on each note when modulated, causing discontinuities at note onset
- Fixed incorrect TX 2, TX 4, TX 6 and TX 8 waveforms (existing incorrect ones are now legacy entries at the bottom of the list)
- Added an option to use mathematically correct tilt noise (right-click the Noise Color slider)
- OB-Xd filter’s 24 dB subtype had an incorrect behavior (it was louder because it contained both the 18 dB and 24 dB outputs mixed together) - this is now a legacy subtype, and a new subtype with correct behavior was added
- BP filter’s 12 dB Driven and Clean subtypes had incorrect coefficients - similar to above, legacy subtypes were added
- Removed dependency on
juce::dsp in Ensemble and Neuron effects
Tuning
- Fixed loading of SCL/KBM files that contain Unicode characters on Windows
- Use the scale period for channel per octave mode when MTS-ESP is enabled
Modulation
- Fixed MSEG gate mode snapping to zero on release when the loop endpoint has equal start and end values
- Fixed LFO Amplitude extend range option to correctly use a -1 to 1 range rather than a rescaled 0 to 1 range in bipolar mode
Patch Browser
- Added filtering patches by favorites in the search bar using
FAV= or FAVORITES= keywords
- Patches now auto-load when navigating search results with the keyboard and arrow keys move to the next or previous result rather than jumping to the first
- Pressing the Find Patch keybinding while results are shown now closes the patch selector
- Fixed prev/next patch navigation not cycling through favorites when a patch was loaded from the Favorites menu
- Fixed positioning of Author field in Patch Selector
- Fixed patch info tooltip stealing window focus
Accessibility
- Announce the tuning used in the patch, if applicable
- Explicitly set tab focus order for MSEG editor buttons
UI/UX
- Added option to use a software renderer on Windows
- Added support for portable user data folder on Linux
- Use wavetable name as default filename when exporting a wavetable
- Wavetable name in the oscillator display now supports unicode characters
- Make the menu entry to rename the wavetable consistent with other rename actions
- Improved the 3D wavetable display rendering
- Added new editing options to Alias oscillator’s Additive Editor:
- Shift partials left/right
- Keep positive/negative/even/odd harmonics
- Invert odd/even harmonics
- Soften (great to use after Randomize)
- Window (linear and cosine)
- Alt/Opt+click on a harmonic will invert its phase
- Added keybinding for toggling the Wavetable Script editor (Alt/Opt+W by default)
- Added a new virtual keyboard QWERTY mapping that covers two octaves
- Replaced hardcoded QWERTY velocity shortcuts with a new option in Workflow menu to set overall velocity by clicking on the virtual keyboard
- Keyboard shortcut descriptions in menus now reflect user-customized or disabled bindings
- Fixed glitchy behavior when dragging modbuttons (also, the modbutton is now showing a bit more transparent while being dragged around)
- LFO display is now cached to improve performance
- LFO preset menu now has separate factory and user columns
- Added duration, value and control point menu entries to MSEG right-click context menu - this also allows editing those values by typing them in!
- Fixed a minor issue with horizontal ruler labels in MSEG editor
- Fixed Step Sequencer value typeins not working in certain situations
- Minor adjustment in the default size and position of some overlay windows
- Increased the width of tone text fields in the Tuning Editor’s polar mode
- Added confirmation dialog when overwriting FX and modulation presets
- Added cutoff and resonance value tooltip to Filter Analysis overlay
- Fixed some incorrect mouse hitzones in Filter Analysis overlay (clicks outside of the graph used to be recognized as valid)
- Fixed the incorrect value display for FM3 oscillator’s M3 Frequency parameter
- Fixed Alt/Opt+click to clear FX slot not working
- Fixed multibuttons (Scene Mode, Character, FX Bypass, Osc/Scene Octave…) not updating their state on mouse drag
- Added tooltips to icons on the About page
Open Sound Control
- FX Parameter name changes update in a more granular fashion
- Oscillator changes now send more complete info to OSC out
- Fixed a possible crash when receiving OSC note commands due to an incorrectly set active state
Command Line Interfaces
- Added Rust bindings!
- Explicitly set process input to false
- Ability to load a wavetable into a patch
- Added arguments to enable MPE and set MPE pitch bend range
- Fixed SurgePy so that it builds properly on Windows
- Don’t use
SURGE_SKIP_ODDSOUND_MTS or VST2 SDK for SurgePy builds
Infrastructure
- Updated C++ standard from C++17 to C++20
- Enabled SSE4.1 compiler optimizations on x86 platforms
- Moved from Azure to GitHub Actions
- Removed Windows 32-bit build
- Moved Linux binary distribution to a Ubuntu 20 Docker image
- Moved to Clang on Windows 64-bit
- Moved to JUCE 8.0.10, requiring Windows 10 and macOS 10.13
- Made sure that the codebase can be built with either JUCE 7 or JUCE 8
- Moved to latest CLAP JUCE Extensions library
- Added
ARM64 and ARM64EC Windows builds
- Added
SURGE_BUILD_CLAP option to CMake
- Added SurgePy as a CI step
- Added several tests for
load_xml() method, preventing segfaults on bad data inputs
- Added a test which checks that our template patches don’t have bypassed filters and waveshaper
- New LuaJIT library build system
- Merged support for Linux builds using
musl rather than glibc
- Enabled Link Time Optimization (LTO) for release builds, with a CMake option to disable it (
-DENABLE_LTO=OFF)
- Fixed a build error with glibc 2.43 caused by stricter const-correctness in bundled SQLite library
- Fixed some configure and build time errors for VS2026
Installers
- Updated Inno Setup to version 6.7.1 and switched to
lzma2/ultra64 for max compression
- Disabled misleading “components already exist” warnings for data, patches and wavetables folders
- Added resetting the AU plugin registrar action to the macOS installer
- New installations will create the user data folder under
Documents/Surge Synth Team/Surge XT instead of Documents/Surge XT as it used to be so far
- Existing installations are not affected!
Code Factoring and Quality
- Moved oscillator unison/drift/character support to
sst-basic-blocks submodule
- Moved Reverb 2, Treemonster, Nimbus, Rotary Speaker to
sst-effects submodule
- Removed old and unused allpass filter code
- Removed old and unused Mac-only SIMD code in Window oscillator
- Updated
eurorack submodule to build with MSVC Clang
- Updated
pybind to 2.13.5
- Removed
libsamplerate dependency
- Increased MSVC stack size for debug builds to allow Formula modulator tests to be reliable
- Fixed some possible MSVC debug build related crashes and warnings in the testrunner
- Switched to not using
simde native aliases to accommodate ARM64EC build
- Cleaned up a collection of issues identified by static analysis tool PVS-Studio
- Fixed several uninitialized memory issues identified by Valgrind
- Fixed parameter value display precision being incorrectly derived from a boolean in several places
Smaller Changes and Fixes
- Better error reporting when a file operation fails
- Fixed a possible crash when loading a patch with an out of range morph value
- Fixed some corrupted parameters in Inigo Kennedy’s patches
- Fixed modulator presets not saving correctly to subdirectories
- Fixed alert dialog being too small to display longer messages
- Fixed incorrect color for selected MIDI inputs in standalone Audio/MIDI Settings dialog
- Minor menu entry verbiage tweaks in a few places
- Currently selected effect or oscillator is now ticked in their respective context menus
- All template patches now have enabled filters and waveshaper (previously, some had them bypassed, which confused some users)
Content
- 50 new wavetables from Ocean Swift Synthesis
- 48 new wavetables from Philippe Favre
- 46 new patches from Aleksey Zhehanov
- 47 new patches from Black-Sided Sun (Yuri Ilyin)
- 135 new patches from Intuitive Instruments, made especially for their Exquis MPE controller
- 23 new patches from John Valentine and updated several existing patches
- 195 new patches from Lopyt
- 103 new patches from qb
- 13 new wavetable scripts by Surge Synth Team
Diffs Not Processed Into Changelog
These commits have not yet turned into human readable changelog, and are ordered from oldest to latest.
- 698cbba1 Conform name of Modwheel everywhere, reorder MIDI modulators a bit (#7759)
- 110e99fd wavetable morph interpolation discontinuity (#7778)
- d94d252e wavetable morph lag adjustment (#7783)
- 1d986268 Wavetable Option Plubming (#7785)
- 88f96455 wavetable morph adjust (#7789)
- ea8b878b Fix KBM-doesnt-span-tuning-center bug (#7823)
- e96c99dd Expand and fix up rotation view (#7872)
- 7805b5a6 WT legacy config; skin support; control state (#7886)
- 695c84c9 Export BWS WT as well as WAV Wavetables; begin metadata (#7902)
- 73972b2f Init Wavetable turns Legacy Morph mode off (#7905)
- 8912c904 Integrate sst-jucegui as a dependency (#7924)
- 3f5d814a Ignore high-bit keys in the VKB layout on Linux (#7991)
- bb066183 Disable legacy morph mode in remaining WT oscillators (#8037)
- d382b541 Be more defensive in CLAP Preset Discovery under unexpected input (#8056)
- 4561e022 Make sure correct filesize is written in add-surge-metadata.py (#8074)
- db1aa202 Fix out of range vector access in RadialScaleGraph::paint() (#8147)
- a692b0ca Fix long press on Switch and VUMeter not cancelling on mouse up (#8156)
- d728fde4 Rework the user path override (#8162)
- 06745b18 MOve to macOS10.15/Ubuntu22-gcc12 for build minima (#8255)
- e982bafa Show warning message when Open factory patches withoutt factory patches folder (#8261)
- b4631fb0 Add a macOS entitlement required for MTS master on Tahoe (#8276)
- 2eb65b0d Add an option (env guarded) to time preset discovery (#8277)