Commit Graph

8415 Commits

Author SHA1 Message Date
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
regulus79
2db75bd5d9 Fix Sample Clips Getting Out of Sync (#8183)
Fixes #8182

When #7454 was merged, the frameOffset variable inside Song::PlayPos which kept track of the actual frame position which the song was playing at relative to the last tick, was moved to Timeline. In the process, the type was inadvertently changed from float to f_cnt_t.

This caused the frame offset to be truncated ever time it was updated in Song::processNextBuffer, causing the song playback to slowly drift back ever so slightly, just a handful of frames every bar. This caused any new sample clips spawned to be created slightly late, becoming out of sync with any existing playing samples.

This PR fixes the issue by reverting the frameOffset variable type to be float again, allowing it to track sub-sample offsets over time.
2025-12-29 09:29:19 -05:00
Alex
e731231c62 Update translations (#8149)
* Pull translations from Transifex
2025-12-27 17:58:05 +05:30
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
szeli1
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
regulus79
c92741f567 Fix Pattern Editor Not Updating (#8175)
The TrackContentWidgets in the pattern editor rely on the positionChanged signal to be sent when the pattern index changes so that they know when to update. This signal was removed in #7454, but this PR puts it back.
2025-12-17 18:04:07 -05:00
regulus79
0fe7d6f679 Refactor to move positionChanged signal to Timeline (#7454)
Previously, this PR simply added a new signal to the Timeline class and had it emitted by the TimeLineWidget class in order to solve #7351.

However, as messmerd pointed out in his review comments, that was quite a hacky solution, and ideally the positionChanged signal would be solely managed by the backend Timeline class, while the frontend TimeLineWidget class would connect to those signals, instead of the other way around.

This PR is no longer a simple bugfix, but instead a refactoring of the Timeline/TimeLineWidget signal/slots.

Changes
- The positionChanged signal and updatePosition slot were removed from TimeLineWidget and moved to Timeline.
- Removed PlayPos, and instead store the timeline position in a TimePos along with a separate frame offset counter variable. The functions to set the ticks/timepos in Timeline emit the positionChanged signal. (Also, may emit positionJumped signal if the ticks were forcefully set--see below)
- The pos() method and PlayPos m_pos were removed from TimeLineWidget;
- The constructor for TimeLineWidget no longer requires a PlayPos reference.
- Since each TimeLineWidget stores a reference to its Timeline, a new method was added, timeline(), for other classes to access it.
- Removed array of PlayPos'es in Song. Now each Timeline holds their respective TimePos.
- Song's methods for getPlayPos were changed to return the TimePos of the respective Timeline. The non-const versions of the methods were removed because Timeline does not expose its TimePos to write.
- All of the places where Timelines are used were updated, along with their calls to access/modify the PlayPos. For example, occurrences of m_timeline->pos() were replaced with m_timeline->timeline()->pos(), and calls to m_timeline->pos().setTicks(ticks) were changed to m_timeline->timeline()->setTicks(ticks).
- ALSO: Removed m_elapsedMilliseconds, m_elapsedBars, and m_elapsedTicks from Song. The elapsed milliseconds is now handled individually by each Timeline.
- NEW: The m_jumped variable has been removed from Timeline. Now jumped events emit Timeline::positionJumped automatically whenever the ticks are forcefully set. This means it is no longer necessary to call timeline->setJumped(true) or timeline->setFrameOffset(0) whenever the playhead position is forcefully set. Many places in the codebase were already missing these calls, so this may fix some unknown bugs.

---------

Co-authored-by: Dalton Messmer <messmer.dalton@gmail.com>
Co-authored-by: saker <sakertooth@gmail.com>
Co-authored-by: Alex <allejok96@gmail.com>
2025-12-17 06:31:36 -05:00
Andrew Wiltshire
8a33dd7afe Add help message & icon to empty automation editor (#8171)
This PR brings the changes from #8148 into the automation editor

---------

Co-authored-by: Andrew Wiltshire <AW1534@users.noreply.github.com>
2025-12-17 05:30:30 -05:00
jefrecantuledesma
ec8efde28a Fix Shift+Space corrupting playback state when used on stopped editors (#8154)
* Fix Shift+Space corrupting playback state when used on stopped editors

Shift+Space (togglePause) was allowing state corruption by modifying
m_playing and m_paused without checking m_playMode. This created an
impossible state where m_playing=true while m_playMode=None, causing
the regular Space key to stop working.

Added a guard to ensure togglePause() only operates when something is
actually playing (m_playMode != PlayMode::None). This prevents the
corrupted state and maintains proper play/pause/stop behavior.

Fixes #8036

---------

Co-authored-by: regulus79 <117475203+regulus79@users.noreply.github.com>
2025-12-15 20:42:35 -05:00
Alex
0ffcfe3bff Allow PianoRoll to open empty again, but with a help icon (#8148)
Fixes #8152

Revert PianoRoll closing when empty (caused issues with detached windows)
Remove TextFloat warning when there are no instruments/multiple clips (showed up when reloading project)
(Keep clip creation for empty projects)
Add an icon and updated message in empty PianoRoll.
Mark PianoRollWindow invalid when there is no clip, making buttons impossible to click

---------

Co-authored-by: Fawn <rubiefawn@gmail.com>
2025-12-14 08:40:35 -05:00
Andrew Wiltshire
8627616175 Make playhead red when recording (#7847)
Co-authored-by: Dalton Messmer <messmer.dalton@gmail.com>
Co-authored-by: Fawn <rubiefawn@gmail.com>
Co-authored-by: Andrew Wiltshire <AW1534@users.noreply.github.com>
2025-12-12 10:02:25 -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
Lisa Magdalena Riedler
dd9afe7c23 Fix unknown arch+os info in versioninfo (#8159) 2025-12-08 16:07:33 -07:00
jefrecantuledesma
f12c54ca9e Fix truncated OGG exports (#8156)
This fixes a regression in commit f44aa3e that caused OGG exports to not flush any remaining data properly when finalizing the export, leading to truncated outputs with a different duration.

---------

Co-authored-by: Sotonye Atemie <sakertooth@gmail.com>
2025-12-07 02:44:50 -05:00
jefrecantuledesma
02a0367a4b Fix Clang compiler misidentification in About dialog (#8153)
Clang was incorrectly displayed as 'GCC Clang' because __GNUC__ is
defined by Clang for compatibility. Reordered preprocessor checks in
versioninfo.h to test for __clang__ before __GNUC__.

Fixes #8120
2025-12-07 01:44:29 -05:00
regulus79
0187e64ceb Fix Track Moving not Updating PatternClipView (#8155)
This bug was noticed when testing out #7559, but the PR had been open for over a year, so it was decided to merge it and fix it in this one.

Basically, when adding or removing a track, the TrackContainer sends out signals such as trackAdded or trackRemoved which PatternClipView uses to know when to update.

However, it does not send out a signal when a track has been moved.

This is because for some reason, it's done by the GUI TrackContainerView instead of the core TrackContainer.

This PR changes that by moving the core code to the core where it probably belongs, adding an appropriate trackMoved signal to TrackContainer, and connecting that to PatternClipView to update properly.

---------

Co-authored-by: Fawn <rubiefawn@gmail.com>
2025-12-03 16:29:12 -05:00
regulus79
94f3b9704a Add Beat Preview to PatternClipView (#7559)
This PR changes the way PatternClips are drawn in include a simple "beat preivew," where each note in any non-empty instrument tracks within the pattern are drawn as short little rectangles on the ClipView. SampleClips and AutomationClips within patterns are not currently supported.

The height of the note boxes changes depending on how many tracks there are in the pattern, and how many of them actually have notes (empty tracks are only drawn half as tall).

There is also some padding at the top and bottom along with a little bit of spacing between each note, both vertically and horizontally. This can be edited in the css, along with the note color.

---------

Co-authored-by: Dalton Messmer <messmer.dalton@gmail.com>
Co-authored-by: Fawn <rubiefawn@gmail.com>
2025-12-02 17:34:50 -05:00
Jan125
58a4a8a909 Add platform identifier to save files (#8116)
Adds `creatorplatform` and `creatorplatformtype` attributes to save files, which is useful for troubleshooting among other things.
2025-12-02 13:37:44 -07:00
Petar Katić
91517282c8 Fix missing icon in Slew Distortion help window (#8151) 2025-11-30 21:55:24 -05:00
regulus79
b01980d2fb Add Setting for Default Autoscroll State (#7851)
Previously, the autoscroll state of the song editor and piano roll (continuous, stepped, none) was not saved. This can be an issue for users who want to permanently set their autoscroll settings, without having to change them every time they start up LMMS.

This PR adds an option in the settings window to change the default autoscroll state.
2025-11-30 15:11:57 -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
Lost Robot
f50b047684 Fix untoggleable buttons not updating models (#8144) 2025-11-28 19:55:13 -07:00
Sotonye Atemie
69e1db58a8 Fix mute/solo icons not matching initial mixer channel state
Correct the button initialization order so mixer channels show the proper mute and solo states when they first appear. This applies to channels loaded from a project and channels created during the session, ensuring the UI reflects the actual underlying state properly.
2025-11-28 20:33:53 -05: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
regulus79
f093bde60c Fix Note Quantization Resetting Clip Length (#8131)
Fixes an issue where quantizing notes in a midi clip with auto-resize disabled would cause the length to be reset, in cases where there is only a single note in the clip. This was due to how quantization removes and re-adds each note, so for a moment, the clip would be empty, thus treated as a beat clip. Beat clips were mistakenly always automatically resized no matter whether auto-resize was enabled or not. This PR fixes that by only auto-resizing beat clips when they have auto-resize enabled.

Co-authored-by: Fawn <rubiefawn@gmail.com>

---------

Co-authored-by: Fawn <rubiefawn@gmail.com>
2025-11-23 12:34:41 -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
Fawn
31f86bc282 Use SVG asset for knife tool icon (#8128)
See lmms/lmms-artwork#23

Co-authored-by: Spekular <Spekular@users.noreply.github.com>
2025-11-19 19:14:39 -05:00