Nightly Changelog

We are approaching 1.4.0. This changelog was last edited as of fda3409f (Oct 10, 2025).

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
  • Includes a collection of wavetable scripts for use, exploration, and learning
  • 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 and velocity 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

Open Sound Control

  • FX Parameter name changes update in a more modulator / granular fashion

Effects

  • Added a new effect: Floaty Delay!
  • Nimbus now uses the same resampling method as Twist oscillator
  • Fixed a problem where CHOW mix was stuck at 100%
  • Fixed a problem where, in certain configurations at very low drive, the Distortion effect could become unstable

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 occurance highlighting for selected text, search results and added highlighting for 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
  • Undo/Redo now respond to keys set in the Keyboard Shortcut Editor
  • Code editor now saves state for caret position, selection and search/replace/goto line on focus loss
  • Code editor state is cleared if a Formula .modpreset, .wtscript or a .fxp is loaded
  • Formula debugger now groups variables under user, shared and built-in sections that can be collapsed
  • Debugger now always updates on code compilation
  • Debugger UI buttons are now accessable
  • 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

SurgePy

  • Explicity set process input to false
  • Ability to load a wavetable into a patch

Infrastructure

  • 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.4, requiring Windows 10 and macOS 10.13
  • Began an ARM64EC Windows build
  • New LuaJIT library build system
  • Merged support for Linux builds using musl rather than glibc

Code Factoring and Quality

  • Move the oscillator unison/drift/character support to sst-basic-blocks submodule
  • Remove old and unused allpass filter code
  • Move Reverb 2, Treemonster, Nimbus, Rotary Speaker to sst-effects submodule
  • Update eurorack submodule to build with MSVC Clang
  • Remove dependency on libsamplerate
  • Increase the MSVC stack size in debug builds to allow Formula modulator tests to be reliable
  • Switch to not using simde native aliases to accomodate ARM64EC
  • Clean up a collection of issues identified by static analysis tool insert link to tool

Other UI/UX changes

  • Use wavetable name as default filename when exporting a wavetable
  • Make the menu entry to rename the wavetable consistent with other rename actions
  • Added keybinding for toggling the Wavetable Script editor (Alt/Opt+W by default)
  • Explicitly set tab focus order for MSEG editor buttons

Diffs Not Processed Into Changelog

