8464 Commits

Author SHA1 Message Date
Sotonye Atemie
e215cd0c31 Remove Model constraints on VolumeKnob (#8438)
Relaxes the constraints for the associated `Model` assigned to `VolumeKnob`.
2026-06-19 20:09:18 -04:00
grande1900
4cb78c4b6f Fix AudioBuffer::absPeakValue() not actually being absolute (#8422) 2026-06-06 22:05:52 -04:00
Dalton Messmer
ad4e58f060 Fix missing include in TapTempo.h (#8421) 2026-06-02 23:59:20 -04:00
Dalton Messmer
22651250b9 Remove suil from msys2 dependencies (#8420) 2026-06-02 23:58:34 -04:00
ggFROOK
25a598c0be docs: fix update libstk0-dev to libstk-dev for debian/ubuntu (#8409)
* docs: fix update libstk0-dev to libstk-dev for debian/ubuntu

* docs: Fix STK installation message in CMakeLists.txt

* docs: STK installation message in CMakeLists.txt to include both libstk-dev and libstk0-dev

* docs: update wiki submodule version to latest
2026-06-02 23:40:27 +02:00
regulus79
68daf06619 Fix Clips Being Hard to Move When Zoomed Out (#8385)
When #8169 was merged, the resize grip of clips was increased to 8 pixels to make it easier to resize clips which were right next to each other. However, this constant 8 pixel region on either end of the clip gets in the way when zoomed far out, since the width of the clip itself could be on the order of 8 pixels.

To fix this, this PR makes it so that the clip resize grip width dynamically changes with the zoom level. When zoomed far in, it's 8 pixels, but as you zoom out, the grip width is capped to be no more than 10% of the clip width. This makes it much easier to move the clip around without it getting in the way.

Fixes #8384
2026-05-29 18:15:22 -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
regulus79
5482515229 Fix Resized Samples getting Shifted after Tempo Change (#7890)
---------

Co-authored-by: Dalton Messmer <messmer.dalton@gmail.com>
2026-05-27 14:42:46 -04:00
Itreza2
ce0a4d536e Fix length of non-beat clips in the pattern editor (#8369)
---------

Co-authored-by: bratpeki <pkatic2003@gmail.com>
Co-authored-by: Dalton Messmer <messmer.dalton@gmail.com>
2026-05-25 23:43:27 -04:00
Itreza2
3dec10d50c Fix sample track playback in pattern editor (#8375)
Allows playback of a sample clip in the pattern editor to start at any position and not only at t=0 as it is currently the case. This also ensures that the sample is played each loop, which is currently very inconsistent.

---------

Co-authored-by: bratpeki <pkatic2003@gmail.com>
Co-authored-by: Yohanan <23298480+yohannd1@users.noreply.github.com>
2026-05-25 23:02:21 -04:00
sqrvrt
85a07d2ef9 Fix pan/velocity underflow when dragging lower than window bottom (#8389) 2026-05-19 14:56:22 +02: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
89f83b025b Make Tiny Notes Easier to Move (#8386)
Essentially the same fix as #8385, but for notes in the Piano Roll.

This PR makes it so that the clip resize grip width of a note dynamically changes with the zoom level. When zoomed far in, it's a constant number of pixels, but as you zoom out, the grip width is capped to be no more than 25% of the note width. This makes it much easier to move the note around without it if it's tiny or when zoomed far out.
2026-05-15 19:17:15 -04:00
sqrvrt
97d652d10e Fix attached subwindows occasionally snapping to minimum size (#8387)
Fix attached subwindows snapping to minimum size occasionally

---------

Co-authored-by: Dalton Messmer <messmer.dalton@gmail.com>
2026-05-14 19:46:14 -04: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
regulus79
38efd2f2b1 Fix Slow Midi Operations by Only Initializing the Detuning Clip When Needed (#8380)
TLDR: Normally, the AutomationClip containing the detuning curve of a Note is created for every single note, no matter if it actually has detuning or not. This PR changes that so it is only created when the user edits the detuning.

When #7477 and later #7888 were merged, they reworked how Note objects were copied to prevent two different notes from sharing the same detuning automation curve, which would mean editing one's detuning would edit the other's at the same time.

This made the workflow more correct, but it came at the cost of performance. Unfortunately, every single Note object had to have a DetuningHelper object which contained an AutomationClip. These AutomationClips are complex QObjects with signals and slots and models inside them, which is not great when you need to copy a whole bunch of notes at once.

Ideally, I think we could replace the detuning clip with something simpler than an automation clip; something which only holds the bare minimum curve data. But that is for a later time; this PR uses a different solution.

Detuning automation clips are only needed by the Note if the user has added any pitch bending. But for the vast majority of notes, there is no pitch bending, so they do not really need the detuning clip. Currently, the detuning object is initialized right when the Note is created. However, this can be changed so that it is only created when the user decided to edit the detuning. This saves an enormous amount of processing when copying notes.

This technically means that there is the possibility that note->detuning() could be nullptr. However, I went through all of the occurances in the codebase, and I added checks where there was the potential it could be nullptr.
2026-05-13 14:23:07 -04:00
Itreza2
0cea87032c Fix beat clips being created with a lenght of 0 in the pattern editor (#8355)
* Added an if to MidiClip::init, thus fixing the issue

---------

Co-authored-by: Fawn <rubiefawn@gmail.com>
Co-authored-by: bratpeki <pkatic2003@gmail.com>
2026-05-13 18:03:00 +02:00
Joshua Arockiasamy
9963bf9831 Fixed key inputs not updating time display (#8266)
* Fixed key inputs not updating the time display in Song-Editor
* Fixed the 'Home' button updating the time display in Piano-Roll

---------

Co-authored-by: bratpeki <pkatic2003@gmail.com>
Co-authored-by: regulus79 <117475203+regulus79@users.noreply.github.com>
2026-05-13 10:15:17 +02:00
Yohanan
566fe8aaea Add Doxygen docs to Github Pages (#8329)
Adds a Github workflow that runs Doxygen on the codebase and uploads the generated HTML pages to Github Pages.
2026-05-12 21:57:08 -06:00
Fawn
e04361fb34 Use std::round() instead of nearbyintf() (#8119)
And some other AutomatableModel::fittedValue() cleanup
2026-05-12 13:46:36 -06:00
Yohanan
94302d3586 Prevent key modifiers in MainWindow from getting stuck (#8282)
* Prevent key modifiers from getting stuck
* Implement a custom isWinDeactivate function to assist in detection

---------

Co-authored-by: Dalton Messmer <messmer.dalton@gmail.com>
2026-05-12 13:36:38 +02: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
Joey L.
9a64272244 Fix "Send to new SlicerT instance" not sending to Pattern Editor (#8339)
Fixes a bug where right-clicking on a sample in the sidebar and clicking "Send to new SlicerT instance" under the Pattern Editor section would instead create the instance in the Song Editor.
2026-05-04 17:56:14 -06:00
Yohanan
999c5819b0 Don't show irrelevant context menu options when right-clicking projects on the sidebar (#8368) 2026-05-03 23:43:09 -06:00
regulus79
38236a8512 Save Scale/Key Highlighting, and Many More Editor Options. (#7854)
This PR makes it so that the scale/key/chord in the Piano Roll is saved with the project.
Also, while I was at it, I made it so that the zoom, vertical zoom, snap settings, quantization, and note lengths are saved too.
Aaand I also decided to save the zoom and snap size in the Song Editor because why not :D
However, the zoom/snap/etc are saved in the lmmsrc file, since it doesn't really make sense to save them per-project.
2026-04-30 13:05:26 -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
regulus79
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
Sotonye Atemie
fc3dfda961 Remove unused default volume model in SamplePlayHandle (#8349)
Removes construction of the unused default volume model from `SamplePlayHandle`. Frequent construction of this model was causing performance slowdowns due to the model having to find and create a journaling ID in a for loop inside `ProjectJournal::allocID`, leading to the exhaustion of available IDs very quickly. There were also general improvements made to `SamplePlayHandle` (using NSDMI, removing other unused members, etc).
2026-04-21 07:37:14 -04:00
Cameron Druyor
9628cb147c Add a zero note check for MIDI recording (#8328)
Adds a check in finishRecordNote that verifies no notes of length 0 can be made, which was possible before.

---------

Co-authored-by: bratpeki <pkatic2003@gmail.com>
2026-04-20 23:51:31 +02:00
Sotonye Atemie
6f50f90b9c Remove the FIFO thread (#7568)
Removes the FIFO writer thread in the audio engine to simplify inter-thread communication and avoid deadlock bugs.

---------

Co-authored-by: szeli1 <143485814+szeli1@users.noreply.github.com>
Co-authored-by: Dalton Messmer <messmer.dalton@gmail.com>
2026-04-04 19:50:28 -04:00
Dalton Messmer
7147a24ac8 Use vcpkg for MinGW dependencies (#8218)
Migrates all MinGW 3rd-party dependencies to vcpkg except for Qt and libgig.
 
This enables the following for MinGW builds
- mp3/opus support
- per-note panning in Sf2 Player
- DirectSound and WASAPI audio backends in PortAudio
- LV2 plugin support
2026-03-31 22:33:58 -04:00
Dalton Messmer
098f0ed4b9 Fix VST parameter automation performance (#8253) 2026-03-26 23:31:02 -04:00
Fawn
1155590927 Resolve remaining C++20 TODOs (#8326)
Co-authored-by: Dalton Messmer <messmer.dalton@gmail.com>
2026-03-23 15:20:32 -06:00
zynskeywolf
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 Atemie
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
Dalton Messmer
0f0d972b52 Fix Settings bug that occurs when not using JACK (#8299)
Opening the Settings would unconditionally try to start the JACK server
if it was not already running, even if the user was using an audio
backend other than JACK. When it failed to start the JACK server, it
would retry a few times which made opening the Settings take several
seconds. For me, it also broke my whole system's audio, requiring me
to restart pipewire.

This PR fixes that problem by passing the JackNoStartServer option to
jack_client_open() in the setupWidget used by the Settings.
AudioJack::initJackClient() continues to use the JackNullOption option,
so like before, it will still attempt to start the JACK server if you select
the JACK backend and restart LMMS.

I also moved some static free functions into a nearby anonymous
namespace, and I removed the server name argument from the
jack_client_open() calls since that variadic argument is only supposed
to be passed if the JackServerName option is passed.
2026-03-17 21:20:42 -04:00
zynskeywolf
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
Kevin Zander
83313e737d Remove GUI menu items for global automation (#5230)
Co-authored-by: Hyunjin Song <tteu.ingog@gmail.com>
Co-authored-by: Fawn <rubiefawn@gmail.com>
2026-03-12 12:03:09 -06:00
Sotonye Atemie
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 Messmer
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
Lukas W
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
Yohanan
6854a655a4 Fix empty value returned by FileRevealer::getSelectCommand() (#8281)
Changes `FileRevealer::getSelectCommand` to return an empty `QStringList` as a fallback, not an empty `std::optional`.
2026-02-25 09:04:25 -05:00
regulus79
f7acf0ed4b Add Info TextFloat for Piano Roll Knife Tool (and make cut notes auto selected) (#7953)
* Adds an informative "TextFloat::displayMessage" when the knife tool is enabled.
* Automatically selects short ends if shift is not held down.
2026-02-24 08:49:55 +01:00
Johannes Lorenz
d36f3f019e CMake: Check for PERL's List::MoreUtils (#8180) 2026-02-22 10:44:17 +01:00
Sotonye Atemie
a8423c1e4a Emit the playbackPositionJumped signal only when the active timeline jumps (#8256)
Only emit the playbackPositionJumped signal when the timeline responsible for the current play mode jumps.
2026-02-15 12:14:45 -05:00
Sotonye Atemie
441fd905be Improve performance when moving channels in the Mixer (#8235)
Improves performance when moving mixer channels to the left or right using simple Qt layout operations and swapping of values. This commit also addresses a deadlock in Mixer::mixToChannel by ensuring we lock and unlock the same channel regardless of any move operations occurring simultaneously on another thread.
2026-02-09 11:57:28 -05:00