LMMS Progress Report: March 2026
Welcome back to our monthly series of LMMS Progress Reports!
If you missed last month's report, you can find it here.
Nightly News
In March, 12 PRs were merged. While this is a fairly average number, they brought some important and impactful improvements and fixes.
Tap Tempo improvements (#8098)
sakertooth greatly improved the Tap Tempo tool's BPM calculation algorithm, making it more reliable to use. In addition, the code was refactored for better separation of the frontend and backend.Search bar for Sf2 Player patches (#8193)
This new quality-of-life feature by yohannd1 makes it easy to search for soundfont patches.Vcpkg for MinGW dependencies (#8218)
For years, the Windows MinGW builds (the nightly builds simply called "Windows" on the lmms.io downloads page) have relied on a custom Ubuntu PPA containing all our 3rd-party dependencies compiled for MinGW. This worked well, but as time went on, the PPA ceased to be actively maintained and its packages became increasingly out-of-date. But now with the work done by messmerd, most of these dependencies are instead obtained via vcpkg which lets us use the latest versions. For users, this means the Windows MinGW builds now support LV2 plugins, mp3/opus files, per-note panning in Sf2 Player, and the DirectSound and WASAPI audio backends in PortAudio.Fix VST parameter automation performance (#8253)
messmerd fixed a severe performance issue that occurred when automating or adjusting VST parameter knobs. This was a regression dating back to 2020 and is now fully resolved.Fix Settings bug that occurs when not using JACK (#8299)
For the past few months, the Nightly version had a regression where the Settings window could take several seconds to open. And even worse, for some users, opening the Settings could break their system's audio. This issue was caused by a mistake in our JACK backend, and is now fixed thanks to messmerd.Fix OpulenZ level scaling knob (#8308)
Previously, the OpulenZ plugin's Scale knob did not function as intended (or at all), but now this embarrassing mistake has been corrected thanks to zynskeywolf.
Other changes:
- Remove GUI menu items for global automation (#5230)
- Auto-quit rework (#8070)
- Remove localization of key name in SlicerT (#8305)
- Replace
fpp_twithf_cnt_t(#8311) - Resolve remaining C++20 TODOs (#8326)
In progress
In March, 29 new PRs were opened, of which 5 have already been merged. The following is a list of both new and old PRs which were worked on in the past month.
Nearing completion
Add feature to export tracks (#7119)
sakertooth made some minor improvements to the PR recently, and it's ready for testing and review.Add Oscilloscope Effect (#7937)
This new effect plugin by regulus79 is awaiting code review. The new lock-free SPSC queue implementation in #8280 affects this PR, but we shouldn't need to wait for it to be merged first.Lb302 cleanup (#8132)
In the past month, rubiefawn added per-note velocity and panning to Lb302 and fixed some regressions. The PR needs more code reviews and testing, but is otherwise mostly done.
In the works
Vcpkg for Linux dependencies (#7316)
Now that MinGW builds use vcpkg (#8218), messmerd is working on adding vcpkg support for the Linux builds as well. Due AppImage restrictions, our Linux builds must use an older build runner with out-of-date system packages to ensure the resulting AppImage is compatible with more than just the most recent distros. Vcpkg would allow us to use the latest 3rd-party dependencies rather than constantly being four years behind.Grid Abstraction - Vector Graph (#8221)
szeli1 has been working on a new 2D grid model and widget. Its first use case will be in the WaveShaper plugin to greatly improve the ease of use when drawing curves. The PR supersedes earlier attempts in #4367 and #7158.Effect presets (#8273)
bratpeki added the ability to save effects and effect chains as presets that can be loaded later.List VSTs as instruments (#8301)
In this work-in-progress PR by sqrvrt, LMMS scans for VST plugins at startup similar to other DAWs. By doing this, it can separate VSTs into instrument and effect categories rather than combining them all together like the Effect Browser currently does. It also lists the VST instruments in a separate section of the instrument plugins sidebar, similar to LV2 plugins.Decouple tracks from the Mixer (#8317)
sakertooth is continuing the efforts to refactor old code. While this kind of work may not be visible to users, it's important for the maintainability of the codebase and to improve the overall reliability of the application.
Other PRs
These PRs were also created or worked on during March.
- Remove the FIFO thread (#7568)
- New distort plugin (#7902)
- Fixed missing emails in the author section (#7975)
- Add MPE output support (#8034)
- Add support for multiple tracks/channels to MidiExport (#8048)
- Pull TransferFunction Plugin Effect and Visualiser Plugin Effect (#8168)
- "Universal" workspace panning (#8203)
- Fix subwindow size limits (
MainWindow::restoreWidgetState) (#8204) - CMake: Fix build for CYGWIN (#8247)
- Add the ability to create "linked clones" behind clips in the song editor (#8254)
- Move ~/.lmmsrc.xml to canonical config location (#8264)
- Add a lockfree SPSC queue (#8280)
- Prevent key modifiers in
MainWindowfrom getting stuck (#8282) - Update .mailmap and CONTRIBUTORS (#8283)
- Enabled the piano roll and automation editor buttons only when not empty (#8285)
- Move config to a struct instead of
QMap<QString, std::vector<QPair<QString, QString>>>(#8291) - Fix piano roll opening with minimum height (#8293)
- Bit Invader cleanup (#8298)
- Default automated values to the first related automation node (#8309)
- Sf2Player: search across all banks + refactoring (#8310)
- Pianoroll refactor into Pianorollpainter (#8312)
- Fix carla (#8315)
- OpulenZ refactor (attempt 2) (#8316)
- Fix missing entires when searching in the file browser (#8320)
- Use
std::formatted_size()instead ofnumDigitsAsInt()(#8321) - Fix segfault when opening SF2 Player GUI during load (#8322)
- Fix Patman crash on invalid patch loading (#8323)
- Refactor
SampleBufferto use value semantics (#8324) - Add
normalizePhase()for normalizing phase (#8327) - Add a zero note check during un-quantized midi recording (#8328)
- Add doxygen docs to Github Pages (#8329)
- Add the ability to zoom and scroll horizontally in the pattern editor (#8335)
- Fixed and added punctuations in ReadMe (#8336)
- Fix PianoRoll Knife Tool UI (#8337)
- Fix "Send to new SlicerT instance" not sending to Pattern Editor (#8339)
Goals for April
We're continuing to work towards the goal of releasing a new alpha version.
In order to force ourselves to focus on completing the remaining 1.3-alpha.2 milestone issues and other bug fixes, we will likely institute a feature freeze starting next month and lasting until the new alpha is released. During the feature freeze, only bug fixes and performance improvements will be merged, though if there's a small feature a majority of devs want to merge, we may make an exception.
New contributors
None last month, but this month it could be you!
Closing thoughts
Thanks for reading! We have a lot of work ahead of us, but if you'd like to contribute to LMMS's development, it could go faster. Whether you're a developer or a tester, it all helps!
If you have any questions or suggestions, please let us know below or on our Discord.
Have a great April!