{"payload":{"feedbackUrl":"https://github.com/orgs/community/discussions/53140","repo":{"id":15778896,"defaultBranch":"master","name":"lmms","ownerLogin":"LMMS","currentUserCanPush":false,"isFork":false,"isEmpty":false,"createdAt":"2014-01-09T20:43:43.000Z","ownerAvatar":"https://avatars.githubusercontent.com/u/6363159?v=4","public":true,"private":false,"isOrgOwned":true},"refInfo":{"name":"","listCacheKey":"v0:1713976863.0","currentOid":""},"activityList":{"items":[{"before":"9ca9143f5b26ae0e0ab54dcecf5c81a3d4549d05","after":"d5f5d00a6f1faabdba4f710d04ad303bd439a6f2","ref":"refs/heads/master","pushedAt":"2024-05-02T00:13:55.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"sakertooth","name":"saker","path":"/sakertooth","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/20197645?s=80&v=4"},"commit":{"message":"Fix shifting of sample waveform during zoom (#7222)\n\nThe original code was doing division in `int`, which causes lost of accuracy and results in the waveform randomly shifting when zooming in and out.\r\n\r\nThis should fix it by casting variables to `float` before dividing, as well as keeping the values in `float` type.\r\n\r\nThe pull request also changes some type declaration to explicit to increase readability","shortMessageHtmlLink":"Fix shifting of sample waveform during zoom (#7222)"}},{"before":"bb6a77aa0fccb270dfe98c014c3142a2578e0aeb","after":"9ca9143f5b26ae0e0ab54dcecf5c81a3d4549d05","ref":"refs/heads/master","pushedAt":"2024-05-01T16:03:35.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"michaelgregorius","name":"Michael Gregorius","path":"/michaelgregorius","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/9293269?s=80&v=4"},"commit":{"message":"Fix upgrade routine for BPM renamings (#7235)\n\nFix the upgrade routine that was introduced with pull request #6747 which added the BPM value to some file names.\r\n\r\nThis also simplifies the implementation by using a map.\r\n\r\nNote: this also removes the code about the prefix `factorysample:`. If it is used in some files these entries will also have to be added to the map.","shortMessageHtmlLink":"Fix upgrade routine for BPM renamings (#7235)"}},{"before":"c0a4df49a24f17ddb83fa060c78b91f61369d924","after":"bb6a77aa0fccb270dfe98c014c3142a2578e0aeb","ref":"refs/heads/master","pushedAt":"2024-04-29T17:22:37.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"michaelgregorius","name":"Michael Gregorius","path":"/michaelgregorius","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/9293269?s=80&v=4"},"commit":{"message":"Only set sample clips for valid files (#7224)\n\nCheck if a non-empty buffer was loaded and only set the sample clip if that's the case.\r\n\r\n## Other changes\r\n\r\nMove setting the song to modified towards the core in the context of `SampleClip`. Previously the `SampleClipView` did this but it's none of it's business.\r\n\r\nIntroduce `SampleClip::changeLengthToSampleLength` which changes the length of the clip to the length of the sample. This was also previously done by the view which is again the wrong place to do the necessary calculations. An unnecessary `static_cast` was removed while carrying over the code.\r\n\r\nAdd the method `SampleClip::hasSampleFileLoaded` which checks if the loaded sample corresponds to a given file name.\r\n\r\nFix code formatting.","shortMessageHtmlLink":"Only set sample clips for valid files (#7224)"}},{"before":"86363819c556a63e7666d173118a50013eb93ce9","after":"c0a4df49a24f17ddb83fa060c78b91f61369d924","ref":"refs/heads/master","pushedAt":"2024-04-29T14:47:17.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"michaelgregorius","name":"Michael Gregorius","path":"/michaelgregorius","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/9293269?s=80&v=4"},"commit":{"message":"Lb302: Consistent decay in time (#7230)\n\nThe previous implementation of Lb302`s decay used a fixed decay factor that was multiplied with the signal until the minimum threshold of 1/65536 was crossed. This fixed factor resulted in different lengths in time for different sample rates.\r\n\r\nThis is fixed by computing the decay factor by taking the sample rate into account as well. The new static method `computeDecayFactor` computes the factor that is needed to make a signal decay from 1 to a given attenuation over a given time.\r\n\r\nThe parameters used in the call to that method in `Lb302Synth::process` have been fine-tuned such that, at a sample rate of 44.1 kHz, they result in a factor very close to the previous hard-coded factor of 0.99897516.","shortMessageHtmlLink":"Lb302: Consistent decay in time (#7230)"}},{"before":"5c0db46a609fd9245ba90c24244b50ea7a0c44fb","after":"86363819c556a63e7666d173118a50013eb93ce9","ref":"refs/heads/master","pushedAt":"2024-04-27T19:17:12.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"michaelgregorius","name":"Michael Gregorius","path":"/michaelgregorius","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/9293269?s=80&v=4"},"commit":{"message":"Fix Kicker's release stage (#7226)\n\nWhen applying its release stage Kicker did not take the frames before the release into account but instead always applied the release to the full buffer. This potentially lead to a jump in the attenuation values instead of a clean linear decay.\r\n\r\nSee #7225 for more details.","shortMessageHtmlLink":"Fix Kicker's release stage (#7226)"}},{"before":"2bd862a0fbd9f6e89ee148752ca1eee8fa6817eb","after":"52c15d3562fdf21358870d891d65991f98191b9c","ref":"refs/heads/qt6","pushedAt":"2024-04-27T16:22:46.000Z","pushType":"push","commitsCount":5,"pusher":{"login":"DomClark","name":"Dominic Clark","path":"/DomClark","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1873225?s=80&v=4"},"commit":{"message":"Merge remote-tracking branch 'upstream/master' into qt6","shortMessageHtmlLink":"Merge remote-tracking branch 'upstream/master' into qt6"}},{"before":"6c846684cd845c683f4eb0af13c7407399acece5","after":"5c0db46a609fd9245ba90c24244b50ea7a0c44fb","ref":"refs/heads/master","pushedAt":"2024-04-27T15:45:55.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"michaelgregorius","name":"Michael Gregorius","path":"/michaelgregorius","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/9293269?s=80&v=4"},"commit":{"message":"Streamline instrument flags (#7227)\n\n## Instrument flags as a property of an instrument\r\nThe instruments flags (single streamed, MIDI based, not bendable) are properties of an instrument that do not change over time. Therefore the flags are made a property of the instrument which is initialized at construction time.\r\n\r\nAdjust the constructors of all instruments which overrode the `flags` method to pass their flags into the `Instrument` constructor.\r\n\r\n## Add helper methods for flags\r\nAdd helper methods for the flags. This makes the code more concise and readable and clients do not need to know the technical details on how to evaluate a flag.\r\n\r\n## Remove the flags methods\r\nRemove the flags methods to make it an implementation detail on how the flags are managed.","shortMessageHtmlLink":"Streamline instrument flags (#7227)"}},{"before":"a53e5ba2f671ca5c1cc133dc8f763b8150e09c9b","after":"6c846684cd845c683f4eb0af13c7407399acece5","ref":"refs/heads/master","pushedAt":"2024-04-27T15:21:09.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"DomClark","name":"Dominic Clark","path":"/DomClark","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1873225?s=80&v=4"},"commit":{"message":"Replace call `QT5_WRAP_UI` with `CMAKE_AUTOUIC` (#7200)","shortMessageHtmlLink":"Replace call QT5_WRAP_UI with CMAKE_AUTOUIC (#7200)"}},{"before":"71dd300f43d6c1e69cbf1362174a8747427ff248","after":"a53e5ba2f671ca5c1cc133dc8f763b8150e09c9b","ref":"refs/heads/master","pushedAt":"2024-04-27T11:59:02.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"sakertooth","name":"saker","path":"/sakertooth","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/20197645?s=80&v=4"},"commit":{"message":"Remove high quality mode from codebase (#7219)\n\nMany, many years ago (93a456c), high quality mode was merely disabled after it was noted that it can be problematic rather than being completely removed. Remove it from the codebase so we can get rid of some code and clean things up a bit.","shortMessageHtmlLink":"Remove high quality mode from codebase (#7219)"}},{"before":"62e2a39a7ef5177d35aee3b86852e8afda06ef08","after":"2bd862a0fbd9f6e89ee148752ca1eee8fa6817eb","ref":"refs/heads/qt6","pushedAt":"2024-04-25T03:58:14.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"Veratil","name":"Kevin Zander","path":"/Veratil","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2244945?s=80&v=4"},"commit":{"message":"Add experimental Qt 6 support flags. (#7182)\n\n* refactored gui_templates.h\r\n\r\n* experimental qt6 support enabled\r\n\r\n* replace qt5_wrap_ui with cmake_autouic\r\n\r\n* Make the minimum code compile for Qt6\r\n\r\nThe following changes are applied to make the minimum build configuration compile:\r\n* Remove usage of a `QKeyEvent` constructor in `ColorChooser.h` by directly forwarding the original event.\r\n* Change `QMap` to `QMulitMap` in several places in `ControlLayout.h` because that's what in fact is used.\r\n* Change the parameter from `QEvent` to `QEnterEvent` in some `enterEvent` overrides.\r\n* Add an include for `algorithm` in `MixHelpers.cpp`\r\n* Fix a problem with string argument replacement in `embed.cpp`\r\n* Introduce the usage of `QKeySequence` including the replacement of the `+` operator with the `|` operator.\r\n* Add an include for `QActionGroup` in `ProjectNotes.cpp`.\r\n* Use `QPalette::window` instead of `QPalette::background` in `ClipView.cpp`\r\n* Use `qBound` instead of `qBound` in `PianoRoll.cpp`. Add a cast.\r\n* Replace the deprecated call to `QLayout::setMargin` with `QLayout::setContentsMargins`\r\n\r\nNote: there are still lots of warnings when you compile this state with Qt6!\r\n\r\n* Qt 5 support\r\n\r\n* Fix Qt5 build for ControlLayout\r\n\r\nFix the Qt5 build for `ControlLayout` by intoducing typedefs depending on the Qt version and using these throughout `ControlLayout`.\r\n\r\n* Prepare LadspaMatrixControlDialog for Qt6\r\n\r\nUse `setContentsMargins` instead of `setMargin`.\r\n\r\n* CMakeLists.txt adjustments for Qt6\r\n\r\nAdd the dependency to \"Core5Compat\" to the main CMakeLists.txt. It is needed so that we can use `QTextCodec` which is used by the Hydrogen importer plugin.\r\n\r\nAdjust the CMakeLists.txt of the ZynAddSubFx plugin so that it also makes use of `QT_VERSION_MAJOR` and therefore builds under Qt5 and Qt6.\r\n\r\n* force qt 5 on vst for now\r\n\r\n* cleanup qt5compat finding code\r\n\r\n* Fix build\r\n\r\nFix the build that failed after the merge of master. The data type that `QColor::getRgbF` uses has changed between Qt5 and Qt6. This is solved with a using because changing the type to `float` which is used by Qt6 did not work with Qt5 either.\r\n\r\n* Fix warnings in AutomationClip.cpp\r\n\r\nFix warnings in `AutomationClip.cpp`. These have been warnings of the type:\r\n\"Warning: »QMap::const_iterator operator-(QMap::const_iterator, QMap::const_iterator::difference_type)« is deprecated: Use std::prev; QMap iterators are not random access [-Wdeprecated-declarations]\r\n\r\n* Fix warning in AutomationClipView\r\n\r\nFix build warning about deprecated iterator operators in `AutomationClipView`.\r\n\r\n* Fix deprecated usage of x() and y() methods\r\n\r\nFix the deprecated usage of the following methods:\r\n* `QMouseEvent:x()`\r\n* `QMouseEvent:y()`\r\n* `QDropEvent:x()`\r\n* `QDropEvent:y()`\r\n\r\nThis is done by adding two new helper methods names `position` to `DeprecationHelper.h` and using these methods in the event methods.\r\n\r\n* Fix more iterator operator warnings\r\n\r\nFix more warnings about iterator operators by using `std::prev` and `std::next`.\r\n\r\n* Fix QKeyCombination warning\r\n\r\nFix warnings about `QKeyCombination::operator+`.\r\n\r\n* added minimum version check\r\n\r\nCo-authored-by: Dalton Messmer \r\n\r\n* zyn build fix for msvc qt6\r\n\r\n---------\r\n\r\nCo-authored-by: Michael Gregorius \r\nCo-authored-by: Dalton Messmer ","shortMessageHtmlLink":"Add experimental Qt 6 support flags. (#7182)"}},{"before":"62e2a39a7ef5177d35aee3b86852e8afda06ef08","after":"71dd300f43d6c1e69cbf1362174a8747427ff248","ref":"refs/heads/master","pushedAt":"2024-04-24T18:23:36.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"michaelgregorius","name":"Michael Gregorius","path":"/michaelgregorius","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/9293269?s=80&v=4"},"commit":{"message":"Instrument release time in milliseconds (#7217)\n\nMake instruments report their release time in milliseconds so that it becomes independent of the sample rate and sounds the same at any sample rate.\r\n\r\nTechnically this is done by removing the virtual keyword from `desiredReleaseFrames` so that it cannot be overridden anymore. The method now only serves to compute the number of frames from the given release time in milliseconds.\r\n\r\nA new virtual method `desiredReleaseTimeMs` is added which instruments can override. The default returns 0 ms just like the default implementation previously returned 0 frames.\r\n\r\nThe method `computeReleaseTimeMsByFrameCount` is added for instruments that still use a hard coded release in frames. As of now this is only `SidInstrument`.\r\n\r\nAdd the helper method `getSampleRate` to `Instrument`.\r\n\r\nAdjust several instruments to report their release times in milliseconds. The times are computed by taking the release in frames and assuming a sample rate of 44.1 kHz. In most cases the times are rounded to a \"nice\" next value, e.g.:\r\n* 64 frames -> 1.5 ms (66 frames)\r\n* 128 frames -> 3.0 ms (132 frames)\r\n* 512 frames -> 12. ms (529 frames)\r\n* 1000 frames -> 23 ms (1014 samples)\r\n\r\nIn parentheses the number of frames are shown which result from the rounded number of milliseconds when converted back assuming a sample rate of 44.1 kHz. The difference should not be noticeable in existing projects.\r\n\r\nRemove the overrides for instruments that return the same value as the base class `Instrument` anyway. These are:\r\n* GigPlayer\r\n* Lb302\r\n* Sf2Player\r\n\r\nFor `MonstroInstrument` the implementation is adjusted to behave in a very similar way. First the maximum of the envelope release times is computed. These are already available in milliseconds. Then the maximum of that value and 1.5 ms is taken and returned as the result.","shortMessageHtmlLink":"Instrument release time in milliseconds (#7217)"}},{"before":null,"after":"62e2a39a7ef5177d35aee3b86852e8afda06ef08","ref":"refs/heads/qt6","pushedAt":"2024-04-24T16:41:03.000Z","pushType":"branch_creation","commitsCount":0,"pusher":{"login":"Veratil","name":"Kevin Zander","path":"/Veratil","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2244945?s=80&v=4"},"commit":{"message":"SlicerT::findSlices - check if lower_bound did not find anything","shortMessageHtmlLink":"SlicerT::findSlices - check if lower_bound did not find anything"}},{"before":"bda042e1eb59e4c7508faa072051c50c2e12894d","after":"62e2a39a7ef5177d35aee3b86852e8afda06ef08","ref":"refs/heads/master","pushedAt":"2024-04-23T22:02:23.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"Veratil","name":"Kevin Zander","path":"/Veratil","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/2244945?s=80&v=4"},"commit":{"message":"SlicerT::findSlices - check if lower_bound did not find anything","shortMessageHtmlLink":"SlicerT::findSlices - check if lower_bound did not find anything"}},{"before":"df11a989021d6452d06a9038b3ea0a9dee9b0e66","after":"bda042e1eb59e4c7508faa072051c50c2e12894d","ref":"refs/heads/master","pushedAt":"2024-04-20T22:21:29.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"DomClark","name":"Dominic Clark","path":"/DomClark","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1873225?s=80&v=4"},"commit":{"message":"Add native system semaphore and Windows shared memory (#7212)","shortMessageHtmlLink":"Add native system semaphore and Windows shared memory (#7212)"}},{"before":"d5e1d9e853f72468ab24ea04005ca6e63a98dcca","after":"df11a989021d6452d06a9038b3ea0a9dee9b0e66","ref":"refs/heads/master","pushedAt":"2024-04-18T01:51:58.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"messmerd","name":"Dalton Messmer","path":"/messmerd","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/33463986?s=80&v=4"},"commit":{"message":"Bump Qt minimum version to 5.9 (#7204)\n\n* bump qt minimum version to 5.9\r\n\r\n* cleanup cmake checks\r\n\r\n* Remove the obsoleted check.\r\n\r\n* Missed this while removing the check.","shortMessageHtmlLink":"Bump Qt minimum version to 5.9 (#7204)"}},{"before":"d2c2a805064e504edd06841609be28e0ac38a26e","after":"d5e1d9e853f72468ab24ea04005ca6e63a98dcca","ref":"refs/heads/master","pushedAt":"2024-04-17T17:21:23.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"michaelgregorius","name":"Michael Gregorius","path":"/michaelgregorius","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/9293269?s=80&v=4"},"commit":{"message":"Move icon determination into TrackLabelButton again (#7209)\n\nMove icon determination into TrackLabelButton again\r\n\r\nFully undo the changes made in commit 88e0e94dcdb because the intermediate revert made in commit 04ecf733951 seems to have led to a performance problem due to the icon being set over and over again in `TrackLabelButton::paintEvent`.\r\n\r\nThe original intention of the changes made in pull request #7114 was to remove the painting code that dynamically determines the icon over and over again. Ideally the icon that is used by an instrument should be somewhat of a \"static\" property that should be known very early on when an instrument view is created. There should not be any need to dynamically resolve the icon over and over, especially not in a button class very far down in the widget hierarchy. However, due to technical reasons this is not the case in the current code. See pull request #7132 for more details.","shortMessageHtmlLink":"Move icon determination into TrackLabelButton again (#7209)"}},{"before":"dfc7eabcb92b0138fdf67325b1ee7ba00ce60e7c","after":"013aef5513ce3f4e98055b82c936cd6b1f051a48","ref":"refs/heads/groove","pushedAt":"2024-04-16T01:05:13.000Z","pushType":"push","commitsCount":324,"pusher":{"login":"PhysSong","name":"Hyunjin Song","path":"/PhysSong","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/12591074?s=80&v=4"},"commit":{"message":"Remove connections to a nonexistent signal","shortMessageHtmlLink":"Remove connections to a nonexistent signal"}},{"before":"d3ab31558cb10c5dbb6c5a56ecafa53c87b69015","after":"d2c2a805064e504edd06841609be28e0ac38a26e","ref":"refs/heads/master","pushedAt":"2024-04-14T16:03:39.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"michaelgregorius","name":"Michael Gregorius","path":"/michaelgregorius","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/9293269?s=80&v=4"},"commit":{"message":"Update CMT submodule / Upgrade code for CMT delays (#7206)\n\n## Bump CMT to d8bf8084aa3\r\nBump the CMT submodule to commit d8bf8084aa3 which contains the underlying fixes for issue #5167.\r\n\r\nThe CMT delay uses `sprintf` calls to generate the technical names and display names of the delays. These calls are locale dependent. As a consequence for example the feedback delay might have been saved either as \"fbdelay_0.1s\" (point) or \"fbdelay_0,1s\" (comma) in a save file.\r\n\r\nThe CMT fix makes sure that all delays use points in their names and thus that they now always report the same name strings.\r\n\r\n## Add upgrade routine for CMT delays\r\nAdd an upgrade routine for CMT delays which works in conjunction with the upgraded CMT submodule. Because the delays will now always report their name with points old save files which might contain versions with the comma must be upgraded to a name with a point.","shortMessageHtmlLink":"Update CMT submodule / Upgrade code for CMT delays (#7206)"}},{"before":"815f88dd09692079bf68063f8192e4d144b8fe4b","after":"d3ab31558cb10c5dbb6c5a56ecafa53c87b69015","ref":"refs/heads/master","pushedAt":"2024-04-14T11:54:10.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"DomClark","name":"Dominic Clark","path":"/DomClark","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/1873225?s=80&v=4"},"commit":{"message":"Support VSTs on Linux even if Wine is unavailable (#7205)","shortMessageHtmlLink":"Support VSTs on Linux even if Wine is unavailable (#7205)"}},{"before":"8e40038a2d864e667e8cd3075c26eb11b977d5fa","after":"815f88dd09692079bf68063f8192e4d144b8fe4b","ref":"refs/heads/master","pushedAt":"2024-04-14T08:31:27.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"michaelgregorius","name":"Michael Gregorius","path":"/michaelgregorius","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/9293269?s=80&v=4"},"commit":{"message":"Scalable LFO graph (#7203)\n\n## Scalable LFO graph\r\nMake the rendering of the LFO graph scalable. Change the fixed size to a minimum size. Adjust the rendering code such that it uses the width and height of the widget instead of the background pixmap.\r\n\r\nOnly draw only poly line once instead of many line segments. Collect the points in the for-loop to be able to do so. This makes the code a bit more understandable because we now compute exacly one point per iteration in the for-loop.\r\n\r\nUse the same interpolation for the line color like in the envelope graph.\r\n\r\nRename some variables to make them consistent with the other code.\r\n\r\nRemove the member `m_params` which is not used anyway. This also allows for the removal of the overridden `modelChanged` method.\r\n\r\n## Use \"Hz\" instead of \"ms/LFO\"\r\nUse the more common unit \"Hz\" to display the frequency of the LFO instead of \"ms/LFO\". The frequency is always displayed with three digits after the decimal separator to prevent \"jumps\".\r\n\r\n## Take \"Freq * 100\" into account\r\nThis commit fixes a bug where the \"Freq * 100\" option was not taken into account when computing and displaying the frequency of the LFO.\r\n\r\n## Keep info text legible\r\nDraw a slightly transparent black rectangle underneath the text to keep it legible, e.g. for high frequencies with an LFO amount of 1 which results in a very bright and dense graph.\r\n\r\n## Extract drawing of info text into method\r\nExtract the drawing of the info text into its own private method `drawInfoText`.","shortMessageHtmlLink":"Scalable LFO graph (#7203)"}},{"before":"1f5f28fd8ab21d1de6a04918c4eede08a70cc62a","after":"8e40038a2d864e667e8cd3075c26eb11b977d5fa","ref":"refs/heads/master","pushedAt":"2024-04-11T15:49:00.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"michaelgregorius","name":"Michael Gregorius","path":"/michaelgregorius","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/9293269?s=80&v=4"},"commit":{"message":"Scalable envelope graph (#7194)\n\nMake the graph scalable by adjusting the painting code of the envelope so that it does not assume fixed widths and heights anymore. Remove the setting of a fixed size from the envelope graph and only set a minimum size.\r\n\r\nMake three scaling modes available which can be selected via a context menu in the graph:\r\n* \"Dynamic\": This modes corresponds to the rendering strategy of the previous implementation. Initially 80/182 of the available width is used as the maximum width per segment. This can be interpreted like a \"zoomed\" version of the absolute mode. If the needed space becomes larger than the full width though then it falls back to relative rendering.\r\n* \"Absolute\": Each of the five segments is assigned 1/5 of the available width. The envelopes will always fit but might appear small depending of the current settings. This is a good mode to compare envelopes though.\r\n* \"Relative\": If there is at least one non-zero segment then the whole width is always used to present the envelope.\r\n\r\nThe default scaling mode is \"Dynamic\".\r\n\r\n## Technical details\r\n\r\nThe new painting code is more or less divided into two parts. The first part calculates `QPointF` instances for the different points. In the second part these points are then used to draw the lines and markers. This makes the actual rendering code much more straight forward, readable and maintainable.\r\n\r\nThe interpolation between the line color of an inactive and an active envelope has also been restructured so that it is much more obvious that we are doing an interpolation in the first place. The colors at both ends of the interpolation are explicit now and can therefore be adjusted much easier. The actual color interpolation is done in the helper function `interpolateInRgb` which is provided by the new class `ColorHelper`. This class will later also be needed when the LFO graph is made scalable.\r\n\r\nThe line is rendered as a polyline instead of single line segments.\r\n\r\nThe drawing of the markers has been abstracted into a lambda (with some outside captures though) so that it can be easily adjusted if necessary. The markers are rendered as circles instead of rectangles because that looks much nicer especially when the widget is rendered at a larger size.\r\n\r\nThe width of the lines and marker outlines is determined using the size of the widget so that it scales with the size.\r\n\r\nA `lerp` function has been added to `lmms_math.h`.","shortMessageHtmlLink":"Scalable envelope graph (#7194)"}},{"before":"2472e9ee4e3f92049acbf8730df03de770de554f","after":"1f5f28fd8ab21d1de6a04918c4eede08a70cc62a","ref":"refs/heads/master","pushedAt":"2024-04-08T23:17:26.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"sakertooth","name":"saker","path":"/sakertooth","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/20197645?s=80&v=4"},"commit":{"message":"Don't auto-quantize notes when recording MIDI input (#6714)\n\n* Don't auto-quantize notes when recording MIDI input.\r\n\r\n* Add midi:autoquantize to config file and a widget to set it in the MIDI settings.\r\n\r\n* Quantize notes during recording if midi:autoquantize is enabled.\r\n\r\n* Apply suggestions from code review: Formatting\r\n\r\nStyle formatting\r\n\r\nCo-authored-by: saker \r\n\r\n* Cache the auto quantization setting in a PianoRoll member variable, and update it on ConfigManager::valueChanged()\r\n\r\n* Apply suggestions from code review: Formatting & temp variable\r\n\r\nOne formatting change, and reusing an existing variable instead of introducting a new local one.\r\n\r\nCo-authored-by: saker \r\nCo-authored-by: IanCaio \r\n\r\n* Update src/gui/modals/SetupDialog.cpp\r\n\r\nGood catch.\r\n\r\nCo-authored-by: IanCaio \r\n\r\n* Fix logic bug in PianoRoll's midi/autoquantize value observer.\r\n\r\n* Use '!' instead of 'not' to please MSVC.\r\n\r\n* autoquantize: Add an explicit check for consistency with the rest of the PR, and give the setting a default value in SetupDialog constructor.\r\n\r\n* Integrate MIDI auto-quantize checkbox into the resizable layout, and add a tool tip.\r\n\r\n---------\r\n\r\nCo-authored-by: saker \r\nCo-authored-by: IanCaio ","shortMessageHtmlLink":"Don't auto-quantize notes when recording MIDI input (#6714)"}},{"before":"922eb7f2ba9e70df08346f76b2088160594c00fe","after":"2472e9ee4e3f92049acbf8730df03de770de554f","ref":"refs/heads/master","pushedAt":"2024-04-05T15:24:28.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"michaelgregorius","name":"Michael Gregorius","path":"/michaelgregorius","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/9293269?s=80&v=4"},"commit":{"message":"GUI adjustments around base velocity (#7196)\n\nChange the label of the group box from \"CUSTOM BASE VELOCITY\" to \"VELOCITY MAPPING\".\r\n\r\nRemove the long explanation text from the group box and add the following tool tip for the LcdSpinBox: \"MIDI notes at this velocity correspond to 100% note velocity.\"\r\n\r\nChange the label of the spin box from \"BASE VELOCITY\" to \"MIDI VELOCITY\" because that's what the value actually represents.","shortMessageHtmlLink":"GUI adjustments around base velocity (#7196)"}},{"before":"ba4fda7c977926fd51664b99aca5e991019339d9","after":"922eb7f2ba9e70df08346f76b2088160594c00fe","ref":"refs/heads/master","pushedAt":"2024-04-05T11:15:48.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"michaelgregorius","name":"Michael Gregorius","path":"/michaelgregorius","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/9293269?s=80&v=4"},"commit":{"message":"Fix NaNs for some dbFS value displays (-∞ dbFS) (#7142)\n\nFix some NaNs in the context of the display of dbFS values when \"View > Volume as dbFS\" is checked. They occur during the display of the current value when a mixer fader or the volume knob of an instrument is pulled down completely.\r\n\r\nThe fix is to detect these cases and to display \"-∞ dbFS\".\r\n\r\nAlso fix a problem with the editor where dbFS values can be entered for volume knobs. When the knob is turned completely to the left and the amplification is 0 then the initially displayed value is set to -96 dBFS, i.e. the lower limit that is shown in the dialog. This is done because the dialog likely cannot handle displaying or entering \"-∞\".","shortMessageHtmlLink":"Fix NaNs for some dbFS value displays (-∞ dbFS) (#7142)"}},{"before":"d447cb0648cff249f0f4c2311ea17217576354e4","after":"ba4fda7c977926fd51664b99aca5e991019339d9","ref":"refs/heads/master","pushedAt":"2024-04-05T10:48:46.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"michaelgregorius","name":"Michael Gregorius","path":"/michaelgregorius","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/9293269?s=80&v=4"},"commit":{"message":"Scalable consistent faders with themeable gradients, marker at unity, dbFS by default (#7045)\n\n* Render fader levels in code with a gradient\r\n\r\nRender the fader level in code using a gradient instead of using pixmaps. The problem with the pixmaps is that they don't \"know\" how a fader instance is configured with regards to the minimum and maximum value. This means that the display can give quite a wrong impression.\r\n\r\nThe rendering of levels has been unified in the method `paintLevels`. It can render using dbFS and linear scale. The method `paintLinearLevels` has been removed completely, i.e. there's no more code that renders using pixmaps.\r\n\r\nMuch of the previous code relied on the size of the background image `fader_background.png`, e.g. the initialization of the size. For now the `Fader` widget is initially resized to the size of that background image as it is present in the default and classic theme (see `Fader::init`). All rendering uses the size of the widget itself to determine where to draw what. This means that the widget is prepared to be resizable.\r\n\r\nThe method `paintLevels` first renders the background of the level indicators and uses these as clipping paths for all other rendering operations, e.g. for the rendering of the levels themselves. Levels are rendered using a gradient which is defined with the following stops:\r\n* Two stops for the ok levels.\r\n* One stop for warning levels.\r\n* One stop for clipping levels.\r\n\r\nPeak indicators do not use the three distinct colors anymore but instead use the color of the gradient at that position of the peak. This makes everything look \"smooth\".\r\n\r\nThe code now also renders a marker at unity position, i.e. at position 1.0 in linear levels and 0 dbFS in dbFS scale.\r\n\r\nThe painting code makes lots of use of the class `PaintHelper`. This class is configured with a minimum and maximum value and can then return linear factors for given values. There are two supported modes:\r\n* Map min to 0 and max to 1\r\n* Map min to 1 and max to 0\r\n\r\nIt can also compute rectangles that correspond to a given value. These methods can be given rectangles that are supposed to represent the span from min to max. The returned result is then a rectangle that fills the lower part of the source rectangle according to the given value with regards to min and max (`getMeterRect`). Another method returns a rectangle of height 1 which lies inside the given source rectangle at the corresponding level (`getPersistentPeakRect`).\r\n\r\nThe method `paintLevels` uses a mapping function to map the amplitude values (current peak value, persistent peak, etc.) to the display values. There's one mapper that keeps the original value and it is used to display everything in a linear scale. Another mapper maps everything to dbFS and uses these values as display everything in a dbFS scale. The following values must be mapped for the left and right channel to make this work:\r\n* Min and max display values (min and max peak values)\r\n* The current peak value\r\n* The persistent peak value\r\n* The value for unity, i.e. 1.0 in linear levels and 0 dbFS in dbFS scale.\r\n\r\nRemove the method `calculateDisplayPeak` which was used in the old method to render linear levels.\r\n\r\n`Fader::setPeak` now uses `std::clamp` instead of doing \"manual\" comparisons.\r\n\r\nThe LMMS plugins Compressor, EQ and Delay are still configured to use linear displays. It should be considered to switch them to dbFS/logarithmic displays as well and to remove the code that renders linearly.\r\n\r\n* Remove unused pixmaps from `Fader`\r\n\r\nRemove the now unused pixmaps for the background and the LEDs from the `Fader` class and remove the files from the default and classic theme directories.\r\n\r\n* Rename peak properties and use them to render levels\r\n\r\nRename the peak properties as follows:\r\n* peakGreen -> peakOk\r\n* peakRed -> peakClip\r\n* peakYellow -> peakWarn\r\n\r\nThe reasoning is that a style might for example use a different color than green to indicate levels that are ok.\r\n\r\nUse the properties to initialize the gradient that is used to render the levels.\r\n\r\nInitialize the properties to the colors of the current default theme so that it's not mandatory to set them in a style sheet. Up until now they have all been initialized as black.\r\n\r\n* Always render the knob in the middle of the fader\r\n\r\nRender the knob in the middle of the fader regardless of the width. The previous implementation was dependent on the fader pixmap having a matching width because it always rendered at x=0.\r\n\r\n* Set size policy of fader to minimum expanding\r\n\r\nSet the size policy of the fader to minimum expanding in both directions. This will make the fader grow in layouts if there is space.\r\n\r\n* Default dbFS levels and better peak values\r\n\r\nDefault to dbFS levels for all faders and set some better minimum and maximum peak values.\r\n\r\n* Fix faders of Crossover EQ\r\n\r\nFix the faders of the Crossover EQ which were initialized and rendered much too wide and with a line at unity. The large width also resulted in the knobs being rendered outside of view.\r\n\r\nResize the fader to the minimum size so that it is constructed at a sane default.\r\n\r\nIntroduce a property that allows to control if the unity line is rendered. The property is available in style sheets and defaults to the unity lines being rendered. Adjust the paint code to evaluate the property.\r\n\r\nInitialize the faders of the Crossover EQ such that the unity line is not drawn.\r\n\r\n* Remove EqFader constructor with pixmaps\r\n\r\nRemove the constructor of `EqFader` that takes the pixmaps to the fader background, leds and knob. The background and leds pixmaps are not used by the base class `Fader` for rendering anymore to make the `Fader` resizable. A pixmap is still used to render the knob but the constructor that takes the knob as an argument does not do anything meaningful with it, i.e. all faders are rendered with the default knob anyway.\r\n\r\nRemove the resources for the fader background, leds and knob as they are not used and the knob was the same image as the default knob anyway.\r\n\r\nRemove the static pixmaps from the constructor of `EqControlsDialog`. Switch the instantiations of the EQ's faders to use the remaining constructor of `EqFader`. This constructor sets a different fixed size of (23, 116) compared to the removed constructor which set a size of (23, 80). Therefore all faders that used the removed constructor are now set explicitly to a fixed size of (23, 80).\r\n\r\nThe constructor that's now used also calls a different base constructor than the removed one. The difference between the two base constructors of `Fader` is that one of them sets the member `m_conversionFactor` to 100.0 whereas the other one keeps the default of 1.0. The adjusted faders in `EqControlsDialog` are thus now constructed with the conversion factor set to 100. However, all of them already call `setDisplayConversion` with `false` after construction which results in the conversion factor being reset to 1.0. So the result should be the same as before the changes.\r\n\r\n* Remove background and LEDs pixmap from Fader constructor\r\n\r\nRemove the parameters for the background and LEDs pixmap from the second `Fader` constructor. Make the knob pixmap parameter in the constructor a const reference. Assign the reference to the knob pixmap of the `Fader` itself. This enables clients to use their own fader knobs as is the case with the Crossover EQ. The EQ now renders using it's own knobs again.\r\n\r\nMake the second constructor delegate to the first one. This will additionally set the conversion factor to 100 but this is not a problem with the current code because the only user of the second constructor, the Crossover EQ, already calls `setDisplayConversion` with the parameter set to `false`, hence reinstating a conversion factor of 1.\r\n\r\nRemove the resources for the background and LEDs from the Crossover EQ as they are not used anymore. Remove the three QPixmap members from `CrossoverEQControlDialog` as they are not needed. The background and LEDs are not used anyway and the knob is passed in as a constant reference which is copied. Hence we can use a local variable in the constructor of `CrossoverEQControlDialog`.\r\n\r\n* Remove the init method from Fader\r\n\r\nRemove the `init` method from `Fader` as it is not needed anymore due to the constructor delegation. Tidy up the parameter lists and use of spaces in the constructor.\r\n\r\n* Introduce range with solid warn color\r\n\r\nIntroduce a second point in the gradient for the warn colors so that we get a certain range with the full/solid warn color.\r\n\r\nThe colors are distributed as follows now. The solid ok range goes from -inf dbFS to -12 dbFS. The warn range goes from -6 dbFS to 0 dbFS. In between the colors are interpolated. Values above 0 dbFS interpolate from the warn color to the clip color.\r\n\r\nThis is now quite similar to the previous implementation.\r\n\r\n# Analysis of the previous pixmap implementation\r\nThe pixmap implementation used pixmaps with a height of 116 pixels to map 51 dbFS (-42 dbFS to 9 dbFS) across the whole height. The pixels of the LED pixmap were distributed as follows along the Y-axis:\r\n* Margin: 4\r\n* Red: 18\r\n* Yellow: 14\r\n* Green: 76\r\n* Margin: 4\r\n\r\nDue to the margins the actual red, yellow and green areas only represent a range of (1 - (4+4) / 116) * 51 ~ 47,48 dbFS. This range is distributed as follows across the colors:\r\nRed: 7.91 dbFS\r\nYellow: 6.16 dbFS\r\nGreen: 33.41 dbFS\r\n\r\nThe borders between the colors are located along the following dbFS values:\r\n* Red/yellow: 9 - (4 + 18) / 116 * 51 dbFS ~ -0.67 dbFS\r\n* Yellow/green: 9 - (4 + 18 + 14) / 116 * 51 dbFS ~ -6.83 dbFS\r\n* The green marker is rendered for values above -40.24 dbFS.\r\n\r\n* Remove unused method Fader::clips\r\n\r\n* Fader: Correctly render arbitrary ranges\r\n\r\nAdjust the `Fader` so that it can correctly render arbitrary ranges of min and max peak values, e.g. that it would render a display range of [-12 dbFS, -42 dbFS] correctly.\r\n\r\nUntil now the gradient was defined to start at the top of the levels rectangle and end at the bottom. As a result the top was always rendered in the \"clip\" color and the bottom in the \"ok\" color. However, this is wrong, e.g. if we configure the `Fader` with a max value of -12 dbFS and a min value of -42 dbFS. In that case the whole range of the fader should be rendered with the \"ok\" color.\r\n\r\nThe fix is to compute the correct window coordinates of the start and end point of gradient using from the \"window\" of values that the `Fader` displays and then to map the in-between colors accordingly. See the added comments in the code for more details.\r\n\r\nAdd the templated helper class `LinearMap` to `lmms_math.h`. The class defines a linear function/map which is initialized using two points. With the `map` function it is then possible to evaluate arbitrary X-coordinates.\r\n\r\n* Remove unused methods in PaintHelper\r\n\r\nRemove the now unused mapping methods from `PaintHelper`. Their functionality has been replaced with the usage of `LinearMap` in the code.\r\n\r\n* Fix some builds\r\n\r\nInclude `cassert` for some builds that otherwise fail.\r\n\r\n* Opaque unity marker with styling option\r\n\r\nMake the unity marker opaque by default and enable to style it with the style sheets. None of the two style sheets uses this option though.\r\n\r\n* Darker default color for the unity line\r\n\r\n* Move code\r\n\r\nMove the computation of most mapped values at the top right after the definition of the mapper so that it is readily available in all phases of the painting code.\r\n\r\n* Render unity lines in background\r\n\r\nRender the unity lines before rendering the levels so that they get overdrawn and do not stick out when they are crossed.\r\n\r\n* Don't draw transparent white lines anymore\r\n\r\nDon't draw the transparent white lines anymore as they were mostly clipped anyway and only create \"smudge\".\r\n\r\n* Full on clip color at unity\r\n\r\nAdjust the gradient so that the full on clip color shows starting at unity. There is only a very short transition from the end of warning to clipping making it look like a solid color \"standing\" on top of a gradient.\r\n\r\n* Fix discrepancy between levels and unity markers\r\n\r\nThis commit removes the helper class `PaintHelper` and now uses two lambdas to compute the rectangles for the peak indicators and levels. It uses the linear map which maps the peak values (in dbFS or linear) to window coordinates of the widget.\r\n\r\nThe change fixes a discrepancy in the following implementation for which the full on clip rectangle rendered slightly below the unity marker.\r\n\r\n* Fix fader display for Equalizer shelves and peaks\r\n\r\nThe peak values for the shelves and peaks of the Equalizer plugin are computed in `EqEffect::peakBand`. The previous implementation evaluated the bins of the corresponding frequency spectrum and determined the \"loudest\" one. The value of this bin was then converted to dbFS and mapped to the interval [0, inf[ where all values less or equal to -60 dbFS were mapped to 0 and a value of 40 dbFS was mapped to 1. So effectively everything was mapped somewhere into [0, 1] yet in a quite \"distorted\" way because a signal of 40 dbFS resulted in being displayed as unity in the fader.\r\n\r\nThis commit directly returns the value of the maximum bin, i.e. it does not map first to dbFS and then linearize the result anymore. This should work because the `Fader` class assumes a \"linear\" input signal and if the value of the bin was previously mapped to dbFS it should have some \"linear\" character. Please note that this is still somewhat of a \"proxy\" value because ideally the summed amplitude of all relevant bins in the frequency range would be shown and not just the \"loudest\" one.\r\n\r\n## Other changes\r\nRename `peakBand` to `linearPeakBand` to make more clear that a linear value is returned.\r\n\r\nHandle a potential division by zero by checking the value of `fft->getEnergy()` before using it.\r\n\r\nIndex into `fft->m_bands` so that no parallel incrementing of the pointer is needed. This also enables the removal of the local variable `b`.\r\n\r\n* Improve the rendering of the levels\r\n\r\nThe levels rendering now more explicitly distinguished between the rendering of the level outline/border and the level meters. The level rectangles are \"inset\" with regards to the borders so that there is a margin between the level borders and the meter readings. This margin is now also applied to the top and bottom of the levels. Levels are now also rendered as rounded rectangles similar to the level borders.\r\n\r\nOnly render the levels and peaks if their values are greater than the minimum level.\r\n\r\nMake the radius of the rounded rectangles more pronounced by increasing its value from 1 to 2.\r\n\r\nDecrease the margins so that the level readings become wider, i.e. so that they are rendered with more pixels.\r\n\r\nAdd the lambda `computeLevelMarkerRect` so that the rendering of the level markers is more decoupled from the rendering of the peak markers.\r\n\r\n* Reduce code repetition\r\n\r\nReduce code repetition in `EqEffect::setBandPeaks` by introducing a lambda. Adjust code formatting.\r\n\r\n* Code review changes\r\n\r\nCode review changes in `Fader.cpp`. Mostly whitespace adjustments.\r\n\r\nSplit up the calculation of the meter width to make it more understandable. This also reduces the number of parentheses.\r\n\r\n* Use MEMBER instead of READ/WRITE\r\n\r\nUse `MEMBER` instead of `READ`/`WRITE` for some properties that are not called explicitly from outside of the class.\r\n\r\n* Use default member initializers for Fader\r\n\r\nUse default member initializers for the members in `Fader` that have previously been initialized in the constructor list.\r\n\r\n* Make code clearer\r\n\r\nMake code clearer in `Fader::FadermouseDoubleClickEvent`. Only divide if the dialog was accepted with OK.","shortMessageHtmlLink":"Scalable consistent faders with themeable gradients, marker at unity,…"}},{"before":"20fec28befe95f5bc08453f776f7b5252877407d","after":"d447cb0648cff249f0f4c2311ea17217576354e4","ref":"refs/heads/master","pushedAt":"2024-04-05T09:25:39.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"michaelgregorius","name":"Michael Gregorius","path":"/michaelgregorius","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/9293269?s=80&v=4"},"commit":{"message":"Use layouts for the instrument sound shaping tab / Extract classes for Envelope and LFO graphs (#7193)\n\nMove the envelope and LFO graphs into their own classes.\r\n\r\nBesides the improved code organization this step had to be done to be able to use layouts in `EnvelopeAndLfoView`. The class previously had fixed layouts mixed with custom rendering in the paint event. Mouse events are now also handled in both new classes instead of in `EnvelopeAndLfoView`.\r\n\r\n## Layouts in EnvelopeAndLfoView\r\nUse layouts to align the elements of the `EnvelopeAndLfoView`. This removes lots of hard-coded values. Add helper lambdas for the repeated creation of `Knob` and `PixmapButton` instances.\r\n\r\nThe spacing that is explicitly introduced between the envelope and LFO should be removed once there is a more open layout.\r\n\r\n## Layouts for InstrumentSoundShapingView\r\nUse layouts to align the elements of the `InstrumentSoundShapingView`.\r\n\r\n## Info text improvements in LFO graph\r\nDraw the info text at around 20% of the LFO graph's height. This prepares the dialog to be scaled later.\r\n\r\nWrite \"1000 ms/LFO\" instead of \"ms/LFO: 1000\" with a larger gap.\r\n\r\n## Accessors for EnvelopeAndLfoParameters\r\nMake the enum `LfoShape` in `EnvelopeAndLfoParameters` public so that it can be used without friend declarations. Add accessor methods for the model of the LFO.\r\n\r\n## Other improvements\r\n* Adjust include orders\r\n* Variable initialization in headers\r\n* Prevention of most vexing parses","shortMessageHtmlLink":"Use layouts for the instrument sound shaping tab / Extract classes fo…"}},{"before":"b14f8ab8fd1f675cd0c69793219e5a70c0248a91","after":"20fec28befe95f5bc08453f776f7b5252877407d","ref":"refs/heads/master","pushedAt":"2024-04-04T19:40:31.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"michaelgregorius","name":"Michael Gregorius","path":"/michaelgregorius","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/9293269?s=80&v=4"},"commit":{"message":"Font size adjustments (#7185)\n\nAdjust and rename the function `pointSize` so that it sets the font size in pixels. Rename `pointSize` to `adjustedToPixelSize` because that's what it does now. It returns a font adjusted to a given pixel size. Rename `fontPointer` to `font` because it's not a pointer but a copy. Rename `fontSize` to simply `size`.\r\n\r\nThis works if the intended model is that users use global fractional scaling. In that case pixel sized fonts are also scaled so that they should stay legible for different screen sizes and pixel densities.\r\n\r\n## Adjust plugins with regards to adjustedToPixelSize\r\n\r\nAdjust the plugins with regards to the use of `adjustedToPixelSize`.\r\n\r\nRemove the explicit setting of the font size of combo boxes in the following places to make the combo boxes consistent:\r\n* `AudioFileProcessorView.cpp`\r\n* `DualFilterControlDialog.cpp`\r\n* `Monstro.cpp` (does not even seem to use text)\r\n* `Mallets.cpp`\r\n\r\nRemove calls to `adjustedToPixelSize` in the following places because they can deal with different font sizes:\r\n* `LadspaBrowser.cpp`\r\n\r\nSet an explicit point sized font size for the \"Show GUI\" button in `ZynAddSubFx.cpp`\r\n\r\nIncrease the font size of the buttons in the Vestige plugin and reduce code repetition by introducing a single variable for the font size.\r\n\r\nI was not able to find out where the font in `VstEffectControlDialog.cpp` is shown. So it is left as is for now.\r\n\r\n## Adjust the font sizes in the area of GUI editors and instruments.\r\n\r\nIncrease the font size to 10 pixels in the following places:\r\n* Effect view: \"Controls\" button and the display of the effect name at the bottom\r\n* Automation editor: Min and max value display to the left of the editor\r\n* InstrumentFunctionViews: Labels \"Chord:\", \"Direction:\" and \"Mode:\"\r\n* InstrumentMidiIOView: Message display \"Specify the velocity normalization base for MIDI-based instruments at 100% note velocity.\"\r\n* InstrumentSoundShapingView: Message display \"Envelopes, LFOs and filters are not supported by the current instrument.\"\r\n* InstrumentTuningView: Message display \"Enables the use of global transposition\"\r\n\r\nIncrease the font size to 12 pixels in the mixer channel view, i.e. the display of the channel name.\r\n\r\nRender messages in system font size in the following areas because there should be enough space for almost all sizes:\r\n* Automation editor: Message display \"Please open an automation clip by double-clicking on it!\"\r\n* Piano roll: Message display \"Please open a clip by double-clicking on it!\"\r\n\r\nUse the application font for the line edit that can be used to change the instrument name.\r\n\r\nRemove overrides which explicitly set the font size for LED check boxes in:\r\n* EnvelopeAndLfoView: Labels \"FREQ x 100\" and \"MODULATE ENV AMOUNT\"\r\n\r\nRemove overrides which explicitly set the font size for combo boxes in:\r\n* InstrumentSoundShapingView: Filter combo box\r\n\r\n## Adjust font sizes in widgets\r\n\r\nAdjust the font sizes in the area of the custom GUI widgets.\r\n\r\nIncrease and unify the pixel font size to 10 pixels in the following classes:\r\n* `ComboBox`\r\n* `GroupBox`\r\n* `Knob`\r\n* `LcdFloatSpinBox`\r\n* `LcdWidget`\r\n* `LedCheckBox`\r\n* `Oscilloscope`: Display of \"Click to enable\"\r\n* `TabWidget`\r\n\r\nShorten the text in `EnvelopeAndLfoView` from \"MODULATE ENV AMOUNT\" to \"MOD ENV AMOUNT\" to make it fit with the new font size of `LedCheckBox`.\r\n\r\nRemove the setting of the font size in pixels from `MeterDialog` because it's displayed in a layout and can accommodate all font sizes. Note: the dialog can be triggered from a LADSPA plugin with tempo sync, e.g. \"Allpass delay line\". Right click on the time parameter and select \"Tempo Sync > Custom...\" from the context menu.\r\n\r\nRemove the setting of the font size in `TabBar` as none of the added `TabButton` instances displays text in the first place.\r\n\r\nRemove the setting of the font size in `TabWidget::addTab` because the font size is already set in the constructor. It would be an unexpected size effect of setting a tab anyway. Remove a duplicate call to setting the font size in `TabWidget::paintEvent`.\r\n\r\nRemove unnecessary includes of `gui_templates.h` wherever this is possible now.\r\n\r\n## Direct use of setPixelSize\r\n\r\nDirectly use `setPixelSize` when drawing the \"Note Velocity\" and \"Note Panning\" strings as they will likely never be drawn using point sizes.","shortMessageHtmlLink":"Font size adjustments (#7185)"}},{"before":"9dd7f4dde456efa95586a0c4744255039f965c78","after":"b14f8ab8fd1f675cd0c69793219e5a70c0248a91","ref":"refs/heads/master","pushedAt":"2024-04-03T23:14:00.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"sakertooth","name":"saker","path":"/sakertooth","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/20197645?s=80&v=4"},"commit":{"message":"Refactor ArpDirection::Down and ArpDirection::DownAndUp (#7007)\n\nFixes an issue with the arpeggiation when it is set to go downwards and the cycle is over 0.","shortMessageHtmlLink":"Refactor ArpDirection::Down and ArpDirection::DownAndUp (#7007)"}},{"before":"5d5d8f8f1424949fcd77d1a4a39eeb5479a0a10a","after":"9dd7f4dde456efa95586a0c4744255039f965c78","ref":"refs/heads/master","pushedAt":"2024-04-01T18:06:18.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"michaelgregorius","name":"Michael Gregorius","path":"/michaelgregorius","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/9293269?s=80&v=4"},"commit":{"message":"Remove \"GENERAL SETTINGS\" tab (#7188)\n\nRemove the \"GENERAL SETTINGS\" tab from the instrument track and sample track window.\r\n\r\nThis removes clutter as well as dependencies to the non-scalable `TabWidget`.\r\n\r\nRemove superfluous calls to `setSpacing` which have set the default value of 6.\r\n\r\nUse the default content margins of (9, 9, 9, 9) instead of (8, 8, 8, 8).","shortMessageHtmlLink":"Remove \"GENERAL SETTINGS\" tab (#7188)"}},{"before":"c271d2831458d4d33610ebccd3517319a916d014","after":"5d5d8f8f1424949fcd77d1a4a39eeb5479a0a10a","ref":"refs/heads/master","pushedAt":"2024-04-01T12:57:43.000Z","pushType":"pr_merge","commitsCount":1,"pusher":{"login":"michaelgregorius","name":"Michael Gregorius","path":"/michaelgregorius","primaryAvatarUrl":"https://avatars.githubusercontent.com/u/9293269?s=80&v=4"},"commit":{"message":"Only repaint LcdWidget if necessary (#7187)\n\nSome analysis done with Callgrind showed that the `LcdWidget` spends quite some time repainting itself even when nothing has changed. Some widget instances are used in song update contexts where `LcdWidget::setValue` is called 60 times per second.\r\n\r\nThis commit fixes the problem by only updating the `LcdWidget` if its value really has changed.\r\n\r\nAdjust the condition in the if-clause so that it becomes clearer what's the interval of interest.","shortMessageHtmlLink":"Only repaint LcdWidget if necessary (#7187)"}}],"hasNextPage":true,"hasPreviousPage":false,"activityType":"all","actor":null,"timePeriod":"all","sort":"DESC","perPage":30,"cursor":"djE6ks8AAAAEP07oGgA","startCursor":null,"endCursor":null}},"title":"Activity · LMMS/lmms"}