These commits have not yet turned into human readable changelog, and are ordered from oldest to latest.

  • 510451c4 Add an ifnrastructure test to sanity check templates (#7709)
  • c914d3bb Add voice data to formula modulator (#7727)
  • 3d4f07d4 Lua sandbox changes (#7743)
  • 1fd80a82 Fixes #7746 in non-MPE branch (#7749)
  • fa13f6b4 Formula tweaks (#7751)
  • 6c59e385 Fix testrunner warnings (#7745)
  • 68494b14 Clang on windows is now really clang on windows (#7756)
  • 8b615f4f WTSE overview class refactor (#7755)
  • 821dd5f7 Formula scene/play mode variables (#7758)
  • 698cbba1 Conform name of Modwheel everywhere, reorder MIDI modulators a bit (#7759)
  • 51b9dc7c Open Sound Control: better reporting of oscillator changes (#7760)
  • 4bf72659 Adds new Formula scene vars to debugger and display calls (#7762)
  • 0f7f8777 Splits prelude into WTSE/Formula and adds it to WTSE (#7764)
  • 9c5304f6 WTSE UI stuff (#7767)
  • 82f86a24 initial morph value fix (#7775)
  • 7b9c7136 Deal with CLI/OSC crash due to active state being mis-set (#7780)
  • 110e99fd wavetable morph interpolation discontinuity (#7778)
  • d94d252e wavetable morph lag adjustment (#7783)
  • 1d986268 Wavetable Option Plubming (#7785)
  • 736ca19b morph switch (#7787)
  • 88f96455 wavetable morph adjust (#7789)
  • 86c8ec7b XCode 16 and LuaJit no dedup workaround (#7793)
  • 3cea5c86 new 3D wavetable display (#7799)
  • e09d1226 Fix MSEG horizontal ruler text issue (#7806)
  • e63fa3fe WT minor tweaks (#7807)
  • fb501616 Remove a temp file
  • 2531fadf Add a few super lightweighx load_xml tests (#7818)
  • 815886a7 Windows SurgePY fix; SurgePY in CI for PR (#7819)
  • 54e78fbb wt switch / oneshot (#7820)
  • 60ee6679 changes to README (#7821)
  • ea8b878b Fix KBM-doesnt-span-tuning-center bug (#7823)
  • f76645b6 Save Both Time And Space and Piano Phase tutorials with exact BPM values (#7827)
  • d9c1cc49 Changes to allow a lua-free arm64ec build (#7832)
  • d1e4c6f9 Make tone text fields in Tuning Editor wider (#7868)
  • 88f69391 Move to a patched JUCE 8.0.4 (#7869)
  • 72e6b8e5 Move and conslolidate voice count to a Storage atomic (#7870)
  • 8e428de0 Add a CLI argument to enable MPE for a session (#7871)
  • e96c99dd Expand and fix up rotation view (#7872)
  • a1140283 Formula preset with custon out names save names in LFO preset (#7873)
  • e4910b67 Fix Rotary Speaker processOnlyControl (#7875)
  • aed97a26 Fix a problem with occasional unstable low drive distortions (#7876)
  • 92eaeb12 Upgrade clap-juce-extensions; link nightly release to changelog (#7878)
  • 98d2c6fe Work on improving the wavetable evaluator (#7882)
  • aa752295 Some UI fixes and improvements (#7884)
  • 0e384198 Some wavetable editor invalidations I missed (#7885)
  • 7805b5a6 WT legacy config; skin support; control state (#7886)
  • 1b9391f0 Update wtse_prelude.lua (#7887)
  • 03373f93 Some WT Script Tweaks (#7888)
  • f6274e61 Fix a LUA stack leak with a missing init fn in wtse (#7889)
  • ab8acad0 Lua code editors indentation (#7890)
  • cb51d08b Fix a bad merge of some lua changes (#7893)
  • dca86f36 Several WT script editor tweaks (#7892)
  • 5c7355eb Code editor string completion fix (#7894)
  • 3dc58a35 Cache WTSE Evaluation (#7896)
  • 9dda959d Update wtse_prelude.lua (#7898)
  • 57dcd858 Unicode support in OSC waveform display name (#7900)
  • 695c84c9 Export BWS WT as well as WAV Wavetables; begin metadata (#7902)
  • da4630f4 Add metadata into the wt with lua script (#7904)
  • 1adcebfe lfo display caching (#7901)
  • 73972b2f Init Wavetable turns Legacy Morph mode off (#7905)
  • bdcb4467 lua editor trailing fix (#7906)
  • a80f1ea1 Use the WTS Evaluator cache for filmstrip; lazy paint (#7907)
  • 5ba34666 Add pcall and xpcall to Lua env (#7909)
  • 4ceb22b5 code editor search (#7911)
  • dc0eb5c7 Code Editor: Tab with selected text indents selected lines (#7912)
  • da54f47e Fixed crash in code editor prelude
  • 7c081b88 surge-fx: change from bool to std::atomic<bool>
  • 81c7e68f Update WTSE Prelude (#7915)
  • 3a4ff988 Fix 2D table max_val assign in prelude function normalize_peaks() (#7916)
  • 8463ac58 Minor verbiage tweaks in several places (#7917)
  • 0f8f56c8 Lua Editors search (#7918)
  • 59950813 More code editor search features (go to line, whole word…) (#7919)
  • fe778c0d Even more LuaEditors work (#7920)
  • 9df9f5ff Fixes a LuaJIT stack leak on broken generate function error return (#7921)
  • effb1810 Fix CodeEditor indent bug (#7922)
  • 8912c904 Integrate sst-jucegui as a dependency (#7924)
  • 6dea7c34 Update luajitlib (#7929)
  • 27b13fa8 Correct the sst-jucegui URL to be https not ssh (#7931)
  • 4cb028d1 code editor: find & replace (#7932)
  • aaf3c073 Restore python builds, macos, post JUCE8 upgrade (#7939)
  • 26009d8d Add a CLI argument for mpe pitch bend range (#7941)
  • 14676213 Code Editor: result map, auto-enclose, ux improvements(#7940)
  • f7c627fb Update CJE and make SurgeFX respond to ::reset() (#7944)
  • cf87ac7b surge-fx: replace AccSlider with sst/jucegui/Knob.h (#7928)
  • e612bfcd More code editor tweaks (#7946)
  • 8f6c4692 Lfo display cache fix (#7947)
  • e001ec91 Code Editor: scroll and select (#7948)
  • 7730b787 delete AccSlider (#7950)
  • e96a9771 Code Editor scrolling fix (#7949)
  • abfccd86 Patch search UI updates (#7954)
  • 94cb2fa2 Add patches from Intuitive Instruments (#7957)
  • 95ef2bbd Minor UX tweaks (#7958)
  • 2007adb8 Add typeins for MSEG segment parameters (duration, value…) (#7959)
  • 93790f4d Add option to apply MPE Timbre value as unipolar in the engine (#7961)
  • 96738282 Make the Copy Info to Clipboard hitbox a bit wider (#7962)
  • 91d7edf8 Add ranged keytrack formula (#7963)
  • aedcdfd4 Clean up some precision gotchas (#7967)
  • d951d591 Fix positioning of Author field in Patch Selector (#7968)
  • 33cfc022 Missing voice parameters for formula init() state (#7969)
  • e36fb1d6 Fix Single view of WTSE showing current frame off by one (#7970)
  • 6f141d65 Minor adjustment of WTSE editor size and position (#7971)
  • 65fb51fa surge-fx: split ParameterPanel into its own component (#7951)
  • 644322c8 Turn on LTO for release builds. (#7978)
  • d657e766 Remove nowadays unnecessary Mac only SIMD code in Window oscillator (#7977)
  • 3502355f Backwards-compatible option to use mathematically correct tilt noise. (#7975)
  • bcbffe53 Update sst-jucegui to include cstdint (#7979)
  • 974163ed Update tilt noise
  • 826cc002 Lua debugger addons (#7990)
  • 3f5d814a Ignore high-bit keys in the VKB layout on Linux (#7991)
  • 40019dd3 Fix FM3 m3 display; update CMake cpputils/basic blcosk order (#7993)
  • 81891126 One more FM3 label fix (#7994)
  • 6b3c7174 The step editor reparent logic corrected (#7997)
  • a7e383f3 Add new Philippe Favre wavetables (#8000)
  • 86c07107 Upgrade pybind from 2.10.4 to 2.13.5 (#8004)
  • a5be0d68 entitlements to fx app (#8002)
  • b3e917f0 Add option for compiling cmake release without LTO. (#8005)
  • cf58fca6 Added 50 wavetables from Ocean Swift Synthesis (#8006)
  • 29977398 Formula additions (#8010)
  • 40c5eb8f Luaeditor addons (#8015)
  • ad559292 Update README (#8019)
  • bc8a49b5 Modbuttons UX improvement (#8017)
  • 712d616c LuaEditor multiline comment support
  • 2c009868 Formula debugger groups (#8021)
  • b2fd7fda debugger displaying table error (#8025)
  • 9cb9e4ee Removes macros subscriptions for Formula (#8024)
  • 38446506 Fix extendable bipolarity implementation for LFO Amplitude (#7999)
  • 8ac4609f Various ValGrind fixes (#8028)
  • fb169e1a Various fixes (#8029)
  • 925b3843 A11y announcement of tuning being stored in patch (#8026)
  • 8a3e2eaf Portable Linux User Dir (#8030)
  • 20931e86 Fix the click-at-onset for some waveshapers (#8033)
  • bfab2dd3 Fix popup menu scaling (#8032)
  • 2434aeaf Revert “Fix popup menu scaling (#8032)”
  • 90924e72 Fixes Formula crash when switching to unused out (#8034)
  • 804eb048 Fix corrupted morph param crash and affected patches
  • 1283874a Use whitespace instead of bogus sign for patch edits
  • 2f2bb4e3 Fix corrupted morph param crash and affected patches
  • bb066183 Disable legacy morph mode in remaining WT oscillators (#8037)
  • 31a2fb2b Win installer: Disable “Components Exist” dialog for Data, Patches and Wavetables (#8038)
  • c513b635 ARM64 as well as ARM64ec on win (#8041)
  • e4b6ce34 Partly revert that ARM change
  • 36cec0a3 Another try at ARM header ordering stuff (#8042)
  • 84337b39 more arm attempts (#8043)
  • e568cb33 Make it so the code builds with JUCE 7 or JUCE 8 (#8046)
  • 107a5023 Fix selected MIDI device bg color in SA settings dialog (#8051)
  • d382b541 Be more defensive in CLAP Preset Discovery under unexpected input (#8056)
  • 9580d04f Lua editor highlighting (#8062)
  • c30debcb Some minor build clarifications in README.md (#8063) (#8064](https://github.com/surge-synthesizer/surge/pull/8064))
  • e2e79d96 Trivial punctuation fixes to How to Git.md
  • a9e830e0 Trivial punctuation fixes to How to Git
  • 36a69b53 Fix keyboard/mouse shortcut used to clear FX slot. (#8067)
  • 005c663d Fix soft takeover failing after patch load (#8068)
  • 0e3eb912 SST Filter Upgrade; OBXD and BP12 fixes (#8069)
  • 9b8b0e87 Second sst-filters upgrade (#8070)
  • 0b44681a Enable all filters and waveshapers in the init state (#8072)
  • c42a99c8 Alert box size tweak (#8073)
  • 4561e022 Make sure correct filesize is written in add-surge-metadata.py (#8074)
  • 8259fe03 Don’t take keyboard focus when showing patch tooltip (#8075)
  • 6031605b Auto-load patch on keyboard browsing through patch search results (#8076)
  • 62a5cada Improve patch search result list behavior (#8077)
  • af140097 Copy .wt fileformat doc into doc folder (#8078)
  • de50a5f2 Add context menu to WTSE Samples numberfield (#8079)
  • 0e5e4b63 Close search results when pressing Find Patch keybinding while results are shown (#8080)
  • 12413110 Filter analysis overlay gets value popup and some fixes (#8081)
  • 92de54f4 clang-format
  • a625cfde Revert “clang-format”
  • 5f6318a9 Tick currently selected osc or FX type in the context menu (#8082)
  • f4491de6 Fix BP subtype used in Resonator FX (#8083)
  • 64f8da4c Split LFO presets menu into factory and user columns (#8084)
  • 4e67e5c5 Minor adjustments to default size/pos of some overlays (#8085)
  • 2f17b53c Keybinding improvements (#8086)
  • 72e40d08 Fix mod preset saving to subdir and slightly improve patch save error dialogs (#8087)
  • 1e4a7b5a Fix formula is_rendering_to_ui in init and add init voice_count (#8088)
  • bd6aa084 Lua editor fixes (#8090)
  • 78268d72 Fix missing chickenbox when toggling Lua editors using keybinds (#8089)
  • 9cf63484 Workaround for FindVcvars breaking on spaces in paths (#8092)
  • 9e56630a ParamMetaData value display used wrong precision (#8093)
  • e06a1f1a Add the OBXD XPander and Cytomic SVF to “Multi” Filters (#8094)
  • cb83d40a Update sst-effects and sst-filters submodules (#8095)
  • d85af887 Add WTS Preset Manager (#8091)
  • 0ff04147 Implement WT file type icons (#8098)
  • d3a0b252 WTScript file loading fixes (#8099)
  • 36a2d4c3 Update Inno Setup to 6.5.1 and remove Nuget dependency (#8100)
  • 1a2d2ed5 Update README.md
  • 1a0a9d0a More WTS fixes (#8101)
  • 6cf8a32d Bail out of host side context menus if an unknown host (#8102)
  • 1aa58230 Use Inno Setup installer action (#8103)
  • db55b393 Find and call vcvars64_wrapper.bat directly from build-msvc-luajit.bat (#8104)
  • b73555a9 WTS Editor overlay UX tweaks and fixes (#8105)
  • 4d7e6126 Editors refresh tweak (#8107)
  • 541f4de7 Add alternative value string for Playrate param (#8110)
  • 85d84241 Add WTS undomanager and some more UI tweaks (#8111)
  • ad3a2576 Add pfft to lua interpreter
  • 2ad1c476 Add <cstdint> for uint64_t (#8112)
  • 491a3cfe Add new features to Alias additive editor (#8113)
  • 3cef67b5 Fix iffy stuff with additive editor lambdas (#8115)
  • 8de9465b Lua editors escape key actions (#8114)
  • 8877c217 Add two windowing options to Alias Additive Editor (#8116)
  • aef5a441 Update osc type checkmark when switching scene or oscillator (#8118)
  • a9305444 Move to C++ 20 (#8119)
  • b00e1c68 Disable C5105 MSVC warning. (#8120)
  • d25f9da3 Add WTS editor hamburger menu
  • d35f7fdf Fix trivial typos in Mac installer message. (#8124)
  • bce4f37e Misc fixes (#8125)
  • 29811f61 Update pffft pin and make surgepy skip VST2 SDK if it was found (#8126)
  • 82bb9609 WT to WTS renaming across codebase
  • 4bb09dd8 Add tooltips to icons on About page (#8129)
  • fc17c568 Add overwrite confirmation box to mod and FX presets (#8130)
  • 85934dd3 Add tuned_key to Formula (#8131)
  • 96a54f49 Windows installer: Use sst-cmake helper for Inno Setup (#8132)
  • df94c9d3 Fix blank LFO display at default zoom (#8133)
  • 77912c4f Fix extendable parameters in Waveshaper effect not extending (#8140)
  • 0f7b6ff9 Fix some MIDI Channel/MTS-ESP things (#8143)
  • 0aa04c0b Allow fractional typein for Floaty Delay’s Playrate parameter (#8145)
  • 1d5ea0d0 WTS mouse and UI tweaks (#8146)
  • db1aa202 Fix out of range vector access in RadialScaleGraph::paint() (#8147)
  • 775ca9a2 Fix some debug asserts with grabKeyboardFocus in LuaEditors (#8149)
  • 3a91b3d5 Add tests for bitops and PFFFT to UnitTestsLUA (#8150)
  • 2f804378 Some editors accessibility improvements (#8151)
  • fda3409f Some WTS graph fixes (#8152)