Prior to commit b5de1d50e, audible zipper artifacts were present when
using the PeakController on a bus to control the volume of another bus
for sidechain compression. The bus that had its volume reduced was the
one which produced audible artifacts.
Commit b5de1d50e introduced LERP to PeakController to smooth out its
signal, which eliminated the zipper artifacts. However, this had the
side effect of increased latency even when both attack and decay
settings were set to zero.
Until a more robust solution is implemented, reverting this change
eliminates the latency by eliminating the lerp, but reintroduces audible
zipper artifacts.
Allow for splitting and resizing all types of clips (automation, MIDI, sample, pattern, etc) using the knife tool in the Song Editor.
---------
Co-authored-by: szeli1 <143485814+szeli1@users.noreply.github.com>
Co-authored-by: Dalton Messmer <messmer.dalton@gmail.com>
Added the ability to favorite items. This gets added to its own tab named "My Favorites".
---------
Co-authored-by: Sotonye Atemie <sakertooth@gmail.com>
This PR refactors how the spacebar is handled by the editors and the MainWindow to allow it to play/stop (Shift+Space for play/pause) the last played editor, no matter if it is in focus or not.
---------
Co-authored-by: Fawn <rubiefawn@gmail.com>
Co-authored-by: Sotonye Atemie <satemiej@gmail.com>
Adds the ability to reverse the selected midi notes in the PianoRoll.
The tool is located under the wrench icon in the PianoRoll and can also be triggered with Shift-R.
---------
Co-authored-by: szeli1 <143485814+szeli1@users.noreply.github.com>
Previously, clicking on a track or dragging in a sample would always create a clip on the closest/previous bar, no matter what the Song Editor's snap size was. This fixes that issue by using the Song Editor's quantization when placing new clips, so for example if the snap size is 1/4 bar, the clip will be added at the closest/previous 1/4 bar mark.
* Add /.cache/ to .gitignore
Normally clangd's .cache exists in /build/, which is already in the .gitignore, but if cmake is run in the repository root instead of /build/ the cache is in turn generated in the repository root.
* Also add compile_commands.json to .gitignore
Newly created MIDI tracks were not automatically assigned to the desired MIDI device when the option to do so was specified in settings. This commit fixes that.
- Remove pointless *.exe option
- Add an "All VST files" option on Linux when there is both LinuxVST and Wine VST support
- Remove *.dll option from Linux builds without Wine VST support (i.e. LinuxVST-only builds)
* Renamed lmms_basics.h to LmmsTypes.h and scoped it down for that purpose.
* Shifted the LMMS_STRINGIFY macro to it's own header.
* Removed the debug.h header file and use cmake to handle the macro logic.
* Remove some unused headers and include directives
Adds a complex strum tool to the Piano Roll, allowing the user to take a selection of chords, and drag around the notes to shape the strum exactly how they want it.
---------
Co-authored-by: szeli1 <143485814+szeli1@users.noreply.github.com>
Co-authored-by: Sotonye Atemie <satemiej@gmail.com>
Fixes a regression from 07baf9e27a, in
which a channel that was created through a tracks "Assign track to new
mixer channel" context menu would display an incorrect name until it was
renamed by a user.
Created and replaced missing/mismatched assets, fixed mixer send arrows causing mixer height to be wrong, tweaked CSS stylesheet to fix active mixer channel being black
* Fix crash when switching opened projects #7793
When the DAW is already running with an open project and you attempt to
open another project via File > Open, a segfault used to occur.
The crash seems to have been caused by model()->value(), which was
called in Fader::getModelValueAsDbString(). The model() function
looked like it should return a pointer to an AutomatableModel.
I suspect that when a model was dropped in favor of loading models for
a new project, the AutomatableModel pointer became a null pointer.
Add a check to the AutomatableModel pointer so getModelValueAsDbString
returns early (before accessing member functions) if the pointer is
null. This fixes the crash.
Allow embed.cpp to load SVG assets at screen DPI by leveraging QPixmap::setDevicePixelRatio
---------
Co-authored-by: Tres Finocchiaro <tres.finocchiaro@gmail.com>
Co-authored-by: Fawn <rubiefawn@gmail.com>
In #7708, the track operations widget was given a centered vertical alignment in order to fix an aesthetic layout issue. This is being reverted, since it is possible to resize tracks, and all the other track interface elements are top-aligned.
The y-axis quantization for graph values was being calculated
incorrectly. This would have gone unnoticed since the only step sizes
currently used are 0 (continuous) or 1. Any other values produce
"sloped" quantization. This fix prevents this error from affecting
any future uses of graphModel.
* Add mute and solo buttons to instrument windows
* Change mute and solo buttons to optimized CC0 SVG assets
* Icons provided by @StakeoutPunch, button backgrounds provided by
@RebeccaDeField
---------
Co-authored-by: Sotonye Atemie <sakertooth@gmail.com>
Co-authored-by: Rebecca Noel Ati <contactme@rebeccadefield.com>
Co-authored-by: Stakeout Punch <StakeoutPunch@users.noreply.github.com>
* Accessors for volume, cutoff, resonance
Add private accessors for the volume, cutoff and resonance parameters (envelope and LFO).
This makes the code less technical and more readable as it for example removes lots of static casts. The casts are now done in a special helper method that returns the parameters for a given target.
* Remove EnvelopeAndLfoParameters array
Remove the `EnvelopeAndLfoParameters` array and use explicit instances for volume, cutoff, resonance. This simplifies construction and initialization of the instances.
Besides the array this also removes the `Target` enum and the `NumTargets` value.
To simplify storage and retrieval of the parameters three private methods have been added which provide the node names of the volume, cutoff and resonance parameters.
Adjust `InstrumentSoundShapingView` to the removed `NumTargets` property.
* Use references instead of pointers
Use references to the volume, cutoff and resonance parameters instead of pointers.
* Remove friend relationship
Remove the friend relationship between `InstrumentSoundShaping` and its related view by providing the models via getters.
* Get rid of targetNames
Get rid of `InstrumentSoundShaping::targetNames` by using translations and strings directly. Move the remaining stuff into `InstrumentSoundShapingView` until it is removed there as well.
* Explicit EnvelopeAndLfoViews
Remove the array of EnvelopeAndLfoViews and use dedicated instances instead.
This also enables the final removal of the remaining `targetNames`.
* Move the code of some getters
Move the code of some getters into the header file.
* Several code review changes
Apply some code review proposals.
Co-authored-by: Sotonye Atemie <sakertooth@gmail.com>
---------
Co-authored-by: Sotonye Atemie <sakertooth@gmail.com>
Refactors `AudioFileOgg`, a class used to export to OGG files. There were problems reported of the exported OGG file failing to be played back on some systems. To fix this issue as well as to improve code quality, the class was refactored. In addition, VBR (variable bit rate) is always used, with the quality of the export being determined by a ratio of the selected bit rate and the maximum bit rate allowed. This change naturally occurred when refactoring, though the libvorbisenc documentation recommend VBR for improved audio quality.
Adds the ability to cut multiple notes at once in the Piano Roll. Users can select the Knife tool and create a cut line by holding the mouse and dragging it across the notes that should be cut. This also allows cutting the notes at an angle. When releasing the mouse, the Shift key can be pressed to remove the shorter end of the notes that were cut. If any notes are selected, only they will be considered for the cut, even if the cut line covers more notes.
The scroll bars shown in the main window were removed in favor of a new navigation feature that utilizes dragging the mouse instead. Users can now hold the mouse down on an empty part of the workspace and drag the mouse around to navigate where necessary.