Commit Graph

8359 Commits

Author SHA1 Message Date
Fawn
0fe697c4e5 Remove fastMemCpy() from RemotePluginBase (#8114) 2025-10-29 16:32:29 -07: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
Sotonye Atemie
0c69da7233 Improve search behavior in the file browser (#7679) 2025-10-24 10:10:34 -04: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 Atemie
44a68b8b01 Fix audio resampling functionality (#7858)
Co-authored-by: Dalton Messmer <messmer.dalton@gmail.com>
2025-10-22 08:34:07 -04:00
Tres Finocchiaro
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ć
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
Dalton Messmer
4d10474d91 Update macOS runner image and XCode version (#8092) 2025-10-17 19:58:23 -04:00
Lost Robot
a809c03f87 Add SlewDistortion effect and oversampling support (#7641) 2025-10-13 12:18:34 -07:00
Tres Finocchiaro
807751dc4d AppImage: Un-pollute /usr/lib (#8053)
Refactor to un-pollute `$APP/usr/lib`
* Adds `usr/lib/suil-0` and `usr/lib/lmms/32` to `--deploy-deps-only` flags
* Simplifies libjack handling
* Removes outdated `LMMS_EXCLUDE_LADSPA` entry (carla no longer shares a parent folder with LADSPA plugins)
2025-10-06 11:03:16 -04: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
Dalton Messmer
912f4c2c50 Set minimum deployment target for macOS builds (#8004)
Set minimum deployment target for macOS builds
- Calculates MACOSX_DEPLOYMENT_TARGET based on qmake's minos value
- Echo's Lowest SDK supported for information purposes
---------

Co-authored-by: Tres Finocchiaro <tres.finocchiaro@gmail.com>
2025-09-23 10:46:50 -04:00
Alex
2eea79bdd3 Glue all notes if none are selected (#8018) 2025-09-09 23:37:39 -04:00
crystalreef22
04b27eee50 Allow Tempo Sync Knobs and Bars to be logarithmic (#8058)
* Allow Tempo Sync Knobs to be logarithmic

* Allow Tempo Sync Bars to be logarithmic
2025-09-08 00:37:31 -04:00
Fastigium
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
SameExpert
dec6a04574 OpulenZ: Fix compilation error (#8040)
This patch fixes the error: "invalid conversion from 'const unsigned char*' to 'unsigned char*'".
2025-08-18 04:05:37 -04:00
Fastigium
4aed2a8e5b Disable ASLR when building RemoteVstPlugin on Windows (#7976)
Disable ASLR when building RemoteVstPlugin executables on Windows in order to fix crashes when using certain VSTs

---------

Co-authored-by: Dalton Messmer <messmer.dalton@gmail.com>
2025-08-14 16:07:45 -04:00
regulus79
981e266613 Refactor Global Spacebar Play (#7926)
This PR simplifies #7762 by removing the editor-specific code from MainWindow and m_lastPlayMode from Song, and instead uses a static variable in Editor which keeps track of the last played editor.

This PR also removes the spacebar shortcut from MixerChannelView for changing the volume, as multiple users have noticed that it clashes with their intuition after getting used to the spacebar working everywhere else.
2025-08-14 10:08:04 -04:00
Monospace-V
0d6cbbdf5e Fix crash01, cello01, and e-organ01 sample lengths (#7948) 2025-08-11 00:44:07 -04:00
Alex
4dc7784331 PianoRoll: fix getKey and remove dead code (#8008)
- Fixes: when right clicking on a piano key close to the lower edge of the screen, "Mark semitone" will mark the wrong key because it uses the upper edge of the context menu as reference.
- Fixes: getKey() is off by 2 pixels
- Introduces: yCoordOfKey() which is the reverse of getKey()
- Removes: section of code that can never be reached

---------

Co-authored-by: Johannes Lorenz <1042576+JohannesLorenz@users.noreply.github.com>
2025-08-09 15:37:15 -04:00
Michael Gregorius
ab050b88e5 Fix several problems (#8032)
## Fix problems with lifetime of `QByteArray`

Fix a problem with the lifetime of a `QByteArray` in
`attemptToReconnectOutput` and `attemptToReconnectInput`.

The method `constData` was called on a temporary which gets destroyed
before `targetName` and `sourceName` are used, thus leading to undefined
behavior.

## Fix index checks

Fix index checks in `attemptToReconnectOutput` and
`attemptToReconnectInput`.

The previous code would have allowed an index to be `size` of the
underlying vector which would access out-of-bounds memory.

## Braces for one-liner if statements

Add braces for one-liner if statements.
2025-08-07 12:12:18 +02:00
Michael Gregorius
88ed51edb9 Fix a segfault if JACK libs are missing (#8026)
Fix a segmentation fault that occurs if the JACK libraries are not
installed. In that case `jack_client_open` which is called through
`lib_weakjack` will return a `nullptr` for the client. Subsequent calls
to `jack_client_open` do not check for `nullptr` in the library so we
have to do this ourselves to prevent the segmentation fault. The check
is added to `AudioJack::setupWidget::getAudioPortNames`.

Extract the printing of the JACK status into the function
`printJackStatus` as its functionality is needed several times.

Print a warning and the status in `AudioJack::setupWidget::setupWidget`.

## Code review changes

Use `std::printf` and `std::fprintf`and print to `stderr` whenever fitting.

---------

Co-authored-by: Andrew Wiltshire <62200778+AW1534@users.noreply.github.com>
2025-08-06 18:12:56 +02:00
Dalton Messmer
dabfe6f95b Audio buffer view improvements (#8016)
- Add `SampleType` concept
- Make `channels()` static when possible
- Add `dataSizeBytes()` and `dataView()` to `InterleavedBufferView`
- Support conversions between `std::span<SampleFrame>` and `InterleavedBufferView<float, 2>`
- Support iteration over frames of `InterleavedBufferView`
- Add `subspan` method
- Add `AudioBufferView` concept

---------

Co-authored-by: Sotonye Atemie <sakertooth@gmail.com>
2025-08-06 04:01:21 -04:00
Dalton Messmer
c86fe784c7 Remove the Gate knob from effects (#8011)
Major changes:
- Remove Gate knob from effects, effectively hard coding its value to zero
- Replace effect RMS calculations with a more efficient way of detecting silent buffers
- Only perform silent buffer detection when `ProcessStatus::ContinueIfNotQuiet` is returned from a plugin AND auto-quit is enabled

Minor changes:
- Remove gate from presets
- Remove gate from .mmp projects
- Move `Effect::processorCount()` to `LadspaEffect`
- Rename `Effect::checkGate` to `Effect::handleAutoQuit`
- Adjust silence threshold for better compatibility with old RMS calculations
- Remove some unnecessary methods from `Effect`
- Reset quiet buffer count in `stopRunning`
- Use positive name for auto-quit boolean
- Simplify `m_autoQuitEnabled` initialization
2025-07-22 17:01:48 -04:00
Johannes Lorenz
71ce49d7ba Remove lots of useless/misplaced includes (#7999)
Follow-Up of 7db3fa94a1 .

This was done by setting `CMAKE_C_INCLUDE_WHAT_YOU_USE` and
`CMAKE_CXX_INCLUDE_WHAT_YOU_USE` to (broken down into multiple lines here,
note, all below `FL/x.h` is not required for C):

```
include-what-you-use;
    -Xiwyu;--mapping_file=/usr/share/include-what-you-use/qt5_11.imp;
    -Xiwyu;--keep=*/xmmintrin.h;
    -Xiwyu;--keep=*/lmmsconfig.h;
    -Xiwyu;--keep=*/weak_libjack.h;
    -Xiwyu;--keep=*/sys/*;
    -Xiwyu;--keep=*/debug.h;
    -Xiwyu;--keep=*/SDL/*;
    -Xiwyu;--keep=*/alsa/*;
    -Xiwyu;--keep=*/FL/x.h;
    -Xiwyu;--keep=*/MidiApple.h;
    -Xiwyu;--keep=*/MidiWinMM.h;
    -Xiwyu;--keep=*/AudioSoundIo.h;
    -Xiwyu;--keep=*/OpulenZ/adplug/*;
    -Xiwyu;--keep=QPainterPath;
    -Xiwyu;--keep=QtTest
```

FAQ:

* Q: Does this speed-up a completely fresh compile?
* A: No, I measured it.

* Q: Does it speed up anything else?
* A: Yes. If you change one header, it can reduce the number of CPP files
     that your compiler needs to recompile, or your IDE has to re-scan.

* Q: What other reasons are for this PR?
* A: It's idiomatic to only include headers if you need them. Also, it will
     reduce output for those who want to use IWYU for new PRs.

Background:

This is just a remainder PR of what I planned. My original idea was to setup
a CI which warns you of useless includes (but not of all issues that IWYU
complains about). However, I could not see that this was favored on Discord.
A full IWYU CI also has the problem that it (possibly??) needs to compile
with `make -j 1`, which would make CI really slow.

However, for that plan, I had to fix the whole code base to be IWYU
compliant - which it now is.
2025-07-21 23:39:17 +02:00
regulus79
e79945ffc5 Remove m_resizable from Clips (#7954)
Minor refactor of `Clip` methods related to resizing
2025-07-21 09:39:14 -04:00
Michael Gregorius
997764a0dc Inputs and Outputs Selection for Jack Driver (#7919)
# GUI

## Present inputs/outputs in hierarchical menu

Present the available inputs and outputs in a hierarchical sorted menu
which shows clients with their ports.

The heavy lifting of creating the menu for the tool button is done in the
new method `buildMenu`.

It takes the input/output names in Jack's "Client name:Port name" format.
If an input/output name can be successfully split into the client name
and port name then a sub menu with the client name is created (if it was
not already created before) and the port name is added as an entry.

If the name cannot be split into exactly two components then it is simply
added to the top level menu as is.

Ports of the LMMS client are filtered out to prevent loops.

The menu starts with the client's sub menus in alphabetical order. Then
the top level entries are added in alphabetical order as well.

The callbacks for the `QAction` instances are implemented with lambdas
because MOC does not support nested classes like the setup widget is. For
now the used lambda only sets the text of the `QToolButton` as these are
used for persisting the configuration anyway.

## Disconnected state

Add the option to keep inputs/outputs disconnected.

The disconnected state is represented by the string "-" which is also
what is saved into the configuration in this case. For now the
representation in the GUI and of the save state is the same as it has the
advantage that no translation is necessary and thus not mapping between
display text and save state is necessary.

## Show technical output/input names

Show the technical output and input port names used by LMMS in the setup
dialog. Note: these are the names that are shown in tools like `qjackctl`
or `qpwgraph`.

This was proposed in a review. Personally I like the non-technical names
better but let's see what's accepted.

## Let the tool buttons use available space

Let the tool buttons stretch so that they look uniform and use all the
available space.

# Driver

## Reconnect inputs and outputs

Attempt to reconnect the inputs and outputs from the configuration during
startup of the Jack driver. Nothing will be done for inputs and outputs
that are not available at startup. Example: the users might have saved
some inputs when a device was available. The device is then disconnected
and LMMS restarted. The stored inputs cannot be used anymore. To give the
users the least surprise nothing is done.

`AudioJack::attemptToConnect` does the actual reconnection and also
prints some information for now.

`attemptToReconnectOutput` and `attemptToReconnectInput` delegate to
`attemptToConnect` with the right parameters.

# Technical details

## Generalized number of inputs/outputs

Generalize the number of inputs and outputs by using for loops. This
affects the number of widgets that are created and the amount of
configuration that is stored.

This change is a result of a code review discussion. In my opinion it
adds unnecessary complexity to something that should later be implemented
completely different anyway. It is for example now necessary to compute
the key names that are used during the saving of the configuration based
on the channel number. The commit exists so that its changes can be
discussed further. It might be reverted in one of the next commits.

## Collecting input and output names

Add `AudioJack::setupWidget::getAudioPortNames` which takes the type of
port and then collects all port names which match. Make
`getAudioOutputNames` and `getAudioInputNames` delegate to that method
with the appropriate type. This also hides the different terminologies a
bit.

## Separate Jack client in the GUI

The separate Jack client is necessary because the setup dialog does not
have any access to the actual driver. So a new client is created when the
dialog is opened and deleted when it is closed, i.e. when the dialog is
deleted itself.

## Repeated strings

Repeatedly used hard-coded strings are defined as static constant
variables in the anonymous namespace. This should prevent subtle mistakes
when working with the configuration values of the Jack driver.

## Saving the settings

`AudioJack::setupWidget::saveSettings` saves the selections that have
been made from the widgets right into the configuration.
2025-07-16 22:31:01 +02:00
Alex
344fdd5b1f Remove currentPatternChanged() that has no effect (#7989) 2025-07-15 09:17:51 +02:00
Sotonye Atemie
48f3a84206 Set the sample rate for MP3 exports (#7998)
Sets the MP3 export sample rate to that of the engine's rate.


Co-authored-by: Dalton Messmer <messmer.dalton@gmail.com>
2025-07-10 05:55:45 -04:00
Dalton Messmer
1641f5f95f Use C++20 in RemoteVstPlugin (#7916)
- Build RemoteVstPlugin in C++20 mode
- Avoids using std::wstring due to strange issues with it when built
with wineg++. See https://bugs.winehq.org/show_bug.cgi?id=58465
- Fix some memory leaks + minor cleanup of RemoteVstPlugin code
- Rename `F_OPEN_UTF8` to `fopenUtf8`
- Use C++20 in our `determine_version_from_source` CMake function
- Update ZynAddSubFX submodule
2025-07-10 02:08:42 -04:00
Michael Gregorius
4c3f8191af Remove Knob::setHtmlLabel (#7993)
* Remove Knob::setHtmlLabel

Remove the unused method `Knob::setHtmlLabel` and its associated members.
This removes some unnecessary complexity from the code.

* Public label methods

Make `Knob::setLabel` public. Add `Knob::getLabel` for completeness.

* Delegate in KnobControl::setText

Make `KnobControl::setText` delegate to the `Knob` instance now that `Knob::setLabel` is public again.
2025-07-07 20:16:24 -04:00
Abel Umenhoffer
a1da660741 Fix Carla breaking GUI on Wayland #7582 (#7966) 2025-07-06 21:08:31 -04:00
Michael Gregorius
5c7131aa45 Allow export of only the selected notes (#7991)
Users can now choose if they only want to export the selected notes when
exporting a MIDI clip as an `xpt` or `xptz` file in the piano roll. The
export file dialog now shows a checkbox with the label "Export only
selected notes".

## Technical details
Add the new public method `exportToXML` to `MidiClip`. Compared to
`saveSettings` it has an additional parameter `onlySelectedNotes` which
controls which notes are exported. The default is to export all notes.
The method `saveSettings` now simply delegates to `exportToXML` using the
default.

`PianoRollWindow::exportMidiClip` now adds a check box to the export
dialog which lets users select if they only want to export the selected
notes or all notes. The default is to export all notes. The method now
uses the new method `exportToXML` for the export and passes the state of
the check box into the method.
2025-07-06 08:42:54 +02:00
Michael Gregorius
05a5264870 Fix import of xpt and xptz files (#7986) (#7990)
Fix the import of `xpt` and `xptz` files by adding upgrade code to
`DataFile::type`. The new code maps the old textual representation
"pattern" to the enum `Type::MidiClip`.

Without the extra upgrade code the text "pattern" is mapped to
`Type::Unknown`. This then leads to problems at the end of
`DataFile::loadData` where the enum representation is mapped back to the
textual representation again to retrieve the root element from the
upgraded XML.

So without the upgrade it's:
* Map "pattern" to `Type::Unknown`
* Upgrade XML from "pattern" to "midiclip"
* `Type::Unknown` does not map to "midiclip" and fetching the root
  element fails.

With the upgrade it's:
* Map "pattern" to `Type::MidiClip`
* Upgrade XML from "pattern" to "midiclip"
* `Type::MidiClip` is mapped to "midiclip" and fetching the root element
  succeeds.
2025-07-05 19:03:05 +02:00
regulus79
00d5abc930 Recording logarithmic automation hotfix (#7621)
When you record an automation clip with a logarithmic knob (for example, a freq knob in the equalizer) the recorded values in the automation editor are correct.....

....But, for whatever reason, lmms tries to scale the recorded values back to linear when playing the automation, which causes the recorded frequency to be much lower.

This pr does not fix the underlying issue, but instead just scales the recorded values so that everything works.
2025-07-04 11:52:04 -04:00
regulus79
bbdfeff5e1 Add Playhead and Timeline to Pattern Editor (#7794)
Adds a visual indicator to show the pattern editor playing, along with a timeline widget to allow the user to skip forward/backward in a pattern.
2025-07-02 18:04:16 -04:00
Fawn
186beec156 Fix effect gate logic (#7971)
Reverts a mistake from #7696
2025-06-25 16:17:53 -04:00
Alex
346ee60cd2 Update clip length after clearing all notes (#7960)
When clearing notes from a long melody clip in pattern editor, it looks like the clip becomes short, but it actually remains the same length (despite empty), and that affects the length of the whole pattern. This PR fixes this issue.
2025-06-21 20:53:34 -04:00
Fawn
2806a31e4c Use vector assets for Dispersion plugin (#7773) 2025-06-15 20:23:52 -06:00
Alex
76dddd8c66 Don't undo zoom! (#7943)
Makes it so that editor zoom, automation tension, along with quantization, note length, and all other combo boxes are not added to the undo history.

---------

Co-authored-by: szeli1 <143485814+szeli1@users.noreply.github.com>
2025-06-15 14:41:23 -04:00
regulus79
45ab56dd71 Fix Auto Resize when Dragging Sample Files onto Sample Clips (#7952)
Changes things so that only sample clips with auto-resize enabled will automatically resize to the sample length when dragging-dropping a sample from the sidebar onto a sample clip. Non-auto-resize clips will keep their original length, but still update so that their start time offset is 0.
2025-06-13 21:30:11 -04:00
Alex
a505f570e9 Fix TextFloat flickering (#7942)
Fixes TextFloat flickering which occurs when scrolling on knobs, faders, and note volume in the piano roll.

---------

Co-authored-by: Dalton Messmer <messmer.dalton@gmail.com>
2025-06-10 19:04:45 -04:00
Dalton Messmer
53d30d8b91 Audio buffer views (#7945)
Adds two non-owning views for audio buffers: `InterleavedBufferView` and `PlanarBufferView`.

The channel count can be specified at either compile-time or runtime. Specifying at compile-time provides both performance and space optimizations. The way this works is the same as `std::span` except this uses the new `DynamicChannelCount` constant rather than `std::dynamic_extent`.
2025-06-08 20:15:16 -04:00
Petar Katić
0dfd2d5597 Init commit (#7940)
Fixes a bug where the "Init" button in LOMM visually behaves as a toggle button instead of a push button.
2025-06-07 20:09:54 -06:00
Sotonye Atemie
3a18276136 Use complete basename in PathUtil::cleanName instead of basename (#7934)
Use `completeBaseName()` in `PathUtill::cleanName` instead of the `baseName()`. Needed for handling filenames with periods correctly.
2025-06-06 16:55:26 -04:00
Bimal Poudel
889a2f8aac Fix quick access letter conflict with Export and Export Tracks (#7927)
Update shortcut `T` for exporting Tracks, so that `x` is default export.

---------

Co-authored-by: Sotonye Atemie <sakertooth@gmail.com>
Co-authored-by: Andrew Wiltshire <62200778+AW1534@users.noreply.github.com>
2025-06-05 08:32:38 -04:00
regulus79
ce3439b079 Fix Piano Roll key events from leaking to other instrument windows (#7915) 2025-06-04 21:26:41 -04:00
regulus79
8acc4ed3ae Fix Position Line gradient appearing in all editors no matter which one is playing (#7882) 2025-06-03 23:10:13 -04:00