2476 Commits
Author SHA1 Message Date
Dalton Messmer e04f9c8deb Sf2Player: Fix non-ASCII soundfont file paths on Windows (#8545)
Fixes non-ASCII soundfont file paths on Windows caused by FluidSynth switching to UTF-8 file paths in version 2.2.0 without us adjusting our usage of their API.

Also bumps the minimum supported FluidSynth version from 1.1.7 (which released in September 2017) to 2.2.0 (which released in March 2021). This allows us to remove a lot of conditionally compiled code that we no longer use in any of our builds.

Fixes #8504
2026-09-10 17:48:26 -04:00
ExternStat 44c4291539 Fix VST effect controls toolbar (#8546) 2026-09-10 13:21:39 -06:00
Fawn 76ffa57efe Resolve all Doxygen warnings & docs cleanup (#8361)
- Updates Doxyfile for Doxygen 1.18.0 and minifies Doxyfile
- Use PROJECT_LOGO & PROJECT_ICON in Doxyfile
- Add custom Doxygen CSS
- Move documentation comments in first-party code from source files to
  their corresponding headers, where applicable
- Resolves nearly all Doxygen warnings in first-party code
- Remove unused INPUTDIRS from doc/CMakeLists.txt
- Use CMake's DOXYGEN_ADD_DOCS() instead of a custom doc target
- Bump portsmf submodule to get upstream Doxygen fixes
- Only autorun Doxygen CI for master branch
- Skip Doxygen CI if Github Pages aren't enabled
2026-09-08 21:06:05 -06:00
Itreza2 de166c31bc Sf2Player: Fix loading when no soundfont is specified (#8432)
Prevent Sf2Intrument from trying to load nonexistent file on deserialization
2026-08-21 17:11:29 -04:00
Carlo Bramini 795d39d656 CMAKE: fix build for CYGWIN (#8247)
* CMAKE: support -mbig-obj flag also on CYGWIN
* CMAKE: find X11 on CYGWIN
* CMAKE: Add CYGWIN as platform.
* CMAKE: allow to use WINMM on CYGWIN.
2026-07-20 14:53:09 -04:00
cchjimmy 07f89709be Export symbols of ladspa plugins (#8480) 2026-07-20 11:13:52 -06:00
Dalton Messmer e1fabe5b18 Fix a few warnings (#8465)
* Add missing override to VolumeKnob

* Fix warning in SlewDistortion.h

* Remove unused lambda capture

* Remove a SLOT macro usage from SampleClip

* Add missing override in SampleClip
2026-07-16 14:19:40 -04:00
renderman21andFawn d123ef41c9 Escape emails in plugin author field (#7975)
Co-authored-by: Fawn <rubiefawn@proton.me>
2026-07-07 16:46:37 -06:00
Dalton Messmer ad4e58f060 Fix missing include in TapTempo.h (#8421) 2026-06-02 23:59:20 -04:00
Dalton Messmer 98bc0d60e8 Fix VolumeKnob and tooltip bugs (#8359)
Bugs fixed:
1. Doubled tooltips on some Knobs (see #8358)
2. No dynamic floating text when dragging a Fader (regression from #8253)
3. Volume knobs displaying their units as "dBFS%" rather than just "dBFS" (regression from #8253)
4. Incorrect dBFS value in the dynamic floating text for volume knobs of the Delay and Flanger plugins
5. Incorrect dBFS values in the "Set value" dialog box for volume knobs of the Delay, Dynamics Processor, Flanger, and Wave Shaper plugins
6. Missing "%" unit in the context menu for Vibed's volume knobs
7. Incorrect handling of volume knobs for models that support negative amplitudes (currently only Flanger's feedback amount knob)

For (1), I reworked how static tooltips work in FloatModelEditorBase. Rather than use QWidget's tooltips, it shadows the tooltip methods from QWidget and redirects them to the existing SimpleTextFloat-based system.

Supporting both "static" and "dynamic" tooltips required some improvements to keep better track of user interactions with the Knobs. There was an existing m_buttonPressed boolean, but this was insufficient, so I converted it into a new InteractionType enum for keeping track of the user interaction state.

See the "Expected Behaviour" section of the bug report (#8358) for an explanation of how it works now from the user's perspective.
2026-05-29 01:29:42 -04:00
Lost Robot b465808a54 Revert "Start running pitch shifter upon initialization (#7356)" (#8398)
This reverts commit ee7edecb2d.
2026-05-18 17:45:33 +02:00
Lost Robot ee7edecb2d Start running pitch shifter upon initialization (#7356)
It takes a bit of time for this pitch shifter to "warm up" and get all of its grains spawned (as is the nature of all granular audio processing), so it's best to start flushing some audio through immediately upon plugin initialization or sample rate change.
2026-05-18 02:56:08 -06:00
regulus79 658ce003d9 Fix Midi Import of Multi-track File and CC Automation (#8383)
Previously, importing midi files containing multiple tracks was not supported. All of the notes got merged onto a single track.

Except, LMMS actually does support multi-track midi import, it just ignores the track index when placing the notes, and simply puts them in tracks based on their midi channel instead. LMMS does not support setting the channel of an individual note, so separating the loaded midi events onto separate tracks based on their channel does make sense.

But we don't have to choose one or the other! This PR makes it so that the notes in midi files are split into different tracks based on both their midi channel and midi track. This allows midi files which contain multiple tracks to be loaded normally, and hopefully even multi-channel multi-track midi files.

Additionally, some midi files contain a wealth of information regarding midi CC automation. Currently, we only handle pitch, panning, volume, and bank automation when importing midi files, but this PR also makes it so that the knobs in the instrument track CC rack are also automated.

NOTE: Regarding the CC automations, some CC numbers correspond to things like panning and volume, which are real knobs in lmms. In the case that one of these CC's are automated, it creates an automation track for that specific lmms knob. Otherwise, it automates the knob in the instrument track's midi CC rack.
2026-05-14 13:23:23 -04:00
Héctor Sebastián Trejo Luna a1126aaee2 Oscilloscope: Add missing QApplication and QThread includes (#8377)
Adds two missing includes which are needed for Debug builds.

Fixes #8376
2026-05-09 15:13:46 -04:00
Fawn 005b1a8e66 Lb302 cleanup (#8132)
Makes the following changes to the Lb302 plugin for increased functionality, maintainability, and readability:

- Add note velocity & note panning to Lb302
- Remove evil mutex+dynamic array combo in favor of a real-time safe ringbuffer queue
- Use non-static data member initializers where possible
- Use `std::numbers::pi` instead of `M_PI`
- Use `std::array` and `std::unique_ptr` instead of manual memory management
- Change plain-old-data classes with only public members to structs
- Change some ints to f_cnt_t to better communicate their purpose and avoid weird implicit casting nonsense
- Change floats to sample_t where appropriate to better communicate their purpose
- Find suitable homes for loose constants
- Prefix standard library math function calls with std::
- Ensure all floating-point literals intended to be floats end in 'f' and are not doubles to appease MSVC
- Change uses of SIGNAL and SLOT macros to whatever they should be post-Qt6 upgrade
- Tidy code to conform to current code conventions

Also adds Hardware.h for low-level performance tools:

- busyWaitHint(), supporting x86, ARM, and RISC-V
- hardware_destructive_interference_size polyfill, supporting x86, ARM, RISC-V, and PPC
- Moved the contents of denormals.h to Hardware.h, renamed disable_denormals() to disableDenormals()
- Added ARM support to disableDenormals()
2026-04-29 23:19:42 -06:00
668e80dbaa Add Oscilloscope Effect (#7937)
* Adds a new native plugin for incoming waveform display
* Features the ability to pause, zoom in, set window size and set amplification (scale)
* Does not feature a pitch-tracking option

---------

Co-authored-by: Fawn <rubiefawn@gmail.com>
Co-authored-by: Sotonye Atemie <satemiej@gmail.com>
Co-authored-by: Dalton Messmer <messmer.dalton@gmail.com>
Co-authored-by: bratpeki <pkatic2003@gmail.com>
2026-04-27 23:51:05 +02:00
Lost Robot 2e0e876334 Fix SlewDistortion's tanh mode (#8363) 2026-04-25 14:45:32 -05:00
Dalton Messmer 098f0ed4b9 Fix VST parameter automation performance (#8253) 2026-03-26 23:31:02 -04:00
fd2db688bd Fix OpulenZ level scaling knob (#8308)
Fixes #8306. Parameter now works, value is set to 0 for old savefiles.

---------

Co-authored-by: István Szabó <djpixus@gmail.com>
Co-authored-by: Dalton Messmer <messmer.dalton@gmail.com>
Co-authored-by: Fawn <rubiefawn@gmail.com>
2026-03-19 14:01:53 -04:00
Sotonye AtemieandDalton Messmer eb5b757947 Replace fpp_t with f_cnt_t (#8311)
* Remove fpp_t, switch f_cnt_t to std::uint64_t, change uses of fpp_t to use f_cnt_t instead

* Switch release_frame in Lb302 to use f_cnt_t

* Switch ch_cnt_t to uint16_t

* Update src/core/NotePlayHandle.cpp

Co-authored-by: Dalton Messmer <messmer.dalton@gmail.com>

* Update src/core/NotePlayHandle.cpp

Co-authored-by: Dalton Messmer <messmer.dalton@gmail.com>

---------

Co-authored-by: Dalton Messmer <messmer.dalton@gmail.com>
2026-03-18 06:33:36 -04:00
zynskeywolfandIstván Szabó b517c98357 Remove localization of key name in SlicerT (#8305)
Co-authored-by: István Szabó <djpixus@gmail.com>
2026-03-16 13:56:20 -04:00
Sotonye AtemieandDalton Messmer a45a2b86a0 Refactor and improve Tap Tempo (#8098)
Improves the tap tempo algorithm and usage, as well refactoring the code for better maintainability.

---------

Co-authored-by: Dalton Messmer <messmer.dalton@gmail.com>
2026-03-10 23:31:37 -04:00
Yohanan 6c75b30dca Add search bar for the soundfont player (#8193) 2026-03-10 19:57:19 +01:00
Dalton MessmerandSotonye Atemie 5916a0b477 Auto-quit rework (#8070)
This reworks the auto-quit feature by introducing a new AudioBuffer class which keeps track of which channels are currently silent as audio flows through the effects chain.

When track channels going into an effect's input are not marked as quiet, it is assumed a signal is present and the plugin needs to wake up if it is asleep due to auto-quit. After a plugin processes a buffer, the silence status is updated.

When the auto-quit setting is disabled (that is, when effects are always kept running), effects are always assumed to have input noise (a non-quiet signal present at the plugin inputs), which should result in the same behavior as before.

Benefits:

- The auto-quit system now closely follows how it is supposed to function by only waking plugins which have non-zero input rather than waking all plugins at once whenever an instrument plays a note or a sample track plays. This granularity better fits multi-channel plugins and pin connector routing where not all plugin inputs are connected to the same track channels. This means a sleeping plugin whose inputs are connected to channels 3/4 would not need to wake up if a signal is only present on channels 1/2.
- Silencing channels that are already known to be silent is a no-op
- Calculating the absolute peak sample value for a channel already known to be silent is a no-op
- The silence flags also could be useful for other purposes, such as adding visual indicators to represent how audio signals flow in and out of each plugin
- With a little more work, auto-quit could be enabled/disabled for plugins on an individual basis
- With a little more work, auto-quit could be implemented for instrument plugins
- AudioBuffer can be used with SharedMemory
- AudioBuffer could be used in plugins for their buffers

This new system works so long as the silence flags for each channel remain valid at each point along the effect chain. Modifying the buffers without an accompanying update of the silence flags could violate assumptions. Through unit tests, the correct functioning of AudioBuffer itself can be validated, but its usage in AudioBusHandle, Mixer, and a few other places where track channels are handled will need to be done with care.

---------

Co-authored-by: Sotonye Atemie <sakertooth@gmail.com>
2026-03-09 02:32:45 -04:00
Lost Robot f5688e9bad Add Frequency Shifter effect (not a pitch shifter) (#8140) 2026-03-01 09:04:51 -06:00
5d5f319942 Detachable windows (#3532)
Allows detaching a window from LMMS's main window, making things like working on multiple screens easier.

The behavior of detached windows can be customized in the Settings.

Closes #1259

---------

Signed-off-by: Dalton Messmer <messmer.dalton@gmail.com>
Co-authored-by: Hyunjin Song <tteu.ingog@gmail.com>
Co-authored-by: Dalton Messmer <messmer.dalton@gmail.com>
Co-authored-by: SpomJ <mihail_a_m@mail.ru>
2026-02-27 00:20:36 -05:00
Johannes Lorenz d36f3f019e CMake: Check for PERL's List::MoreUtils (#8180) 2026-02-22 10:44:17 +01:00
Andrey 64c346d513 Vibed: fixed regression caused by fastRandInc (#8225) 2026-01-21 21:24:21 -05:00
Yohanan a4d252186f AudioFileProcessor: update amp model when new sample is loaded (#8198) 2026-01-19 10:58:14 -05:00
Fawn 5e3a67c9d1 Improve lmms::fastRand() and use it instead of std::rand() (#7741) 2026-01-15 17:12:04 -07:00
Sotonye AtemieandDalton Messmer ed0f288c8a Remove SampleLoader (#8186)
Removes `SampleLoader`. File dialog functions were moved into `FileDialog`. Creation functions were moved into `SampleBuffer`.

---------

Co-authored-by: Dalton Messmer <messmer.dalton@gmail.com>
2026-01-04 21:18:37 -05:00
regulus79 5e8f220b9c Fix AudioFileProcessor Wrong Beat Length Depending on Sample Rate (#8176)
Fixes #8138

Essentially, when playing beat notes in the pattern editor, technically, they have an internal length of 0. However, when the NotePlayHandle is created and recieves that value of 0, it realizes it's supposed to be a beat note, so it asks the instrument track what the default length of note should be. For most instruments, that defaults to whatever the length of the envelope is (no matter whether the envelope is enabled or not. Is that a good system? I don't know.) However, AudioFileProcessor does it custom and returns the length of its sample in frames.

However, the frame count it returned did not take into account that the sample rate of lmms could be different from the sample rate of the sample. This PR fixes that issue by multiplying by the correct sample rate ratio.
2025-12-23 14:59:17 -05:00
szeli1andallejok96 69f7c3243d Fix knob linking / refactor linking (#7883)
Closes #7869

This PR aims to fix linking bugs and it aims to make linking code faster. In the future I would like to replace controller and automation code with linked models, so it is essential for this feature to work as efficiently as possible.

Before this PR:

- AutomatableModels store a list of AutomatableModels that they are linked to.
- setValue() and other functions make recursive calls to themself resulting in the #7869 crash.
- Each AutomatableModel can unlink from other AutomatableModels, unlinking is the inverse operation to linking.

After this PR:

- AutomatableModels store a pointer to an other AutomatableModel making a linked list. The end is connected to the first element resulting in a "ring".
- setValue() and others are now recursion free, the code runs for every linked model, more efficiently than before.
- Each AutomatableModel can NOT unlink form other AutomatableModels, unlinking is NOT the inverse operation to linking. AutomatableModels can unlink themself from the linked list, they can not unlink themself from single models.

---------

Co-authored-by: allejok96 <allejok96@gmail.com>
2025-12-22 17:37:40 -05:00
Lisa Magdalena Riedler f0cb32ff08 Fix AFP reverse mode desync on new sample load (#8158)
Previously, loading a new sample in an AFP instance with reverse enabled would desync the button from the model, such that the button would indicate the sample was reversed despite the new sample not actually being reversed.

This commit fixes this behavior so that samples loaded into an AFP instance with reverse enabled are actually reversed.
2025-12-08 16:17:47 -07:00
Petar Katić 91517282c8 Fix missing icon in Slew Distortion help window (#8151) 2025-11-30 21:55:24 -05:00
Lost Robot f0b3c2e251 Fix help menu crashes upon program close in Xpressive and Slew Distortion (#8150) 2025-11-30 11:08:30 -08:00
Fawn bfa04c987d Centralize standard LMMS plugin logo (#8124)
* Centralize standard LMMS plugin logo

Previously, every single plugin would have its own copy of this image.
Now, these plugins pull it from the theme. I'm not sure it's valuable
for this to be themeable, but AFAIK it's the place all the other
non-plugin resources are stored, so that's where it goes for now.
2025-11-23 13:23:08 -05:00
Fawn eb41051bc5 Make arrow "stepper" buttons themeable and use SVG assets (#8123)
* SVG-ify arrow buttons

These buttons are used in the instrument window, Vestige, and VST
effects. Separate versions of the arrow icons are used for the classic
theme.

* Fix some unrelated SVG formatting and metadata

* Revert accidental change to classic border radius

* Add some XML stuff back to appease Github

LMMS renders these SVGs just fine, but apparently the removal of the
XML declaration completely breaks Github's ability to render the image,
so I am adding these back for the sake of those who want to actually
look at the diff on the website lmao

* Attempt to fix Github SVG previews again (`xmlns`)

* Fix crossover eq band mute button icon size

You may ask, "what does this have to do with the arrow buttons?" and you
would be right to assume this is unrelated. However, I'm already
touching the relevant lines of the stylesheet so I may as well sneak it
in there.

* Add missing metadata to fader_knob.svg

And fix mixed indentation in headphones.svg

* Add missing `xmlns` to fader_knob.svg

GRADIENTS!!!!!!!!!!!!

* Fix classic theme arrow buttons

The originals were right angle chevrons

* Remove unused getters
2025-11-21 01:26:00 -05:00
Dalton Messmer 478f5345dd Bump minimum Qt version to 5.15 (#8129) 2025-11-11 12:57:14 -05:00
51529cefb1 Add Qt6 Support (#7339)
* Rebase against master

Co-authored-by: michaelgregorius <michael.gregorius.git@arcor.de>
Co-authored-by: Rossmaxx <74815851+Rossmaxx@users.noreply.github.com>

* Fix Qt6 DMG on Apple (#7240)

- Fix linking issues with Qt Framework files
- Fix qmake detection

* Fixes after rebase

* Fix embed.cpp compilation

Fix implicit conversion from int when using QString.arg(...)

* Fix Qt6 signature change for nativeEventFilter (#7254)

* Adds win32EventFilter a wrapper for nativeEventFilter on Windows
* win32EventFilter is currently used to intercept top-level Window events (currently, to avoid VSTs setting transparency of the parent application)

* fix broken signal slot connections (#7274)

QComboBox activated() replaced with textActivated() since Qt 5.14

* Enabled VSTs on Qt 6 (#7273)

* enabled VST support for Qt 6 builds
* Note : Embedding on QT6 will be buggy on linux as a result of using qt embedding, which unfortunately is a qt bug which hasn't been resolved.

* Changed bar lines to follow snap size (#7034)

* Added lines in between bars
* Changed bar lines to follow snap size
* Changed default zoom and quantization value
* Added constants for line widths
* Added QSS configuration for new grid line colors
* Tied line widths to QSS properties
* Changed default quantization to 1/4
* Removed clear() from destructor model
* Removed destructor in ComboBoxModel.h
* Changed member set/get functions to pass by value
* Updated signal connection with newer syntax

* Fix compilation

* Fix MSVC builds

* fix nullptr deref in AudioFileProcessor (qt6 branch) (#7532)

* ensured mouse event != nullptr before deref

* separation of concerns: AFP WaveView updateCursor

extract check to pointerCloseToStartEndOrLoop()

* marked some function parameters as const

* Remove Core5Compat usage

* Fix bad merge

* Fixes after rebase

* Simplify QTX_WRAP_CPP call

* Remove comments that are obvious to a developer

* Whitespace

* Try using Qt 6 for MSVC CI

I chose Qt 6.5 because it's the last Qt LTS release with declared
support for Visual Studio 2019. Once we upgrade to Visual Studio 2022,
we could upgrade Qt as well.

* Fix MSVC build

Also fixes two memory leaks in MidiWinMM

* Fix GuiApplication on MSVC

* Fix interpolateInRgb

* Try building with patched Calf

* Fix submodule

* Fix OpulenZ build

* Try to fix zyn

* Fix comment

* Ty to fix zyn (again)

* Ty to fix RemotePluginBase

* Revert "Ty to fix RemotePluginBase"

This reverts commit 92dac44ffb11e19d1d5a21d9155369f017bd59e9.

* Update plugins/ZynAddSubFx/CMakeLists.txt

Co-authored-by: Dalton Messmer <messmer.dalton@gmail.com>

* Fix vertical & horizontal scroll wheel in SongEditor

* AppImage: Fix finding of Qt6 libs

* Fix implicit QString --> QFileInfo conversion

* Point submodule to lmms

* Fix multiple deprecation warnings

* Fix for Clang compiler

* Build with latest Qt LTS version now that we use MSVC 2022

* Update jurplel/install-qt-action to v4.3.0

* Bump minimum Qt6 version for MSVC

* Fix incorrect Qt version checks

Some comparisons were using ">" rather than ">="

* `QSize()` != `QSize(0, 0)`

* Fix more deprecation warnings

* Fix style

* Simplify Spectrum Analyzer mouse events

The Qt bug that used to be present appears to have been fixed, so the
workaround can be removed

* Minor changes

* Fix deprecated QCheckBox signal

* Fix setContent helper functions

* Remove QMultiMap usage from ControlLayout

* Remove SIGNAL and SLOT macros

* Revert TrackView.cpp changes

* Remove Q_DISABLE_MOVE usage since it does not seem to be available in Qt6

---------

Co-authored-by: michaelgregorius <michael.gregorius.git@arcor.de>
Co-authored-by: Rossmaxx <74815851+Rossmaxx@users.noreply.github.com>
Co-authored-by: BoredGuy1 <66702733+BoredGuy1@users.noreply.github.com>
Co-authored-by: Hyunjin Song <tteu.ingog@gmail.com>
Co-authored-by: Lisa Magdalena Riedler <git@riedler.wien>
Co-authored-by: Dalton Messmer <messmer.dalton@gmail.com>
2025-11-03 11:58:15 -06:00
Fawn 6cec90cabb Use system cursors instead of embedded raster images where possible (#7838)
Given these changes, the knife tool now uses `Qt::SplitHCursor`, but `Qt::IBeamCursor` is also a a viable option. I am noting this should substantial concern arise over the appearance of `Qt::SplitHCursor` due to cursor themes, such as the default one applied to applications running under WSL.
2025-10-28 13:14:46 -06:00
Fawn b1e6d180c7 Make portsmf a git submodule (#7755)
Instead of including the files directly in plugins/MidiImport/portsmf,
that path is now a git submodule (https://github.com/portsmf/portsmf).

Several other changes have been made to clean up MidiImport as well.
2025-10-24 16:24:46 -06:00
Fawn 0fcd67f911 Use length-bounded string/memory functions (#7709)
Resolves #3949 by replacing all calls to sprintf() and strcpy() in first-party code with calls to snprintf() or some other reasonable alternative.
2025-10-23 13:58:32 -06:00
Sotonye AtemieandDalton Messmer 44a68b8b01 Fix audio resampling functionality (#7858)
Co-authored-by: Dalton Messmer <messmer.dalton@gmail.com>
2025-10-22 08:34:07 -04:00
Tres FinocchiaroandDalton Messmer 38ceac80dd Remove custom winebuild task (#8077)
Remove custom winebuild task; leverage wine 10.14+ directly instead

---------

Co-authored-by: Dalton Messmer <messmer.dalton@gmail.com>
2025-10-21 11:19:52 -04:00
luzpaz 8c12e47b11 Fix several typos (#8090)
This cleans up typos in source comments and some user-facing strings.

Found via `codespell -q 3 -S "./plugins,./src/3rdparty,./data/locale,*.in,*.xpf" -L continous,currenty,globaly,inports,localy,nd,ot,sie,te,trough`
2025-10-20 22:20:01 -04:00
Petar KatićandDalton Messmer 872426bfc9 Added opening samples in SlicerT from the file browser (#8100)
Co-authored-by: Dalton Messmer <messmer.dalton@gmail.com>
2025-10-20 16:07:47 -07:00
Lost Robot a809c03f87 Add SlewDistortion effect and oversampling support (#7641) 2025-10-13 12:18:34 -07:00
Dalton Messmer db6fc2948c Fix null pointer deref when getting VST window size (#8051)
* Fix null pointer deref when getting VST window size
2025-09-28 00:25:10 -04:00
fbac56fdcc Fix VST crashes on Linux (#7987)
Pass winebuild param to disable dynamicbase/aslr
Requires bleeding-edge wine version
See also https://gitlab.winehq.org/wine/wine/-/merge_requests/8786

---------

Co-authored-by: Dalton Messmer <messmer.dalton@gmail.com>
Co-authored-by: Tres Finocchiaro <tres.finocchiaro@gmail.com>
2025-08-27 14:03:46 -04:00