8441 Commits

Author SHA1 Message Date
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
regulus79
84f691cafc Fix PianoRoll Timeline Constantly Emitting positionJumped During Record-Play (#8252)
When #7454 was merged, Timelines were refactored to emit a positionJumped signal whenever their internal tick position was changed via Timeline::setTicks. This was meant as an easy way to account for all situations where the user might drag or click or somehow forcefully set the position of a timeline mid-playback.
However, the current way timeline syncing is implemented between the song editor and piano roll (when doing record-play in the piano roll) is by constantly calling setTicks on the piano roll's timeline whenever the song editor's timeline moves. This inadvertantly means that positionJumped is being emitted, even when the timeline is tracking smoothly.

This PR attempts to address this issue by adding an optional parameter to Timeline::setTicks which allows the caller to opt out of emitting positionJumped. Ideally, we would have a better system for syncing timelines together, one which does not rely on forcefully calling setTicks. But for now, this should work.

---------

Co-authored-by: Sotonye Atemie <satemiej@gmail.com>
2026-02-08 15:22:20 -05:00
WeakOstra
f35a1dfca8 Fix Pattern Editor UI updates when adjusting note volume via scrolling (#8196)
Closes #7806
2026-02-08 11:50:58 -05:00
ExternStat
a74339f89b Fix AutomatableSlider Creating Too Many Journal Entries (#8223)
---------

Co-authored-by: Dalton Messmer <messmer.dalton@gmail.com>
2026-02-07 17:21:36 -05:00
regulus79
937c8b9d5d Increase Clip Resize Grip Width (#8169)
Requested by a user on the forum. Sometimes, it can get tricky when two clips are right next to each other, and you're trying to resize one of them. Either you resize the right one, or the other one starts resizing behind the other, so you end up having to move one over, then resize it, then move it back. And it's just not awesome.

However, this can be mitigated by simply increasing the clip resize grip width. Currently, it is at 4 px, but increasing it to 8 px makes it easier to specifically target which clip you want to resize. It also probably makes it easier to resize clips in general for users who may struggle to aim the mouse perfectly within that 4 pixel gap.
2026-02-07 13:57:43 -05:00
regulus79
ff9c29d189 Fix Hardcoded Max dB Value When Double-Clicking Knobs (#8189)
Partially addresses #8188

For some reason, when a knob is set to be a "volume knob", the max volume allowed via double-clicking and typing in a value is 6.0 dB. For knobs such as the amplifier knob in Audio File Processor which go up to 500% (~14 db), this is not enough.

This PR makes it so that the dialog shows the actual max dB value based on the underlying model's max value, instead of being hardcoded to 6.0 dB. This PR does not address the minimum value.
2026-02-07 13:57:00 -05:00
Petar Katić
7147caa37a Fix clips not retaining colors or names after using "Clear notes out of bounds" (#8234) 2026-02-07 13:08:04 -05:00
Andrew Wiltshire
c62b42a7c9 Clarify VST support to VST2 and mention LV2 support in README (#8233)
* Clarify VST support to VST2 in README

Updated VST support mention from VST(i) to VST2 in features section for clarity.

* Update README.md

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

* mention LV2 support

---------

Co-authored-by: Dalton Messmer <messmer.dalton@gmail.com>
2026-02-02 23:10:39 +01:00
Sotonye Atemie
c14a327d31 Refactor PortAudio backend (#7444)
Refactors the PortAudio backend to fix issues with DirectSound and MME crackling and not loading properly, as well as to improve code quality and maintainability.

---------

Co-authored-by: Dalton Messmer <messmer.dalton@gmail.com>
2026-02-01 14:23:44 -05:00
regulus79
f504204ef1 Fix Pitch Bending, Strum, and Knife Tools Affecting Per-Note Velocity/Panning (#8243) 2026-02-01 12:55:26 -05:00
regulus79
eb46e6f8de Fix Right-click Remove Node Precision with Pitch Bending (#8242) 2026-02-01 12:53:57 -05:00
Yohanan
ed1e29adfd Fix velocity/panning change affecting unselected notes (#8201)
Fixes #8200. Scrolling to change velocity/panning can affect unselected notes if hovering over them in the bottom section of the piano roll. This PR addresses that.
2026-02-01 11:00:27 -05:00
Sotonye Atemie
e076446fd3 Set file format combo box unconditionally (#8237) 2026-01-31 23:39:34 +01:00
Sotonye Atemie
13ea2ee480 Refactor ExportProjectDialog (#8215)
This refactors the export dialog to no longer use the export_project.ui file and moves it into standard C++ Qt code. This also brings minor changes to the dialog, such as horizontal labels instead of vertical ones.
2026-01-22 19:07:25 -05: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
Itreza2
f4f85e1f33 Avoid adding journal checkpoints when initially creating volume knobs (#8214)
* reimplement getter and setter of FloatModelEditorBase::m_volumeKnob to avoid undo checkpoint creation

* convert FloatModelEditorBase::m_volumeKnob from BoolModel to bool

* clean up

* remove unnecessary inline keywords and fix formatting

---------

Co-authored-by: Sotonye Atemie <sakertooth@gmail.com>
2026-01-19 10:53:10 -05:00
Daniel Kristiansson
dab06be491 Bump project year (#8207) 2026-01-18 14:57:11 -05:00
Fawn
5e3a67c9d1 Improve lmms::fastRand() and use it instead of std::rand() (#7741) 2026-01-15 17:12:04 -07:00
Itreza2
b390fa414a Add Horizontal Scroll Bar to the File Browser (#8184) 2026-01-14 14:39:59 -05:00
Dalton Messmer
248acbf9a4 Improve strum tool LMB event (#8195) 2026-01-08 13:52:39 -05:00
regulus79
d4cabd5650 Fix Sample Clip Loop Exporting (#8192)
Fixes #8190

When #7454 was merged, I added a check before emitting playbackPositionJumped to only emit when the song was playing, to prevent LFOs from being reset when the user dragged the timeline while the song was paused. However, I used Song::isPlaying(), which only returns true when the song is not exporting. This caused sample clips to not be updated when the playback position jumped back every loop, which means they just kept playing, ignoring the loop. To fix this, I have changed it to use m_playing, which is true for both exporting and normal playing.
2026-01-06 06:34:38 -05:00
Sotonye Atemie
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
11b4a9bddc Pitch Bending Directly in the Piano Roll (#7759)
This PR modifies how the Detuning tool works in the piano roll to let the user modify the automation curve right on the notes. This is actually fairly simple, as automation clips already contain the functions for dragging and removing points like in the Automation Editor. So essentially all that's being done is calculating the relative pos of the mouse to the nearest note, and setting the drag value in the automation clip to that position and key.

You can still access the old automation editor version by shift-click

messmerd asked if the code could be made general for any future note parameter besides detuning, in preparation for CLAP per-note parameter automation. I have refactored the relevant functions to accept an enum type for the kind of note parameter, although currently only detuning is supported.

---------

Co-authored-by: Sotonye Atemie <sakertooth@gmail.com>
Co-authored-by: Sotonye Atemie <satemiej@gmail.com>
Co-authored-by: szeli1 <143485814+szeli1@users.noreply.github.com>
2026-01-04 14:18:06 -05:00