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

Formula Modulator

  • 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)