* Compensate beat note length when stretching
We allow stretching beat notes to normal notes but the length starts
from -192 so there is a lag for one whole note before any change is
seen. Compensate by setting the oldNote value to 1 when stretching
if the note is 0 or below in length.
Co-authored-by: Spekular <Spekular@users.noreply.github.com>
This PR fixes issues on systems where `QCursor::setPos()` has no effect
or is not reliable. These issues included knobs moving to fast on some
operating systems. Affected widgets are `Knob` and `LcdSpinBox`.
With this PR, on all operating systems, the `setPos` calls are removed and
the cursor is not hidden anymore, so the mouse keeps moving normally
when changing values of one of the widgets.
As now the previous pointer position keeps moving (instead of being reset
to the original position using `QCursor::setPos`), the mathematics that
translate pointer pixel distance to `Knob`/`LcdSpinBox` value increase
have to be changed:
* The `Knob` transition function is now linear and uses a new factor.
* `LcdSpinBox` now uses float values and saves the current float remainder
(this is actually a separate issue revealed by this fix), leading to a fluent,
non hanging movement.
This atomically unsets the MidiJack reference in AudioJack right before
MidiJack is destroyed. This avoids AudioJack using a destroyed MidiJack
object.
This patch
* makes `m_stopped` atomic
* initializes `m_stopped` correctly to `true`
* moves the initialization of `m_stopped` to the point where jack ports
are already connected
* Multiple effects: Calculation of `outSum` should be after D/W mixing
* CrossoverEQ.cpp: `outSum` must be divided by frames in the end
* CrossoverEQ.cpp: don't overwrite `outSum` in for loop, but increment it
When selecting a Piano Key to mark semitones in the Piano Roll we
select key from the y position of the pop-up menu and not the mouse.
Incidentally these two are most often the same as the menu builds
from the mouse y positon and down. If there is room for it. If there
is no room downward it will create the menu so the lower part of the
frame aligns with the mouse y position.
Fixed by creating a variable to hold the pressed key before creating
the menu.
Knob::friendlyUpdate() can be called after the model is deleted
due to signal-slot connections.
Adding a check for the model fixes a crash due to null pointer dereference.
`PianoRoll::mouseDoubleClickEvent` wasn't forwarding the event to the base class when not acting on the event. The base class calls `mousePressEvent`.
Fixes#3005
Calling via QMetaObject::invokeMethod should be thread safe.
Crash callstack:
QWidget::move
SongEditor::updatePosition
Song::stop
Song::stopExport
ProjectRenderer::run
QThreadPrivate::start
right place when it not played from the begining.
That has created a difference between the ticks and the metronome and
the sample track.
The cause of the problem was that the calculation of the frame to play
was wrong: we had calculated `framesPerTick` according to the current
engine's sample rate instead of the SampleBuffer's sample rate.
To avoid a race condition between the gui thread which destroys the
samplebuffer and the mixer thread which increases the buffer's ref-
count, we'll make sure to touch the ref-count only when wh're synced
with the mixer.
NotePlayHandleManager::acquire uses a read lock unless the pool is empty.
If two threads try to acquire NotePlayHandle simultaneously
when the value of s_availableIndex is 1, one thread will try to read s_available[-1].
If the acquire action and the release action are done at the same time,
NotePlayHandleManager::acquire may try to read data
before NotePlayHandleManager::release actually writes.
This commit prevents them by always using the write lock when acquiring a NotePlayHandle.
* fix hanging mouse in piano roll (#4822)
* fix hanging mouse in automation & pianoroll (#4822);
* fix hanging mouse in automation & pianoroll (#4822)
removed TODO comment that I forgot in the code
As of https://github.com/probonopd/linuxdeployqt/pull/370/,
the AppRun of linuxdeployqt unsets LD_LIBRARY_PATH.
This behavior isn't suitable for our cases, so we use
the extracted binary directly as a workaround.
@lukas-w reminds in 134dae8 comments that X11Extras help Linux users of
VST effects #3786. Now LMMS builds and runs on Weston without X11
dependencies, though only if WANT_VST is off.
Other changes:
* Update TCO position more exact when a drag leaves a TCO and enters `TrackContentWidget` (required to detect that the cursor has really moved when leaving a TCO with length < 1 to the right)
* Use exact length when samples are loaded, don't round it up
* Reset size when reloading same file
* [Equalizer] Bright analyzer colors, opacity incr
Brightened spectrum analyzer colors and increased opacity a tad to make more visible
* Fixed RGB Value
* Update EqControlsDialog.cpp
* Fixed color change
* Changed colors again
* Fixed colors, now brighter and bluer
* Ok, its actually bright now lol
Fix some assumptions that source and target of a drag actions are the same
track container. Instead of looking up necessary information (track name,
type and container id) by track index, add it to the metadata.
Refactor canPasteSelection to take QDropEvent instead of the drop event's
QMimeData. Coincidentally, this fixes the method to be consistent with its
documentation.
Fixes#4844
hallow clone may break version detection. This is fatal in Debian builds, so use full clone.
Note: This is safe for stable-1.2 but needs review after merging to master due to submodules. See #4888 for more information.
Fix a crash that occurred on the following steps:
1. Add an AFP track.
2. Open it, and move the waveform display to overlap the track label
button.
3. Close the AFP window and open it again by clicking the track label.
4. Move the mouse pointer.
The problem occurs because the code makes the implicit assumption that
AudioFileProcessorWaveView::enterEvent (and hence
QApplication::setOverrideCursor) is called before
AudioFileProcessorWaveView::mouseMoveEvent. This is not the case when
the waveform display is on top of the track label. In this case the AFP
windows is opened with the mouse being immediately positioned over the
wave form display. There is no enter event and move events are issues
directly. This then leads to a crash in
AudioFileProcessorWaveView::mouseMoveEvent when trying to determine the
value for is_size_cursor because the override cursor is still null but
is dereferenced directly without checking.
Only adding a check would not solve the problem because in that case the
cursor would not change to the hand cursor when being moved inside the
waveform display.
The solution is to remove all calls to the global methods
setOverrideCursor and restoreOverrideCursor and to only set the cursor
locally.
This fix is based on a patch by gi0e5b06 which is committed under 8a10c52
in his repository but for which he never created a pull request.
* Fix uninitialized m_jackClient being used in MidiJack destructor
* Fix destruction order in Mixer.cpp so that MidiJack doesn't access the
deleted AudioJack instance
Fixes#4688
When deciding to polyfill glibc features, check if the standard library claims to be glibc, instead of enumerating platforms in the condition. Unlike master branch which in de3b344 changes math function calls to standard, stable-1.2 keeps their glibc names and fails to build on Linux with another libc such as musl.
* If we find NaN/inf, we declare the whole buffer bad and set it to 0.0f. This
is because the noise leading up to, or coming from, an infinite or NaN value
is often very large and will create problems later in the sound chain. Especially
if it hits a delay based fx with feedback.
* We bump the clipping level to +/-10.0f.
Really short notes doesn't work well with delay based effects with the default
decay settings of the FX autoquit system where the effect can cut out. Set
autoquit as disabled by default.
Decay and Gate knobs are now also disabled when autoquit is disabled.
Switches some signal-slot connections to Qt::DirectConnection.
Now LMMS can handle loop points correctly and export samples without glitches.
Also tweaks some Mixer-related code to avoid related deadlocks on export.
Resolves the incompatibility between FluidSynth 1.x and 2.x
due to some API changes by shimming some functions.
Note that 1.x and 2.x are not binary compatible.
Previously BBTrackContainerView::dropEvent always deleted
the TCOs of dropped tracks. It made dropped tracks unusable.
As of this commit, the function checks for correct TCOs.
If incorrect TCOs exist, the function remove them and add empty ones.
Due to the wrong condition for GUI handling, empty patterns longer than 1 bar
was treated as BB patterns though they don't really look like.
This commit drops the erroneous check and fixes related GUI issues.
* Update the LMMS logo and mimetypes
* fix bmp for nsis installer
* Update window and About icons, rename icons, change the file association logic
* Fix NSIS
* Revert nsh patch
* Fix small icon
* Always write DefaultIcon in the registry
* Fix file permissions
* Fix nsis branding
* Fix nsis branding #2
* update the icon windows and linux
* Update apple icon, add windows visual manifest
* try to fix windows installation
* typo
* typo 2
* Set small logo to conform to 48x48 grid
Some plugins don't initialise it themselves, expecting it already to be
done for them, and so are liable to hang without it (e.g. TX16Wx).
Co-authored-by: Hyunjin Song <tteu.ingog@gmail.com>
Co-authored-by: Dominic Clark <mrdomclark@gmail.com>
Changed according to feedback from AudioBlast. The flag used to be set most of the time, now it is only set when playback starts/stops, looping is toggled, or playback jumps around.
Ignore requests to change the I/O count from within processReplacing and print a warning instead; the shared memory is in use so it can't be reallocated. Add a special case to return immediately if the I/O count hasn't changed at all; this will prevent spurious warnings when the plugin is only updating the latency and should reduce unnecessary reallocations in general.
Some plugins ignore updates to these values if they're changed while the plugin is in a "resumed" state, resulting in incorrect tuning after a change of sample rate.
This is a workaround for rare crashes when changing the tempo
while playing notes with stacking and/or arpeggio.
When playing the master note, _working_buffer is null.
Tempo change causes false positive in the check because
NotePlayHandle::resize changes m_totalFramesPlayed.
Thanks to 6fc4577f10, we can safely drop
the memset call.
Make the oscilloscope colors available as properties so that they can be
changed via style sheets. Adjust the existing styles to use the colors
that have been hard coded previously.
Cleanup the paintEvent method of VisualizationWidget, e.g. by extracting
a method to determine the color to use for the line and by pulling
variables to the place where they are used. Fix some Clang warnings.
Writing the enable bit to `FF23` causes the noise oscillator to start outputting samples and writing the other registers (including the one for the SRW value) during the time the oscillator is active has undefined behaviour.
In order for `GB_apu` to correctly generate samples when the LSFR width is
set to `7`, the trigger write to `0xff23` must happen after all other
writes.
* Bug fix in peak_controller_effect.cpp
This change makes it so that when an LMMS project is loaded, each knob connected to a Peak Controller will be set to the Peak Controller's Base value, rather than its minimum possible value.
Fixes regression from 75077f6200 that caused
global automation tracks to have priority in processing.
Adds a test checking for the desired behaviour.
Fixes#4268
From MSDN: "In WM_SYSCOMMAND messages, the four low-order bits of the
wParam parameter are used internally by the system. To obtain the
correct result when testing the value of wParam, an application must
combine the value 0xFFF0 with the wParam value by using the bitwise AND
operator."
Also calculate the required window size using AdjustWindowRect, rather
than hard-coding some constants.
QMdiSubWindow::setSizePolicy doesn't have any effect because QMdiSubWindow
uses a layout. This patch uses QMdiSubWindow::layout()->setSizeConstraint
instead. This may cause effects that don't have a layout and don't
implement sizeHint() to now be resizable. For effects that do though, it
fixes the size constraint.
Fixes bugs where during project loading (observed with VST effects), empty
widgets and sub-windows would be left floating around. These were caused by
inconsistencies between the way VST UIs were created when loading a project
and when adding an effect in an existing project. In some situations, this
caused createUI to be called twice, leaving over multiple empty widgets.
This commit refactors some code in order to avoid creating unnecessary sub-
windows, which aren't needed with VST effects, but were still created,
usually being invisible. All sub-window related code was moved out of
VstPlugin into vestige.cpp, which is the only place where sub-window VSTs
are actually used. A new sub-class of VstPlugin, VstInstrumentPlugin, now
handles VST sub-windows and is used by vestigeInstrument.
"guivisible" attribute loading was moved out of VstPlugin as well and is
now done in VstEffectControls' and vestigeInstrument's loadSettings method
respectively. This causes some minor code duplication unfortunately.
Closes#4110
When exporting a project lmms performs extra tests for bad data.
The tests are for infs and nans. Switching these tests on for all
occasions as the extra performance hit would be in the order of
only ~2% and the problems, when it hits the end user, are hard to
debug and/or work around.
After testing for inf/nan we clamp the sound to +/-4.0f as sometimes
you will get large transients passing through (an issue that is currently
only present when exporting).
Fixes: #1048
Instead of calling MouseMoveEvent(), the TCO's "text float" text and position are updated.
This prevents left-clicking the right edge of a resizable TCO from decreasing its size.
Also, removed an unused variable: m_oldTime
This code loads a Qt5 library, which will cause problems if done from a Qt4 application. If the application is Qt4 based we don't have a bug with kde changing the menus anyway, so we can skip this code.
Build AppImage with Carla support
* Disables HiDPI support in the AppImages
* Ignores deprecated jack usage
* Fix Carla compilation warnings
* Detects carla prefix in AppRun
If a mixer channel is soloed when it's deleted the other channels are left in the
state their in which is, for the most part, muted. Solve this by clearing mixer
channels on delete.
Change the default value of ignoreSurroundingPoints in AutomationPattern::putValue to true, which was false in #3352.
Fixes automation filpping bug and some potential issues.
When you left click an existing value the automation point will only
snap to the new value if it is higher. If it is lower the mouse click
event will 'break'.
Cleanup. Remove statement that will always evaluate as 'true'.
Default project when cancelling project loading
If a user isn't aware that the loading of a project has been
cancelled, it may be in an incomplete state. Saving such a project
will overwrite the original file and result in data loss. This is
solved by loading the default project on cancelling project loading.
Add Mixer::clearNewPlayHandles() to prevent crash when cancelling
loading of a single streamed instrument.
* Fix templates and recent files on KDE.
Workaround for https://bugs.kde.org/show_bug.cgi?id=337491 , Call into KDE stuff to stop it adding accelerators.
* Fix & in recent files.
Escape & as && when building the recent file lists, and reverse that when getting the file name.
* Fix Automation Point delete radius. At lower zoom deleting would miss
automation points to delete and at higher zoom it would be too generous
and remove neighbouring points.
* Increase smallest Automation Point radius. For visibility. The smallest
Automatin Point radius was tiny.
Let InstrumentSoundShaping::releaseFrames() ignore release frames for single-streamed instruments. And make it return 0 if m_instrumentTrack->instrument() is NULL.
When in sort mode and playing over multiple base notes, in the
beginning of the notes there is a chance that the notes will play
together as an ordinary chord instead of arpeggiate.
This is a regression from 6650dd3.
Fixes#3342
Set 'master note' for silent notes on sort mode.
Prevent silent notes to play as ordinary notes in the background
when they are waiting for their turn to arpeggiate.
Remove unnecessary test (it will always return TRUE).
Slower default speed (200ms).
* Re-enable MIDI export
* Fix logic for processing BB tracks and BB notes
* Consider master pitch and base note in MIDI export.
* Cut BB notes at the end of BB pattern.
Don't auto-save while playing by default. On weaker machines (xp?) we
see glitches so better turn this on after need.
Remove the last of Limited Sessin which was removed in 290556e.
* Respect build options in ExportProjectDialog
* Use QItem user data instead of hard ordering to identify export format in ExportProjectDialog
* For compatibility with QVariant, ExportFileFormats is now explicitly an int.
* Don't break out of format identifier loop prematurely in Song export.
The spectural analysis was using a rectangle window, leading to high spectural leakage.
This pull request uses the Blackman-Harris window to give a display more representative of the audio.
With this pull request, the user is able to cancel a track rename action by pressing the Escape key.
Also renamed rename_dlg to renameDlg in TrackLabelButton::rename() so it complies to the naming conventions.
Fixes#3675.
We need to wait with calling Mixer::restoreAudioDevice() and
Mixer::changeQuality() after render until all threads have stopped.
Moving these calls to ProjectRenderer::~ProjectRenderer() ensures
all render theads are done.
Add the option 'mp3' to the format switch (-f / --format) if LMMS is
compiled with MP3 support. Add the new switch 'mode' which can be used
to set the stereo mode used for the MP3 export.
Adjust the man page for the new options.
We give the stream a unique serial number and make sure it
isn't '0' or 'UINT_32_MAX'.
Change obsolete 'Linux MultiMedia Studio' to 'LMMS' in
ogg file comment.
* Add a factory default data/projects/templates/default.mpt. Fixes#528
* On launch, if the last project was a template we create a new project (default.mpt) instead.
* If there is a recovery file present and you discard it we create a new project as the project launched could be defective or, if .lmmsrc.xml wasn't written, an earlier project.
* First version of artwork tabs for the InstrumentTrackWindow.
This version can only display & manage artwork tabs, which breaks
the InstrumentSoundShapingView as it still uses text tabs.
I'm planing to improve this implementation to let these artwork tabs fall back
to text mode when no artwork is given. This would solve the problem of the
InstrumentSoundShapingView.
* Second version of artwork tabs for the InstrumentTrackWindow.
This version will draw an artwork tab when the TabWidget::addTab function is given
a pixmapName. Otherwise, when pixmapName is NULL, it will fall back drawing a text
tab.
* Created artwork for the artwork tabs.
* 1st PoC for autosizeable artwork tabs.
* TabWidget is 20 pixels tall when it's going to display artwork tabs.
* Added tooltip support for the TabWidget class.
Atm, tooltips are simply tabs' name.
* Imported artworks from RebeccaDeField
* Reverted to 12px tall TabWidget
* Fine tuning for the positioning of artwork tabs: Take into account the caption 'space.
* New artwork for the ENV/LFO tab (has now an ADSR-based look)
* 1) Tabs in TabWidget class have now a "tooltip" attribute. So that they can now show
more meaningfull information then simply the tab's name.
2) Fixed the compilation problem with QT5
* Fine tuning the positioning of highlighted artwork tabs.
* Fixed an issue in TabWidget's artwork tabs autosize function that makes gdb crash
with SIGFPE.
* TabWidget is 17 pixels tall when it's going to display artwork tabs.
* Removed underscore prefix for function parameters as coding convention has changed.
(Request at dccf9f4119 (r61165005))
Cyrille
* Removed background gradient for TabWidget as LMMS is going to a more flat design.
Cyrille
* Increased the graphical TabWidget's height by 2 pixels for eye-candy.
The InstrumentTrackWindow's height has been increased by the same amount.
Cyrille
* Removed gradient in GrouBox widgets as LMMS is going for a more flattened design.
Cyrille
* Made the background of TabWidget themeable
Cyrille
* The highlighting color for a TabWidget'selected tab is now themeable.
* Made TabWidget's Title text and tab text themeable.
* Added a darker background to the TabWidget's tab bar.
* Further flatened the design of TabWidget
* Flatened the design of the GroupBox widget
* Fine tuning the placement of TabWidgets' highlighting background
+ some code cleaning in TabWidgets
* Made the TabWidget's title background and borders themeable
* TabWidget - Artwork tabs: Do not change the icon color when it is highlighted
* TabWidget: Made the artworks' color themeable
* Adapted format to follow LMMS coding conventions
* Some more blank spaces to tabs translation to comply with LMMS coding standards.
* Some more blank spaces to tabs translation to comply with LMMS coding standards.
* Revert "TabWidget: Made the artworks' color themeable"
This reverts commit 5b162c07e2.
Conflicts:
src/gui/widgets/TabWidget.cpp
Reason: Artwork's color themeability had the side-effect that it removed the artworks' alpha
channel, thus making them ugly.
* Made GroupBox's background color themeable
* Update background color, only use one set of images
* Use name as tooltip, more descriptive names
* Update icons and colors
* more things
* formatting fixes
* Remove update() from constructor
The LFO rate was not correctly syncronising to tempo
This has been rectifited, to utalise the TempoSyncKnob as intended, returning a period,
instead of a frequency. The knob now reports the correct values in the GUI.
Flanger LFO maximum period incressed to 60 seconds
The previous delay code was incorrectly not utalising the whole buffer, causing glitches when
incressing the delay time, due to outputting incorrect data, This was apparent when using the
lfo in the Delay and Flanger plugins.
This has been rectified. The read index is now offset from the write index. and the complete buffer is used in a circular fashon.
Flanger - resolved issue where the lfo could create negative delay lengths
* ReverbSC: Method to change samplerate (#3401)
* ReverbSC: added mutex for protected malloc
* ReverbSC: small CMake fix to remove warning message
* ReverbSC: samplerate changed to uint32_t. more CMakeFile tweaks
* Fix dc block on oversampling
If the variables bit rate is not enabled the nominal bit rate will be
used for the minimum and maximum bit rate in the encoder.
If the variable bit rate is enabled the current implementation will
compute the minimum bitrate by subtracting 64 kBit/s from the nominal
bit rate. The maximum bit rate is computed by adding 64 kBit/s to it.
Example: The nominal bit rate is set to 160 kBit/s and variable bit rate
is enabled in the export dialog. The minimum bit rate is then set to 96
kBit/s and the maximum bit rate to 224 kBit/s.
Only show widgets on the export dialog that are relevant to the selected
file format (Wave/Ogg):
* Sample rate is always shown.
* Bit depth settings are only shown when Wave is selected.
* Bit rate settings are only shown when Ogg is selected.
Remove the label that informs the user that not all settings apply to
all export formats as it is not needed anymore. The english text of that
label was: "Please note that not all of the parameters above apply for
all file formats."
Pull the class OutputSettings out of the class ProjectRenderer so that
it can be used in other contexts as well. Also move the enum
ProjectRenderer::Depth into the new class OutputSettings and rename it
to BitDepth. Adjust all places that referenced
ProjectRenderer::OutputSettings accordingly.
Adjust the two places where an instance of OutputSettings is created:
the main function and ExportProjectDialog::startExport.
Store an instance of OutputSettings in AudioFileDevice and remove
several members and methods which are now replaced by this instance. Add
a getter for the OutputSettings to AudioFileDevice. Storing an instance
of OutputSettings in the base class AudioFileDevice enables the
simplification of the following constructors and general code in the
following classes:
* AudioFileDevice
* AudioFileOgg
* AudioFileWave
Because OutputSettings contains everything related to sample rate, bit
rate settings and bit depth these parameters could be removed from the
parameter list of the aforementioned constructors.
Simplify the signature of the factory method AudioFileDeviceInstantiaton
(defined in AudioFileDevice.h) and reorder the parameters by significance.
Move the logic of how the minimum and maximum bitrate is calculated
using the nominal bitrate into AudioFileOgg::minBitrate() and
AudioFileOgg::maxBitrate(). Previously this was defined in the
constructor of ProjectRenderer where it does not belong as it an
implementation detail of the OGG export.
Remove the code that converted the bit depth enum to an integer from
ProjectRenderer as it is now solely represented as an enum.
Remove class members for the minimum and maximum bit rate from
AudioFileOgg and adjust the code in the implementation to use the values
stored in OutputSettings.
Add a new value of "24 Bit Float" to the "Depth" combo box in the
project export dialog.
Add a new enum value to ProjectRenderer::Depth and extend the evaluation
of the different enum values in ProjectRenderer.
Add the new case of a depth of 24 to AudioFileWave and remove some
repetition with regards to SF_FORMAT_WAV in the code. It's only set once
now and then the depth is "added" in a switch statement.
The Delay plugin had an issue with the delay knob having the incorrect max value,
this was resulting in incorrectly scaled times
This has been corrected.
* Duration of the beat is defined by the denominator of the time signature
and it does not depend on whether or not you use triplets.
* Fortmatting fixed.
- Double-click mmpz file in finder will now open properly on macOS
- Adds new MainApplication class for listening to QEvent::FileOpenEvent
- Queues open events until the application is ready to recieve them
- Closes#665
* Right Mouse Button To Erase Nodes In Automation Editor Cursor Icon Does Not Change #3310
* Remove unused member m_mouseDownLeft from PianoRoll
* Add move cursor for automation points drag
* Ailiasing in AutomationPatternView; ERROR: Doesn't draw unreferanced tracks
* Draws one polygon instead of 'poly'-polygons
* Changed QPoints to QPointF
* Added int MidiTpT constant
* Added ppTact for reduced computation
* Added spaces in parentheses to be consistent
* Variable name change and spacing
* S P A C E S
* Anti-Aliasing of Automation Editor
* Commented out all referances to unused is_selected
* Changed css to non-gradient graphs
* Added Brackets
* Removed no-pixel line at bottom of graph
* Revert "Added Brackets"
This reverts commit ff801868b7.
* Revert "Revert "Added Brackets""
This reverts commit 4e127a78df.
* Revert "Removed no-pixel line at bottom of graph"
This reverts commit 940c766b61.
Do not clear the filter histories when the crossover control has changed,
e.g. via automation.
Add a new method CrossoverEQEffect::clearFilterHistories that's called
whenever the filter histories need to be cleared, e.g. after loading a
crossover EQ. It would be beneficial to also call this method when the
effect is enabled again after being disabled but it seems there is no
was to find out that this event has happened. One could implement it in
the process method by storing the current state in a member and
comparing it to the state at the time of the last process call but this
is something that should be provided by the framework.
* Move implementation to a new cpp file
* Use std::vector as base class instead of doing our own memory management
* Remove unused dangerous functions
* Make more use of std algorithms
* Some cleanups in code using ValueBuffer
* Made fltk install to the write path
* Supress downloading packages that are either installed with pacman or
built from source
* Build libogg from source
* Cleanup after installing libogg
* Build libvorbis from source
* Build flac from source
* Build libgig from source
* Build STK from source
* Fixed "already run" check on STK
* Took credit for calling somoene at Stanford a yutz so they don't think
it was the project lead
* Fixed symlink to pkg-config for 32 bit systems
* Enabled shared library production with fltk
* Hopefully fixed install of STK
* Backed off last change regarding STK. It broke things
* Put the cross toolchins in front of path. It needs to be there so the
cross tools override the native tools
* Move libgig dlls into the bin directory so they can be found
* let libjpeg and fltk be installed from the repository as they are needed
at that version for make package
* Fix deleting automation points out of quantization
* Triplets in Automation Editor + better remove action
* Let a quantized Automation point wipe clean the space it covers
* Improve sensitivity on erase with zoom < 100%
* Eigth note default quantization
* Tooltip and whatsthis text
* Make dem grid ndasd
* grid BG
* fix bug in scroll behavior
* debugging scrolling
* Add CSS property, port to automation editor
* Fix a fail
* Spaces to tabs
* Use fillRect rather than drawRect
* Implement @vlad1777d's idea
* Seperate loops and stuff
* Finish up Piano Roll Grid
* Cleanup
* Redesign the grid for the Automation Editor
* Update colors
* Formatting changes
* formatting changes II
* redesign of EQ plugin
* correct some symbols
* set pixelPerUnitHeight to float
* change textcolor of inactive handles to white
* revert changes in styles.css
* change grid color/adjust Fontsize of info box / change analizing color
* range changed (20 - 20000 Hz) / display width increased
* Update the EQ faders and remove unused files
* Increase transparency of the graph
* corrects the filter fader peak
* makes fader peak display more useful
* Implement @zapashcanon's suggestions
* SideBarButton set text below the icon
* change color of checked sidebarbutton
* adds a space to the sideBarButton title
* add gradient to checked side bar button
* whitespaces
In PianoView.cpp fixed the focus policy so that if one would like to use
a QPlainTextEdit in his plugin, he'd be able to do so.
In TrackContainerView.cpp and AutomationEditor.cpp there's a problem
that if you use a Right To Left locale, all the GUI turn RTL, but in
those specific editors, things get very messy, because they were made up
with the assumption of LTR.
This reverts commit e3e14bb730 in an
attempt to fix issue #3292.
The problem that's addressed is very elusive:
* It cannot be reproduced reliably.
* It seems to be more prone to appear in release builds.
* It only seems to appear when two or more instruments are mixed into
one channel.
* If you solo a problematic Triple Osc it goes away.
The observations above seem to indicate that there's rather a problem
with the mixing (due to multithreading?) and that the changes made to
Triple Osc seem to trigger this deeper problem more quickly.
Change all phase related variables in Oscillator from float to double.
The parameters for the getSample methods have not been changed to double
as it should suffice to only update the phase variables with double
precision.
* fixes precision on knob dragging
* fixes precision on fader dragging
* diaplay a rounded float on knobs
* enter rounded value on fader
* add getRoundedValue() and getDigitCount() to floatmodel
* whitespace
* play sampletracks from any song position
* take care of TCO length
* TCOs shouldn't be updated when SE window is resized
* take care of zooming level
* takes care on all song position changes and mute/solo tracks now
* playes the sample only within the buffer limits
* takes care of time signature changes
* some minor code improvements (zapashcanon)
* loopback one tick earlier
* minor code changes
* get rid off clicks by resize and scrolling song editor
* removes playhandle by remove TCO
* minor bugs on manipulating TCOs in Song Editor
* update on add sample by playing
* white spaces 1
* Support jack midi input
* If jack is used for audio then use the same connection for midi as well
* Remove old FreeBSD adjustment for portaudio as multiple version support has been dropped.
* Disable jack midi out port until it is functional
* calcuculate curve path only when data has changed
* calculate spectrum analyzer only if signal input
* code clean up / coding conventions
* changes according coding guidelines/performance improvements in spectrum analyser/curves painting
* minor changes/white spaces
* change init order
* connect analyze view to gui->mainWindow()->periodicUpdate()
* consolidate some functions (d.r.y.)
* minor syntax changes
* fixes a right mouse button bug
* correct steepness of flanks in high and low pass filters
* Whitespaces
* Fixed showing of velocity of steps.
* More contrast between muted and unmuted steps.
* Corrected opacity of volumes over 100.
* Single pixmap draw per step and step opacity is calculated using sqrt function.
* Using step_btn_on_100.png created by Umcaruje.
* Disable minimization on all subwindows
* Change the maximize button icon
* Remove redundant boolean
* Make the maximize icon play better with the close icon
* I removed too much maaan
* Fix spaces
* Change comments
* rename FxLine directly in a QLineEdit
* set project modified only if FxLine text is changed
* clean up some code. Optimize some things
* optimizing code / removing a couple of member variables
* minor code optimizations
* turn off the tool tip in rename mode / minor code changes
* makes Tracks themable in style.css (#2889)
* change the active title bar color/adds a thin line on top of title bar (#2912)
* Make the window border lighter (#2911)
* Color Updates (#2940)
* Increase the lightness of active FxLine (#2945)
* Sidebar tweak (#2954)
* Fix dialog button mismatch
* Change order in menu
* Make buttons the same role, so we have custom ordering
* Hide the exit button, add a close button to the dialog, change ordering
* Make the exit button not visible
* Render the mixer levels in a dB FS scale
Adds the option to render the mixer levels in dB FS. By default this
option is disabled so that classes which inherit from Fader are not
affected by this change. However, in the code of the FxMixerView this
feature is enabled so that the mixer shows the levels in dB FS.
The ability to render in dB FS is exported as a property so that it can
also be set in a style sheet (not used as of now). The new property is
called "levelsDisplayedInDBFS".
There are now setters and getters for the min and max level.
Showing the levels in dB FS (which is a logarithmic scale) gives a less
"fidgety" impression when the levels are moving.
* Introduction of an init method in Fader
An init method was added to unify the initialization of the two Fader
constructors.
* Draws a transparent rectangle in the loop area (plus CSS exposure)
The color for the rectangle can be defined in the style CSS for the
active and inactive case. The following properties of the TimeLineWidget
are exposed through the CSS:
- The color of the lines that are drawn for each bar
- The color of the bar numbers
- The font size (given in pt)
- The minimum and the maximum height of the widget (given in em so that it scales with the font size). Set both to the same value to set a fixed size.
- The background of the widget
- A loop color: The color for the main rectangle's pen
- A loop brush: The brush used to fill the main rectangle
- An inner loop color: The color used for the pen that draws the inner border.
- loopRectangleVerticalPadding: specifies the padding used for the loop indicator rectangle.
The bar numbers are drawn conditionally like the bar lines. The
numbers are drawn with a constant distance to the tact line. This gives
a more consistent picture at different zoom levels and also fixes the
broken look at very small zoom sizes like for example 12.5%.
The bar numbers are drawn with hinting so that they show up less blurry on low DPI displays.
Remove the pixmaps that have been used up to now to draw the loop
boundaries.
Removes the unused "TimeLine" from style.css.
Document the style sheet properties for the loop indicator rectangle.
* Draw flat, borderless, semi-transparent and sharp-cornered notes; Increase the contrast of the grid
* Convert the note gradient to a horizontal one
* Increase opacity for better visibility
* Reinstate borders, make the fill semi-transparent
* Some cosmetic touch-ups
* Make border width themeable
* Set a boolean for borderless properties
* Rename borderlessNotes to noteBorders
* Make scrollbars consistent over the software; Add padding to the scrollbars; Make the PianoView background themeable
* Make the scrollbar hover color brighter
* Fix missing scroll back on stop in Song Editor
* Fix missing scroll back on stop in Song Editor
* Avoid scrolling the Song Editor when scrolling is disabled.
* Handle the smooth scroll in scroll back
* Remove leading underscore from fonction parameters name
* Put back spaces around parameters (Removed by mistake)
* Fix command-line help, add --config option and use local lmmsrc file in dev mode
* Fix a typo in help screen for option --geometry (second dash missing)
* Replace tabs with spaces in help screen
Update man page
* Lineup items in help screen
* Accept both -geometry and --geometry as valid options
In the course of 32b7e04, I removed the channel lock from FxChannel because
I was under the impression that it was only needed to prevent crashes on
channel delete. However, at least two people experience crackling audio
after it was removed (#2708). Therefore, this commit reinstates it.
- Additional LMMS_BUILD flag.
- Disallow on plugins -Wl,-no-undefined which triggers undefined references.
- Make sure X11 headers are found.
Lib ossaudio is needed only for OpenBSD
redundant expression removal
simplify condition for detection OS 'kind'
seems the last commit brought an issue on OSx travis test ....
In Qt, it is not safe to delete a QObject inside a signal emitted by that
QObject. This happened with FxLine when removing an FX channel using the
context menu. This commit changes that by using deleteLater() instead of
delete on the FxLine. It also hides the FxLine to prevent a ghost of it
being drawn when deleting the last non-master FX channel.
Lock the mixer before performing a channel delete to prevent any race
conditions causing a crash. Also, update the audioport FX channel when
an InstrumentTrack's FX channel is changed to prevent the audioport
mixing to a nonexistent channel.
The fix works as follows: until now the method Knob::drawKnob has used
hard coded palette colors to draw the knob lines for the different knob
types. These palette colors are now assigned to the line color property
in Knob::initUi. The method Knob::drawKnob in turn now uses the line
color property for almost all knob types. This means that all knobs
lines will be painted in the same color as before unless that property
is overridden by the stylesheet.
Also removes an unnecessary typedef from QWidget to trackSettingsWidget
in Track.h.
This prevents a race condition with Qt5. A foreach loop makes a copy of its
Qt container, increasing the reference count to the container's internal
data. Qt5 often asserts isDetached(), which requires the reference count to
be <= 1. This assertion fails when the foreach loop increases the reference
count at exactly the wrong moment. Using a range-based for loop prevents an
unnecessary copy from being made and ensures this race condition isn't
triggered.
Removes the knob image knob04.png. This knob corresponded to
knobGreen_17 which was not used anywhere in the code. To be able to
remove the enum value it was necessary to change the knob loading code
in Knob::onKnobNumUpdated. However, the changed implementation is more
explicit and therefore likely better to understand.
Removes some repeated calls to Qt's font layouting by using QStaticText
in FxLine and removing the overridden method ComboBox::sizeHint.
Unifies Mixer::peakValueLeft and Mixer::peakValueRight into
Mixer::getPeakValues so the array is only iterated once.
Commit e919912 changed the behavior of the FX channel swapping code so that
it no longer updated the m_channelIndex member of the swapped channels. This
caused sends/receives of swapped FX channels to move about when a project
was saved and loaded again.
Put every access to m_playHandlesToRemove between lockPlayHandleRemoval() and
unlockPlayHandleRemoval(). Fixes#2610 where a SIGSEGV would occur due to
concurrent access.
The methods NotePlayHandle::index and NotePlayHandle::nphsOfInstrumentTrack
had not yet been brought up-to-date with the new system of attaching child
NotePlayHandles directly to the mixer. This caused strange glitches when
arpeggio was used in sort mode.
Instead, add the NotePlayHandle used for previewing directly to the mixer.
This fixes two preview problems, namely the shared buffer being released
by the NotePlayHandle but still being pulled in by the AudioPort resulting
in distortions, and certain previews being cut off at mouse release even if
a release was set in the envelope.
This fixes a problem where a PresetPreviewPlayHandle would be put in
m_newPlayHandles to be added, then "removed" before it was actually added,
leaving it dangling.
According to the blame the project lb303 has been commented out from
CMakeLists.txt on 22.07.2008. Therefore it does not seem to be actively
maintained and is very likely to not even compile anymore.
This will presumably also affect the translation files. (But I'm making this change within the GitHub editor which provides no easy way to do a 17 file search and replace. :) )
Removes the instruction to build the LADSPA effect plugin in the
"plugins/ladspa" directory instead of the "plugins" directory where all
other plugins are built. This change enables the usage of LADSPA plugins
in development builds where the binary is started from the build
directory.
Move m_playingNotesMutex.lock() and m_playingNotesMutex.unlock() outside of if( m_playingNotes.indexOf( _n ) >= 0 )
Conflicts:
plugins/sf2_player/sf2_player.cpp
Remove note from m_playingNotes before deleting its m_pluginData in sf2Instrument::deleteNotePluginData()
Move m_playingNotesMutex.lock() and m_playingNotesMutex.unlock() outside of if( m_playingNotes.indexOf( _n ) >= 0 )
Removes the warning "MemoryManager: Null pointer deallocation attempted"
from MemoryManager. The warning does not make sense because
deallocations of null pointers are ok in C++.
Fixes#2023.
Fix declaration of return value.
Add mapping and new menu option for octave-marking of semitones.
Finish switch case for add/remove multiple octave semitones.
Fix segfault due to illogical access using iterators from one collection on another.
Make loop more succinct.
Move PianoRoll::getAllOctavesForKey method to private access.
The AUTHOR block was formatted using fixed with font and no line
break by mistake. Change this to normal text formatting.
The problem was discovered by Debian thanks to lintian, and is fixed
there in using a local change in debian/patches/man-page-adjustment.patch.
For LMMS files to be clickable in a Linux desktop environment, there
need to be a program accepting such files as an argument. This patch
change the lmms desktop file to affect files to open on the command line.
I did not know if lmms accepted URLs to remote files, so I went with the
safer %f for local files.
This patch originated in the Debian packaging, see for example
<URL: https://sources.debian.net/src/lmms/1.0.3-5/debian/patches/ >.
Until now windows/widgets that were invisible during the call to
MainWindow::saveWidgetState had their size stored as (0, 0). This
resulted in problems when the default template was created with
invisible windows because in new projects these windows then opened up
at a very small size.
This patch fixes the problem by introducing a new parameter of type
QSize to MainWindow::saveWidgetState. It can be used to communicate the
size that should be stored in case the widget that calls the method is
invisible. The code of most callers (PianoRollWindow, SongEditor, etc.)
has been updated to use good default sizes.
Draws note labels on all (white) keys when selecting to do so in the
preferences ("Enable note labels in piano roll"). The old rather messy
implementation that drew them all over the place has been removed.
When rendering note names on the keyboard keys the C notes are rendered
in a darker color than the other ones. Horizontal lines which do not
correspond to the C key are now also rendered in a more subtle way to
give more prominence to the start of an octave.
The user selected scale is now highlighted in a more subtle way.
The note borders are not toned down in relation to the volume anymore.
The handles on the right side of each note have been made slimmer and
shorter.
The user might invoke cmake with CFLAGS containing "-m32" or (on OS X) "-arch i386" while on a 64-bit machine to indicate that it should build for 32-bit instead.
Puts the controls of the InstrumentTrackWindow into a grid layout to
give them a more balanced look. Without this patch the labels of the
widgets are not aligned which gives the instrument controls a rather
unbalanced look.
Added a "SAVE" label for the preset button to make the layout more
balanced.
This adds libsoundio (http://libsound.io/) as an available audio
backend. libsoundio supports JACK, PulseAudio, ALSA, CoreAudio,
WASAPI, and a dummy backend.
Do not call baseName on the path passed to -o when using the --rendertracks
option. This was mangling directories that contained a literal '.' if a '/' was
not explicitly specified at the end.
Still call baseName for --render as the argument to -o is a file and we need to
set the extension (ogg/wav).
This command allows rendering each track of a song to a different file.
It should provide the same functionality as the "Export Tracks" GUI option.
Usage could look like:
lmms --render-tracks project.mmpz -f ogg -o output/
Remove the rendering logic from the gui code in ExportProjectDialog and let
RenderManger handle it instead.
This is part of an effort to allow the CLI and the GUI to share the same
rendering logic, setting the state for a --render-tracks CLI option similiar to
the "Export Tracks" GUI option.
Much of the multi-track rendering logic was intermixed with GUI code in
ExportProjectDialog.
This creates the RenderManager class to provide rendering logic that could be
shared between the CLI and GUI interfaces.
Currently ProjectRenderer has a helper getFileFormatFromExtension, this adds a
similar helper getFileExtensionFromFormat.
This will, for example, return "ogg" for OggFile.
The piano roll's actions have been grouped into several toolbars. There
are now five groups / tool bars: "Transport controls", "Note controls",
"Copy paste controls", "Timeline controls" and "Zoom and note controls"
(this group is a bit mixed). Each group can be turned off and on using
the standard toolbar context menu provided by Qt.
The new default layout of the toolbars saves horizontal space by putting
the "Zoom and note controls" below the other toolbars. The toolbars can
be hidden and shown via the context menu but these states are not
stored.
The "Song editor", "Beat+Bassline editor" and "Automation editor" have
been switched to using movable toolbars as well.
Adjusted the Editor class to have some other defaults for the "Transport
controls".
Added some methods to add toolbars to editors and changed the other
editors' code to use it. This way the properties of a standard editor
toolbar can be changed in a simple and central way.
Fixed the size of the timeline control buttons which are implemented as
NStateButton. Previously these had a fixed size and appeared smaller than
all other buttons. Now they behave like other ToolButton with respect to
the size. Also removed a fixed size call in ToolButton itself.
Made some adjustments to the CSS for QToolBar and QToolButton:
* Switched the QToolBar CSS to a vertical gradient and also increased
the padding to 2px on the way.
* Previously all buttons looked like they were pressed. This was fixed by
using the same linear gradient that is used for the QToolBar.
* The hover effect for QToolButtons is a bit more subtle now and looks
less intensive as when the button is pressed / checked.
* Gave the normal buttons a bit more radius.
* Adjusted the radii of the special play and stop buttons to be
symmetric so the do not look skewed.
note: Qt's foreach actually duplicates the container before iterating, as well (not hugely problematic for performance since Qt containers are copy-on-write, but is still semantically misleading)
Until now the tension knob was only disabled for discrete and linear
mode if the cubic hermite mode was selected at least once. This behavior
is fixed with this commit.
Fixes a crash that occurred when the tension dial of the automation
editor was moved when no pattern was loaded.
Also added a missing update of the tension dial when the automation
patterns are switched.
There is a new tool button that can be used to turn the metronome on and
off. Per default the metronome is turned off. When enabled the metronome
will during on song playback, pattern playback and BB playback. During
export it is ignored.
A new icon was added as well.
The state is currently stored in the Mixer. It might make sense to put
the metronome configuration in its own class in the future. The state is
currently not stored in the file but this might be a good choice for now
until a better place is found for the metronome data.
Also removed some repeated calls to Engine::getSong() and
Engine::fxMixer().
Added a check for the existence of the file that should be rendered from
the command line. LMMS now exits with an error message in case the file
does not exist.
A new option to save a project as the default template is now available
in the file menu. If the default template already exists the user is
asked whether he wants to overwrite it.
Removes the non-intuitive saving of the default template in
MainWindow::createNewProject.
Other fixed problems:
* User entries were not shown in the menu of the tool button that
creates new projects from templates. Now they are shown as well.
Other changes:
* Adds a new option "New from template" in the file menu. It shows the
same menu as the tool button.
Removes the potential horizontal scrollbar from the controller rack
view.
Also sets the MDI window of the controller rack to a bigger size in the
constructor and moves it towards the other windows. This code is active
in the case where there is no default template from which the window
states are loaded.
Cleans up the root directory of the GitHub source tree and starts to separate platform-specific installing and packaging logic from the master CMakeLists.txt. Closes#2201
Adds a new command line option to render a song as a loop ("-l", "--
loop-mode").
Also cleaned up the code which parses the command line options by
pulling out methods that print the version and the help.
Updated man page: Added the new option to command line render a loop. Updated
the data of the man page and the URLs.
Added information about option to bypass root user check on startup
Calculate the copyright year dynamically
The command line options for help and version info both print the
copyright as "2004-2014". Until now the value for the second year had to
be adjusted manually. With this patch they are computed dynamically so
that the current year will always be used.
LMMS tries to modify the save dialog, This causes a segfault if native
file dialogs are used instead of the Qt ones. At least on Linux, Qt 5
seems to make file dialogs native by default, so LMMS is unable to save
projects when compiled with -DWANT_QT5=true.
Fixed the rendering of the tact numbers in the timeline widget. Before
this fix they were not readable because they were too big. Interestingly
in this case the fix is to use a font size in pixels (half the height of
the widget). The numbers are now also rendered a bit darker than the
lines.
Also removed the pixmap for the timeline from the code and from the
filesystem. It was only used to determine the fixed height of the widget
but not rendered. Therefore it was removed and the height is now
directly set to 18 pixels which was the height of the pixmap.
The PluginDescWidget doesn't use calls to pointSize anymore. Also the
name of the plugin is only painted bold when hovered over with the
mouse. The animation speed was increased a bit as well. Hope it is not
too fast for displays with smaller resolutions. The problem with the
current implementation is that it increases the height by incremental
steps of 1 pixel (triggered by a QTimer) which gives a slower speed on
high DPI displays. In the future this implementation might be improved,
e.g. by using the animation classes provided by Qt.
The SideBarWidget also does not use calls to pointSize anymore. Instead
the standard font is increased by 2 (typographical) points and then
rendered at the right place using information from QFontMetrics. In the
long run the header of the SideBarWidget should be organized using a
layout, e.g. a layout with one QLabel to render the icon and one QLabel
to render the header text. This would ensure that the black background
would always be large enough and that the fonts do not protude into the
actual content.
ControllerRackView now uses a layout to organize the ControllerViews.
The ControllerViews in turn use layouts to organize their widgets
(labels and push button). ControllerView now inherits from QFrame
instead of QWidget. The (static) background image for controllers was
deleted because the ControllerView can now be resized dynamically.
Song: Added specific signals for added and removed controllers. Also
removed a TODO by putting the functionality to remove all controllers in
a method (removeAllControllers).
Deleted Controllers now don't unregister from Song during deletion. This
has to be done by the client (Hollywood principle - "Don't call us, we
call you.").
TODO: For some strange reason I cannot programmatically resize the
controller rack to make it fit the controllers on my screen.
Removes one of the several calls to pointSizeF. This method seems to
return a font which has the same height in pixels on all displays
(regardless of the display's actual DPI value). In the long run these
calls will all have to be removed to make LMMS usable on high DPI
displays.
The default Ladspa plugin folder was incorrect under linux
This pull request fixes this.
Setting Dialog, Ladspa Directory Added leading /
Added a leading / to the lmms/ladspa plugin
Clean the path using QDir::cleanPath()
Moves the code that sets the window title from
PianoRoll::setCurrentPattern to PianoRollWindow::setCurrentPattern which
is the widget that corresponds to the MDI window.
Removal of a superfluous include in AudioAlsaSetupWidget.cpp
Removal of the function "bool hasCapabilities(char *device_name)" which
was not used anyway. It implemented a test for ALSA device capabilities
needed by LMMS (SND_PCM_ACCESS_RW_INTERLEAVED, SND_PCM_FORMAT_S16_LE,
etc.).
Corrected header name in AudioAlsaSetupWidget.h.
Created an implementation file for AudioDeviceSetupWidget to make more
clear that it's part of the GUI.
Fix build for builds that use Port Audio. The setup widget of
AudioPortAudio.h still inherited from AudioDevice::setupWidget instead
of the new AudioDeviceSetupWidget.
This version lets the user select the ALSA device to use with a combo
box. It does not check whether the device works for the parameters that
LMMS uses (SND_PCM_ACCESS_RW_INTERLEAVED, SND_PCM_FORMAT_S16_LE, etc.).
Doing these checks while compiling the list of available devices led to
strange effects which are likely caused by the fact that the PCM device
has to be opened to query its capabilities. This in turn led to error
messages a la "Resource or device busy" when testing the new
functionality repeatedly.
However, having a combo box to select devices from should be a good step
forward compared to a simple line edit. :)
Moved AudioDevice::setupWidget into its own class AudioDeviceSetupWidget
which logically should belong to the GUI (unfortunately the include
structure does not make this obvious).
For the ALSA driver there is an implementation AudioAlsaSetupWidget
which provides a combo box for selection of the card and device.
All other driver widgets have been changed to inherit from
AudioAlsaSetupWidget but have not been changed otherwise.
SetupDialog has been adjusted to keep a map of AudioAlsaSetupWidgets
now.
Shows a combo box with the available ALSA cards and devices instead of a
line edit. The problem currently is that the widgets are nested classes
of AudioDevice and therefore the macro Q_OBJECT does not work which
means that its not possible to define slots that react to retrieved
signals.
The merge of stable 1.1 into master introduced the messagebox into the incorrect
place in the code. It is alrady present in the correct place in master,
so simply removed the extra instance.
This stops the segfault and fixes#1660
Removed trying to validate non lmms files when clicked in the file browser.
This had been the cause of erronus dialog box, and caused a bug, not allowing
drag and drop of sf2 files.
fixes#2094
Changing from arrays of structs to structs of arrays makes the
code a lot more optimizer-friendly, with possible speed gains of
2-3x when compiling for SSE systems.
The translation of the instrument plugins description does not work in Instruments pluginBrowser
Translation of the effect plugins description not showing in effects selector
Replace tabs with spaces in the fix indentation (as Tres request)
More French translations added
Remove the call to tr() inside the macro makeknob (DualFilterControlDialog.cpp) and tr() the strings before calling makeknob
Fix DualFilter description (was labeled as "A native amplifier plugin") (DualFilter.cpp)
Add French translation for the Dual filter knobs.
Move tr() out of macro's so lupdate find them for translation (extract litterals in "ts" file).
Full French translation of Monstro :-)
Make NES translatable (some tr() missing)
Remove tr() from macros (litterals not extracted by lupdate
Translate NES to French
Translate Watsyn Synth as others
Missing Q_OBJECT in DelayControlsDialog definition prevents its translation
Translate Delay plugin to French
Make EqControlsDialog translatable
Fix selected-note volume bug
Closes#2070
Fix a typo in French translation.
Add EqControlsDialog.h to the MOCFILES list in Eq CMakeLists.txt
Remove definition of slot updateVuMeters() in EqControlsDialog.h which is not implemented
This should keep LMMS responsive from the window managers POV, unless
the user selects a huge enough default sound font that loading it
takes too long.
Name the automation tracks like "[MIDI trackname] CC ##". And don't
call the automation track creation function for every CC event, as
it now will involve constructing a QString.
Too short notes had their duration rounded down to 0 on import,
as MIDI precision allows way shorter notes than LMMS, and
portsmf reports the duration as a double, where a beat == 1.0.
Was going to use ceil() first, but that might round some notes
up to a slightly longer duration.
Should be enough to add the object to the automation pattern only once,
as the objModel variable that is added will always be the same for the
same value of ccid, which indexes the ccs array.
This will speed up creation of automation tracks for MIDI CCs and pitch
bend.
AutomationPattern::addObject now returns a boolean which indicates
whether the object was added or not. This change enables the removal of
the error message that is shown in the case that a model is already
connected from AutomationPattern::addObject. Instead all interactive
callers now check for the return value and show the message in case it
is needed.
This change set improves the import of MIDI files significantly. These
have been slowed down quite a lot due to the message being shown
repeatedly during the MIDI import.
The effect selection dialog now also shows the information for the native
plugins. This included name, description, author as well as the plugin
icon.
Also removed the group box with the title "Plugin description" because
it should be rather obvious to the user that further information about
the plugin is shown. This removes some clutter from the dialog.
This commit adds checks for conditions that are asserted during calls to
get_atom_value.
It might fix a crash that is described in 1981. Unfortunately no files
have been attached to that issue. However, I was able to crash LMMS
using a local file and this crash is gone with this fix. So hopefully this
change also fixes the crashes described in 1981.
Lmms routes all midi notes to ZSAF on channel 0, however the CC messages
not routed, and could erronusoly be sent on other channels. This would
lead to ZSAF not acting on these midi commands
This pull request routes All Midi CC messages to channel 0
fixes#1953
The original delay code, was setting it read index relative to the length
of the delay. This fixes that, now when the length is changed the read
index stays in the correct place in the buffer.
The introduction of sample exactness introduced a bug, if The value was
changed using sample exactness Model::isValueChanged was incorectly returning
false.
This bug has shown its self in the BassBooster plugin.
the user vst folder nowbecome the default vstfolder. this is configurable
in the setup dialog.
The user ladspa folder is added to the list of folder to search
Changed the location from lmms/projects/templates to
lmms/templates. This new location is used for loading and saving
of the default tempate default.mpt
During the creation of the user directories, added the creation of
the projects/templates directory.
When creating a new song, if there is no default template create one.
Wrapped the path selection widgets in a Scroll Area, to allow for
the addition of addition paths.
Where multipue paths are allowed the icon has been changed to refect this.
Reordered the list.
Corrected Hann (raised cosine) window function.
Corrected output-windowing logic and recalculated correction factor
for window type. Tested against white noise & triple_osc output.
removed the tick() function, and replaced the invoking code with
direct calls to update().
fixed a bug, where the low shelf bandwidth was getting the incorrect data.
This was done to increase performance when sample exactness
is not in use. This was a consern becasue of the 2 extra function
calls each frame introduced with SA.
Added a new button to the action bar, using step_btn_duplicate.png
The new button, aswell as adding a bar to the patten, then
copies the first bar to the last.
fixes#457
BBEditor Duplicate Pattern. updated image, changed function name
Have updated the new image step_button_duplicate.png
Renamed the function from duplicateFirstBarAtEnd to duplicateSteps.
BBEditor renamed function duplicateSteps
renamed duplicateSteps() to cloneSteps() as requested
BBEditor rechange duplicateSteps to cloneSteps
BB Editor changed actionBtn text from duplicate to clone
The cross hairs in the automation editor were incorrectly drawn
when moving another window infront.
This change only draws the cross hairs when the window has focus.
All the selected notes are changed by default for the 3 possible events:
- Mouse dragging the volume/pan meter
- Rolling the mouse wheel over the meter
- Double-clicking the meter
The user can still change each note individually by holding alt before
performing the desired action
Enabled the use of sample exactness on gain control.
After checking the m_bbfx_leftFX.getGain() function, It was found
that this functiomn only sets a member variable, and causes no other
over head, so decided that checking if the value had changed would take more
clock cycles, than the check to see if the value had changhed.
This fixes a bug introduced when removing double click from
BB patterns. It Now checks if we use fixedTCO's (bb tomb stones),
only disable double clikc if so, leaving it working correcly in the
song editor
The following controls have sample exact enabled
Filter 1 Cutoff
Filter 1 res
Filter 1 gain
Filter 2 Cutoff
Filter 2 res
Filter 2 Gain
Model.isValueChanged() does not eveluate when recieving sample accurate
so added checks to see if the cutoff and res needed to be recalculated,
The delay time paramter was responding very badly ui user input.
This now has a much more plesant sound, not dis simular to a
record being sped up or slowed down.
Added Sample exactness to the following parameters
Delay time
Regen
Lfo time
Lfo amount
Did not add this to the output gain contol, This model is used in
a dbScale, and a much more pleaseing result was gained by using an
amplifier plugin.
Also add LMMS_DATA_DIR env var to "data:" search paths.
When lmms is launched from its build directory (without `make install`ing),
LMMS_DATA_DIR can be passed to point lmms to the "data" directory in the
source tree.
This singleton class handles management of plugin search paths and plugin
discovery. Search paths are (if they exist):
* <lmms-exe-dir>/../lib/lmms: This is the common location on Unixoids
(Not included in Windows builds)
* <lmms-exe-dir>/plugins: For portable and Windows installations
* The path given by the compile define LMMS_PLUGIN_DIR
* Environment variable LMMS_PLUGIN_DIR if given
This commit also tweaks the build script to output built plugins to
"${CMAKE_BINARY_DIR}/plugins". This way lmms can find plugins during
development without the need to use `make install`.
Plugin::getDescriptorsOfAvailPlugins and ConfigManager::pluginDir were
removed.
Selected notes: when resized would offset posterior, non-selected notes
to mantain some kind of melodic structure. This is referred to
as *sticky* behaviour.
It also assumes some kind of intention that may not be the case.
Also adds complexity to a simple feature.
This commit makes only the the selected notes be offset. It also adds a
new shortcut to the old behaviour <Shift-Ctrl-drag to the note tip>.
Fixes#1666
Remove Commented Out Code
Update DataFile.cpp
Update DataFile.cpp
Update DataFile.cpp
Changes per tresf's advice, adds comments
Git???
Please work :/
Update DataFile.cpp
Adds dialog when project is opened that was made with a different version of LMMS
Remove Commented Out Code
Update DataFile.cpp
Update DataFile.cpp
Update DataFile.cpp
Changes per tresf's advice, adds comments
Git???
Please work :/
Update DataFile.cpp
This commit addresses a lot of issues, namely:
1. When the "Move left/right" action was selected on a mixer channel
menu sometimes it would segfault due to the fxline object being
deleted before it returned to a method inside itself
2. The Fader was declaring a new variable for the model whereas it
should used the inherited model from FloatModelView < AutomatableModelView
3. Some methods were doing more things than they should be and
performing unnecessary actions. A little cleanup/refactor was made
Please notice that a bug of the same class as the one referred at point 1
still exists: clicking on "Remove channel". This commit does not
addresses this issue.
Fixes#1584
analyser now disabled when not in view.
band vu meters now disable when analyser is disabled.
display nema changed to Equalizer.
set sample rate before frequency on LinkWitzRiley filters.
Grouped the setting of filterparameters into one function, and calc coefficent
once if needed.
Made suitable function inline.
in and out vu meters now using both stereo channels
When maximizing a subwindow it remembers the title the mainwindow had before and resets it after unmaximizing/closing.
As the title might have changed due to a project switch, we have to reset the title again as it would else show an incorrect/old title.
New file: Delay.h - contains some simple delay effects for use in DSP - perhaps for designing reverbs or similar. All are in double precision because why not.
Fixes the following two errors I spotted using valgrind:
When deleting a channel;
==936== Invalid read of size 8
==936== at 0x56FA1D: FxMixerView::deleteChannel(int) (FxMixerView.cpp:374)
==936== by 0x60E9A79: QMetaObject::activate(QObject*, QMetaObject const*, int, void**) (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.6)
==936== by 0x5216BF1: QAction::triggered(bool) (in /usr/lib/x86_64-linux-gnu/libQtGui.so.4.8.6)
==936== by 0x52185C2: QAction::activate(QAction::ActionEvent) (in /usr/lib/x86_64-linux-gnu/libQtGui.so.4.8.6)
==936== Address 0x14d51b90 is 32 bytes inside a block of size 40 free'd
==936== at 0x4C2C2E0: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==936== by 0x56F9ED: FxMixerView::deleteChannel(int) (FxMixerView.cpp:370)
==936== by 0x60E9A79: QMetaObject::activate(QObject*, QMetaObject const*, int, void**) (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.6)
==936== by 0x5216BF1: QAction::triggered(bool) (in /usr/lib/x86_64-linux-gnu/libQtGui.so.4.8.6)
When loading a new project after adding some channels:
==936== Invalid read of size 8
==936== at 0x570785: FxMixerView::refreshDisplay() (FxMixerView.cpp:202)
==936== by 0x4B590E: Song::clearProject() (Song.cpp:740)
==936== by 0x4B7885: Song::createNewProject() (Song.cpp:817)
==936== by 0x60E9A79: QMetaObject::activate(QObject*, QMetaObject const*, int, void**) (in /usr/lib/x86_64-linux-gnu/libQtCore.so.4.8.6)
==936== Address 0x56a12ab0 is 32 bytes inside a block of size 40 free'd
==936== at 0x4C2C2E0: operator delete(void*) (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==936== by 0x57075B: FxMixerView::refreshDisplay() (FxMixerView.cpp:201)
==936== by 0x4B590E: Song::clearProject() (Song.cpp:740)
==936== by 0x4B7885: Song::createNewProject() (Song.cpp:817)
Constants:
- calculate all in long double so as to improve the accuracy of our pre-calculated constants
- add some possibly useful constants: reciprocal of pi, square of pi, and reciprocal of e
Math:
- new math convenience functions: absMax, absMin
The snare sounds like it would be used for marching. If you can make it
brighter without making it sound funny, please do...
The kick was too dark for general purpose. Shortened it, raised it in
the frequency range and added more noise.
The clap is nothing more than a dry clap. As of now there is a clap with
decay or something. I used two evenings to make the clap I wanted so I
figured other people maybe wanted a dry clap too. Of course it is
probably I who suck at adjusting knobs correctly, but I reckon there are
more of us. 😟
I probably didn't spend too much time on the kick, but as of now there
is only a trapkick in LMMS (kick with long delay), and though we agree
on that it is easy to make kicks in Kicker, it is even easier to use
existing presets and adjust a preexisting preset. So I missed a short
kick in LMMS, and so I made one.
I removed code in a previous commit that deleted ended samples since
that sometimes caused issues when the samples had loop points. However,
removing the code caused issues with the release samples. Thus, now it
removes ended samples only if they are release samples. Otherwise, the
keyup event and ADSR handle ending the note.
* Ctrl + Left/Right moves selected notes by one bar
(Old behaviour was to move the playnote)
Closes#811
* Shift + Up/Down moves selected nodes by one semitone
(Old behaviour was to ignore the Shift key and move the viewport)
Closes#810
* Ctrl + Left/Right moves selected notes by one bar
(Old behaviour was to move the playnote)
Closes#811
* Shift + Up/Down moves selected nodes by one semitone
(Old behaviour was to ignore the Shift key and move the viewport)
Closes#810
Fixes 20 warnings similar to the following ones when generating a translation file with e.g. "make de.ts":
/home/daniel/Lmms/src/tracks/AutomationTrack.cpp:40: Class 'AutomationTrack' lacks Q_OBJECT macro
/home/daniel/Lmms/src/core/FxMixer.cpp:41: Class 'FxRoute' lacks Q_OBJECT macro
/home/daniel/Lmms/src/core/FxMixer.cpp:554: Class 'FxMixer' lacks Q_OBJECT macro
/home/daniel/Lmms/src/gui/widgets/MeterDialog.cpp:52: Class 'MeterDialog' lacks Q_OBJECT macro
...
Fixes 20 warnings similar to the following ones when generating a translation file with e.g. "make de.ts":
/home/daniel/Lmms/src/tracks/AutomationTrack.cpp:40: Class 'AutomationTrack' lacks Q_OBJECT macro
/home/daniel/Lmms/src/core/FxMixer.cpp:41: Class 'FxRoute' lacks Q_OBJECT macro
/home/daniel/Lmms/src/core/FxMixer.cpp:554: Class 'FxMixer' lacks Q_OBJECT macro
/home/daniel/Lmms/src/gui/widgets/MeterDialog.cpp:52: Class 'MeterDialog' lacks Q_OBJECT macro
...
Previously if you release a C4 then all C4 notes would be released. Now
it stores the pointer to the plugin data which is unique for each key
press and determines which to release based on the matching pointers.
Now it'll honor the loop regions specified in the file and it'll
properly use the fine tuning for the samples if specified. Also,
modified the exponential decay code again since it was glitching at the
end of some notes for some reason.
Now if a Gig file provides a few samples per octave, it'll change the
pitch of the sample specified for a note instead of just assuming it is
the right pitch.
Also, fixed issue where if attack length was zero the note would never
sound.
Moving the code to detect the sample rates of the currently used samples
after the code deleting notes seemed to fix these glitches. Also, fixed a
few ADSR issues that could have resulted in clipping in the attack or
glitching after the release.
When providing extra frames, libsamplerate stores the extras internally
and outputs them in the next period. But, when it has enough internally
to output a whole period, it just outputs the internal buffer while not
using any more input frames. Now I provide some extra frames, check to
see how many frames we used actually used, and update the sample
positions and ADSR accordingly.
Now notes are added/removed by locking only a note mutex when pressing
or releasing a note. Then, while processing we actually find and play
the samples using libgig.
Now it supports a simple envelope using attack, decay1, sustain, and
release from the GIG file. I couldn't figure out what amplitude it
should go to after decay2 (if set), so currently that is unused.
It would segfault if you had notes being played and then switched the
instrument since the samples no longer exited. Now it'll delete all
notes when you switch GIG files.
Since libgig can't really be used in a multithreaded way unless it was
somewhat rewritten, just use a separate instance of the file for each
new GIG file regardless of if we already have one open in the current
file. Since it's fast now, you can easily have quite a few very large
GIG files open and still have low latency.
Also removed C++11 requirement since I no longer need a move
constructor.
Now, when you press a note, it won't have to load the entire sample into
memory before playing the note. This means that now you can play many
more notes without it glitching. Frequently, the entire note sample
isn't played, so before there was a lot of wasted processing time
converting the sample into float and doing sample rate conversions if
needed.
Also, perform sample rate conversion on the final rendered-out version
of all the combined notes for a period. This drastically decreases
processing time.
Note: currently having more than one instance causes glitching
Now it doesn't appear to segfault when multiple references to the same
instance try accessing samples at the same time. In libgig it said I
just have to create another decompression buffer for each thread. This
doesn't quite make the whole addNotes function thread safe since I still
hear missing notes. But, it's getting closer.
Previously if you created a second instance of a certain GIG file, it
would set the name to an empty string since it didn't create a new
instance, only increased a reference count. Though, it still seg faults
eventually when the reference count is greater than one.
Hopefully the separate mutex for playing the samples reduces the
glitching. Deleting notes after fading out instead of after the entire
sample finished playing (with many zeros after the fade out) will reduce
the number of notes playing at the same time which should allow for more
actually-heard notes to be played.
Also, moved delete note code from release function into the rendering
the notes to the output function. This seemed to fix notes occasionally
not being released.
This makes it sound better than before, so that pianos fade out like
expected and synths abruptly stop as intended. It's not the fully
implemented ADSR of the format, but it's better.
Support for 24-bit samples. It just so happens that the only GIG file I
have that is 24-bit also has the key changing dimension set, so I
implemented that so I could compare the output sound with that of Linux
Sampler. It still sounds different, brighter in LMMS. Not sure if that
has to do with gain, ADSR, or incorrect 24-bit decoding. I'm guessing
ADSR.
There were many crashing issues when playing notes when changing
patches/instruments. More locking, less crashing. However, this also
means that it is quite slow when playing a lot of notes with large
samples and converting sample rates. Linux Sampler amazingly can handle
36 or so keys being pressed at once whereas LMMS nowhere near that many
at the moment.
An initial implementation of playing release samples on key up. It seems
a bit messy at the moment. Wrote a move constructor since there's quite
a bit of passing around the gigNote class. Use attenuation so that notes
set their gain properly based on the information in the GIG file,
quite noticeable on some release samples.
Note that to support move constructors I enabled building the plugin
with the C++11 standard.
Fixed crashes when loading invalid file, but this required exceptions
since libgig throws exceptions, hence the changes to CMakeLists.txt.
If the sample rate is changed (e.g. on exporting at 48k when the samples
are at 44.1k), when playing the note convert each note individually to
the correct sample rate instead of converting the output from the notes
to the correct sample rate.
Save the instrument so we don't have to search the entire GIG file every
time we play a note. This should make it work better on computers that
don't have tons of RAM.
Currently there is a 0.5 second fade out time when the note is released.
I still have to implement the release-triggered samples.
It currently loads 16-bit mono and stereo GIG files. It plays the whole
note (no attack/delay/release), doesn't resample when exporting as a
different sample rate, and it doesn't do anything different based on
velocity.
Add treshold knob to peak controller
This causes the peak controller to react only when the measured peaks are above the set treshold
Might be useful for finetuning your sidechains
Samplebuffer: reload all samples when samplerate changes. This is because of the way LMMS uses samples: we always resample all samples t$
LadspaEffect: some safeguards for the non-inplacebroken plugins which use the same buffer for input and output. Theoretically, if some p$
FxMixer: fix effect processing in multichannel-chains
Avoid crashes caused by worker threads accessing the buffer manager
before it is initialized. Therefore initialize it from within the
Mixer constructor which has the side effect that it gets initialized
in console-only rendering mode as well.
Well, this commit got a bit out of hand, what with 26 files changed. Oh well.
Basically, we're using the buffermanager to dispense temporary buffers for playhandles and audioports to use.
This allows us to change the way playhandles work. Earlier, playhandles of the same track were waiting in line
to push their output to the audioport. This was of course inefficient, so now they just register themselves to the port,
then the port handles mixing the buffers.
Caveat: this is still a work in progress, the vol/pan knobs on instruments are temporarily non-functional - will be fixed in
the next commit, but I have to get some sleep now.
I don't think we currently have any that would support this functionality, but in case someone has a LADSPA plugin that has audiorate control ports, this allows them to be used with the new sample-exact models
Again... not strictly related to memory management, but since I was in that part of the codebase already...
- QHash is better to use than QMap in MemoryManager: faster lookups, able to reserve memory in advance
- Also: reserve memory in advance for the QVector and QHash, so we don't get needles allocs for them
- No need to do cleanup for the nph manager, as it uses the generic manager for allocs, and that already gets cleaned up
The constructor was probably the wrong place to put it, run() is definitely executed in the new thread so that's where the setting should be applied I think?
Fixes the following 26 errors when generating a translation file with e.g. "make de.ts":
/home/daniel/Lmms/plugins/monstro/Monstro.h:69: tr() cannot be called without context
/home/daniel/Lmms/plugins/monstro/Monstro.h:70: tr() cannot be called without context
...
/home/daniel/Lmms/plugins/monstro/Monstro.h:96: tr() cannot be called without context
/home/daniel/Lmms/plugins/monstro/Monstro.h:97: tr() cannot be called without context
When generating a translation file with e.g. "make de.ts" more than 150 warnings like the following appeared.
/home/daniel/Lmms/src/tracks/Pattern.cpp:642: Qualifying with unknown namespace/class ::PatternView
/home/daniel/Lmms/src/tracks/Pattern.cpp:701: Qualifying with unknown namespace/class ::PatternView
/home/daniel/Lmms/src/tracks/AutomationTrack.cpp:40: Qualifying with unknown namespace/class ::AutomationTrack
...
corrected the typeo's,
Used sampleFrame instead of float* making the code cleaner.
Set up a socket to change the samplerate where required.
Stopped using malloc ( yeah that was bad practice on my part ).
Now using lmms_Math.h and the predefined versions of F_PI and F_2PI,
I didn't know data from the knobs etc. was not updated over the course of a buffer, so have moved outside the processing loop,
made appropriate functions inline,
used sinf.
Multiplication has replaced division where possible,
zeroing of the buffer has been removed, as redundant.
Use dynamic building of jobqueues with dependency counting:
- At the start, each channel that has no dependencies is added automatically to the queue
- Then, after each channel is processed, it increments the dep.counter of all its recipients
- When a channel's dep.counter hits the amount of its dependencies (senders), it gets automatically added to the queue
- The queue is finished when the master channel has been processed
- Muted channels are automatically processed at the start regardless dependencies, because they don't have to care about senders, being muted
Hopefully this will improve Fx Mixer performance.
Fix typo made in 2e7733eaa1 while renaming
occurances of "mmp" to "datafile". This lead to a mismatch in the file name
used for saving and reading the recovery file.
Addresses #722
Adds a state-variant 4-pole lowpass filter into LMMS, which I swiped from Nekobee and slightly adapted to work in LMMS
It is possible that with some adjustments a highpass version could also be produced (will have to look into that)
It sounds really cool, kind of like the moog filter but has more character, esp. on high Q values
Introduce one central signal in the pattern class which is emitted before
the pattern object is being destroyed. This way we can easily and more
reliably hide this pattern in the PianoRoll without any race conditions
or other glitches.
Closes#1089.
LB302:
-AcidLead
-AngryLead
-DroneArp
Organic:
-Pwnage
-Rubberband
SID:
-Bass
-CheesyGuitar
-Lead
-MadMind
-Overdrive
-Pad
No presets of any kind were removed or otherwise changed.
Not likely to be an issue currently, but if(when) we at some point allow >44.1k samplerates for playback, we may run in a situation where we have to downsample audio for processing, and thus we'd be doing heap allocation every period - it's best to fix this in advance so we're using stack for it for now (may be replaced with memory management later though)
Skipped the chinese translation files because of merge conflict, those should be re-submitted for master
Conflicts:
data/locale/zh.qm
data/locale/zh.ts
Always save projects and presets with default C locale in order to avoid
problems in the future. At the same time properly load floating point
strings which have been saved with different locale settings.
Closes#1051.
In order to address issues with differently coded floating points in
strings provide a helper class which can be instantiated when loading
or saving data.
Got rid of all but 2 of the songs in OldStuff.
Kept Skeissi-RandomProject12345 because it's cool.
Kept TobyDox-Psycho because it was the first song made in LMMS.
LMMS now properly builds and runs with Qt5. Various deprecated functions
had to be replaced like QString::toAscii()/fromAscii(). Also occurences
of FALSE/TRUE have been replaced with false/true.
LmmsStyle now derives from QProxyStyle and sets a style instance as base
style (Plastique for Qt4, Fusion for Qt5).
MOC files are not included anymore but added as regular source files.
What's missing is support for embedding VST plugins into a subwindow
inside LMMS on Linux/X11 due to missing QX11EmbedContainer class in Qt5.
Build instructions can be found in INSTALL.Qt5
Minimum version requirement for Qt4 has been raised to 4.6.0 for best
API compatibility between Qt4 and Qt5.
Rewrote handling of modulators so that we don't have to allocate extra buffers for every note - should improve performance and make cpu usage more consistent
Wasn't getting saved/loaded properly, fixed that
TODO: disable autoquit causes some effects to keep running even when the song is stopped... this should be addressed at some point
- Stop pointlessly reloading the sample everytime the amp knob is changed
- Also draw the amplitude of the waveform correctly (used to be it was drawn as 2x too "quiet")
- Tracks copied from song->bb will no longer be unusable
- Since doing this required creating a "delete TCOs from track" function, I also added the option to trackops menu to clear a track
Fix#757
Imported current head of LMMS-specific ZynAddSubFX source code.
The current code is based on version 2.4.4 of ZynAddSubFX.
HEAD: 9a993c4936ce987bb30f93eee2a573466ece3712
This saves CPU on certain instruments, like Monstro.
There's no point in running the note beyond the end of the volume envelope, ever, so let's not do that.
Fixing a bit of a silly error made by me, all control changes on my effect plugins were flagging the project as modified, which is annoying with automations etc. So I'm disabling it. Maybe later we can have flagging only when knobs are modified manually.
I'm not saying sample-accurate, because it turns out, Fluidsynth has an internal buffer size and thus timing granularity of 64 frames. So 64 frames is the max. accuracy attainable for SF2. But it's better than nothing. Big thanks to David Henningsson of the Fluidsynth dev team, who very helpfully answered questions. A great guy.
In addition, there are some fixes to earlier commits here, which I ran into while working on the SF2 timing.
Recent builds of MinGW64 runtime include the winpthreads library which
is not linked statically anymore and thus doesn't required non-portable
(de-)initialization function calls.
- Remove the redundant hasSampleExactData() function. Instead, signal lack of s.ex.data by returning a NULL in valueBuffer()
- Cache s.ex.buffers and only update them once per period
- Make valueBuffer() in AutomatableModel threadsafe so that it can be used for NPH's sharing the same model
- Add sample-exactness to instrumenttrack's vol & pan knobs
Change in handling of frameoffset for multistreamed instruments and sampletracks.
- Instead of holding the offset for the lifetime of the playhandle, negate the offset in the first period
- Multistream-instruments require some small changes: they have to now check for the offset and accordingly leave empty space in the start of the period (already done in this commit)
- There are possibly optimizations that can be done later
- This change is necessary so that we can have sample-exact models, and sample-exact vol/pan knobs for all instruments. Earlier multistream instruments were always rendering some frames ahead-of-time, so applying sample-exact data for them would have been impossible, since we don't have the future-values yet...
For both RC12 and RC24 filter types: handle lowpass separately, because we can then calculate highpass & bandpass with less operations.
This shouldn't affect the performance of lowpass, but probably will make highpass and bandpass a bit faster.
Changing the velocity after noteon doesn't really seem to work on fluidsynth (may be dependent on soundfont file) - seems like the panning changes when velocity is changed.
So I disabled that, after which everything works fine.
Fixes#865. Added a check so we don't add subnotes to a note that is already released (can happen with very short midinotes, eg. sliding the mouse accross the gui piano).
I also added a mutex to incoming midievent handling in instrumenttrack. Not sure if strictly necessary, but seems like this would prevent problems in the long run.
Also fixed a glitch in noteplayhandle where silent master notes got stuck playing indefinitely ( isMasternote() returns true even if the nph just hadChildren, so it never gets ended if it did - instead we check if we still have subnotes).
Changing the velocity after noteon doesn't really seem to work on fluidsynth (may be dependent on soundfont file) - seems like the panning changes when velocity is changed.
So I disabled that, after which everything works fine.
There's no need to ever link a model to itself, allowing it can cause weird issues and crashes, plus it's easy to do by accident if you start a ctrl-drag and end it while still on the same widget
Apparently, we can use QBrush -typed properties in the CSS. This just never occured to me before!
So, this has several benefits. A QColor property only allows a singular RGB value, but a QBrush allows the same plus also qgradients, RGBA-colours and maybe even bitmap patterns. So I'm changing some properties to QBrush, where it makes sense to allow this additional functionality - no need to enable it for simple things like text colours or such.
- Song editor background: instead of the earlier hack with 7 qproperties just to set a limited background gradient, we can use only 2 properties and allow much more flexibility with Qt's own qgradient syntax
- Automation editor: background, graph colour, and the sidebar colour - @musikBear recently complained not seeing the grid through the graph, so transparency can help there, and qlineargradients in the graph can produce very cool visual effects. Grid is pointless to change, it should stay single-colour for now.
- Piano roll: here, I only made the background use QBrush - we don't really have much else here that can utilize QBrush, the notes have their own gradient system... maybe the 2nd colour of the note gradient could be customizable though.
There are probably more places where this change makes sense...
Issue: Currently, we use threads to process all PlayHandles, so there's no guarantee of the order they are processed in. This causes timing inaccuracy and jitter: notes of instruments that use both NPH's and IPH's can get randomly delayed by one entire period.
The issue is solved thusly:
- When processing an IPH, we check if the instrument is midi-based. If yes, we just process it normally (no NPH's to worry about).
- If it's not, then it also uses NPH's, so we'll have the IPH wait until all NPH's belonging to same instrument have been processed. There's some similar code in the new FX mixer, I pretty much just copied how we do it there.
- This allows defining a default colour for BB-track patterns in the CSS
- The default colour is used for all bb-patterns which don't have a custom colour set by the user: in other words, the colour of a pattern can be any rgb-value OR "style colour"
- By default, all created bb-patterns use the style colour
- You can also reset colourized patterns to use style colour again
- Backwards compatibility: old projects will be loaded so that any pattern using either of the old default colours will be converted to use style colour
TODO: add a settings option that can disable custom colours (ie. always use style colour), and/or an option to reset all patterns in a project to style colour. This is needed, since themes can now change the song editor background, which can lead to unfortunate colour combinations with custom colours...
Implements a ring buffer class for LMMS, which is designed to be flexible, efficient and thread-safe.
Due to flexible design, it supports various methods of operation:
- set delays/sizes in absolute frame values, ignoring samplerate
- set delays/sizes in milliseconds with samplerate-awareness
- multiple inputs -> single output
- single input -> multiple outputs
Efficiency is achieved by working in buffers and using memcpy/memset for audio operations, except when additive mixing is needed: then MixHelpers are used
Thread-safety is guaranteed with QMutex
- currently only affects Vestige
- no idea whether this can also be used for Zyn and OpulenZ, I'm not sure if Zyn has any kind of mechanism for communicating frame offset to the synth, as for OpulenZ, @softrabbit would know the answer better
- basically, I made it happen by simply adding an extra parameter in the processMidi{In|Out} functions, which is 0 by default, and made the necessary changes in instrumentTrack and nph to utilize it
- I based this against 1.1 because I didn't think it's a very big change, and I don't see much possibility for things going wrong here, since we're basically just using the existing functionality in Vestige (there already was a frame offset being communicated to the remote plugin, just that it was always set to 0). However, if @tobydox thinks this is better to bump up to 1.2, I can rebase it for master...
- ctrl+alt+wheel changes q (as in auto)
- ctrl+shift+wheel changes note length
- changed note lock functionality slightly, it no longer changes itself to 1/16 because this would cause annoying infinite scrolling with the wheel, instead it just acts like 1/16 when notelength is last note
- entire wheelevent code was written very... weirdly, I simplified it
- fix bug with x zoom with mousewheel, no more getting stuck between 25/50
- ctrl+shift+mousewheel now zooms y-axis
- ctrl+alt+mousewheel now changes quantization
Also featuring a very efficient buffer-based system for transporting sample-exact control data
Also interpolation for automations
The native Amplifier is a reference implementation for taking advantage of sample-exact data and is currently
the only one that does so, it can be used to test things out, and as documentation/example for implementing the
same elsewhere
Basically, this works as such:
- if you click shift *after* starting a note move OR after creating a new note, the note move action is switched into resize mode, so you can quickly resize the note you just created, or the note you just moved. This saves time and improves workflow - at least based on my own experience: I've always wished I could do this, this is a huge time saving when you want to quickly jot down notes of differing lengths.
- if shift is already pressed when you click, the above will not happen, because that would mess with the note copy function. Copying notes with shift-dragging works the same as before.
- note test playback is halted when you click shift while moving. This is purely because it was causing some crackling noise, probably because of the changing length of a note that is currently playing. Maybe that can be fixed later, although it's arguably better not to hear the note while resizing - it's consistent with the other resize.
- works on group of notes as well, if you start moving a group of notes and then click shift, it will go into resize. Exception is notes copied with shift-drag... for obvious reasons.
- that should be all. Testing appreciated.
As of 6650dd356d base notes are not played
anymore when chords are enabled. Therefore create a separate NotePlayHandle
for the base note like we do for all other notes in the chord.
We don't want to loose the settings of an effect plugin even if it's not
available and thus can't be instantiated. Therefore remember original
settings data and save them back properly.
Partly closes#733.
Aka. 5-chord, simple 5th interval chord. A very simple addition and something I've always wondered why it's missing from the very extensive huge list of chords and scales.
Since we now provide the wavetables as pre-generated files, there's no delay caused by their initialization
so we can move it to the startup of the software. I thought engine.cpp is the best place for this, it makes
conceptually more sense than main.cpp IMO.
This way each instrument that wants to use them in the future won't have to call the initialization function
separately, making things a bit easier.
- Envelope length is now temposyncable and has higher maximum
- Distortion is divided to start/end knobs for a simple distortion envelope
- Everything backwards compatible
These methods are used to fetch the automated value of a model at a given MidiTime
These are still untested but that shouldn't be a problem since they aren't actually used by anything yet... but I'll be doing some testing and bugfixing (if needed) for them later.
These will be an important step in making sampletracks eventually be reliably playable from any position, and more generically, being able to reliably convert MidiTime to real time. Of course they can be useful for other things too (not sure what though, yet).
The "MACOSX_BUNDLE..." declarations must occur before
ADD_SUBDIRECTORY(plugins) in order for the child CMake to inherit the
properties from the parent.
This is needed for scripts/create_apple_dmg.sh to inherit
"MACOS_BUNDLE_BUNDLE_VERSION", etc.
q_sort is an inline function which recurses upon itself. Some compilers such as MSVC limit this which can be overridden with a parameter. Since I could find no such parameter for clang, this #IFDEF allows the sifter plugin to compile successfully.
If this approach has negative side effects, it should only affect apple. If there's a better approach to this, please reject the pull request and submit your own.
Instead of relying on naming the init functions _init() and _fini()
declare them as constructors/destructors and use a different name so
there's no double destruction
Closes#668.
- Uses existing functionality in FxMixer & FxMixerView to manipulate channels
- Instruments sending to the manipulated channels get automatically updated
- In the future I hope to implement a drag/drop functionality instead of the clunky context menu but this is a good first step until then
- Also added in a little QWhatsThis help message for the FX line, also accessible from context menu
That lmms_math thing got mixed in accidentally, but it's also a good change: always include math.h in lmms_math - that way, other parts of the software can just #include lmms_math, and won't have to #include both math.h and lmms_math, also the yet unused sinc function in it seems to need it so this prevents problems down the line
When loading some presets the PADnoteParameters spectrum size is 524288
or even bigger resulting in a stack allocation of 2 MB or more.
This results in a stack overflow on Win32 and thus crashes LMMS. Fix this
by allocating the spectrum on the heap instead.
Closes#543.
Despite of the previously introduced sanitizing it still sometimes happens
that an end frame variable is not greater than the corresponding start
frame variable. Make sure we don't crash by adding more sanity checks in
getSampleFragment().
Closes#629.
An end frame variable always has to be greater than a start frame in
order to prevent crashes due to negative frame counts being calculated
in getSampleFragment() otherwise.
Closes#629.
In order to get a uniform behaviour when starting with a new project or
opening another project, reset volume and panning of last edited note so
new placed notes have default volume and panning.
Closes#644.
The detuning scale was incorrectly calculated: instead of measuring in cents as it claims to, it was actually
in 1/100th octaves, so I fixed it so that I set the units to actual cents (1/100 seminote). Then I set the
range to +/-1200 cents and added compat code so that old values get multiplied by 12, to maintain backwards compat.
The runtime-generation is still there as a fallback, and the file generation code is left in as commented-out, because
it might be needed in the future
There was some memory alignment logic inside the Mixer cpp file. To break down
the code and separate things into smaller modules, the aligned memory stuff
was crammed into a new class called MemoryHelper.
The MemoryHelper can be reused for any other aligned memory that may be needed
by another component.
Samplebuffer: use qualitysettings for interpolation (currently defaults to SINC_FASTEST on playback), also: in visualize, draw both channels instead of averaging them into one graph (otherwise, samplebuffers with counter-phase content show up as flatline)
Also, some codepath optimization: add a method to SampleBuffer for setting all loop/start/endpoints at once, so we don't have to wait for mutex unlocks 4 times in a row. Then make AFP utilize this method.
Instead of having various flags for realizing the arpeggion functionality
use a more generic approach here using the recently introduced "origin"
property.
When using value from linked model, make sure to fit it into own range
as otherwise this can cause out-of-boundary accesses e.g. in ComboBoxModel.
Closes#505.
This does not work well if you open an instrument window of a single
streamed instrument, close it afterwards and open an instrument window
of a regular instrument due to widget caching/reuse. We therefore have
to find a better solution which allows dynamically showing/hiding tabs
in the TabWidget class. Until then restore the previous behaviour.
This reverts commit ed29f2b6f6.
All classes inheriting from SerializingObject should also provide
according functionality, therefore ensure, they implement methods for
loading and saving settings.
The engine class as the component instance manager is the wrong place to
control the play/pause buttons. Instead emit a signal in the Song class
and update the buttons in a slot in MainWindow. This fixes problems with
GUI/pixmap operations happening outside the GUI thread when exporting a
project.
Closes#435.
In order to keep compatibility with projects created with LMMS < 1.0.0
we maintain a property specifying the base velocity (i.e. the velocity
sent to MIDI-based instruments at volume=100%). For new projects this
always will be 64 while compat code enforces a value of 127 for old
projects.
We can also think about hiding the new groupbox in order to hide
complexity from the user.
Closes#430.
As we have a special semantic for automation pattern playback (i.e. we
don't playback the pattern itself but its container component like
Song Editor, Piano Roll etc.).
Closes#292.
This is a partial revert of 2e799718d6.
As playing test notes generate MIDI events as well, they get recorded
like any other notes resulting in undesired behaviour.
Closes#368.
There'll be more and more flags for instruments. Handling them using
virtual and overloaded getter functions doesn't scale well and adds
unneccessary overhead.
Instead of cluttering parent's attribute list, we created a dedicated
DOM element for each LadspaControl. This gives us the possibility to
save further information later.
Closes#401.
When opening the ZynAddSubFX GUI the buffer size information was not
retrieved properly and caused problems when setting a low global buffer
size in LMMS. We update the buffer size in ZynAddSubFX manually now as
as a temporary workaround until the VST synchronization feature gets
stripped out of the RemotePluginClient class.
Closes#335.
Even though ZynAddSubFX does not support updating its pitch wheel range
via MIDI events we can set it manually using provided internal functions.
Closes#394.
Fixes#386.
When selecting the filter in the file save dialog, the file name used to change to *.mmp. As this is not desired, this commit changes it to '.mmpz'.
Instead of emitting InstrumentTrack::midiNoteOff() in destructor of
NotePlayHandle do this where it actually happens -> noteOff().
Fixes length of recorded notes when there's e.g. a long release.
Closes#378.
Sort plugin names and make sure that effects without sub plugins (i.e.
native LMMS effects) are listed first in order to better advertise our
cool plugins.
Closes#331.
Due to the nature of DLL files LADSPA plugins need a little extra care
when building for Win32, otherwise they can't be instantiated and won't
be available.
Closes#356.
So, we were swapping out some pointer mid-process at times. Instead,
use an atomic pointer, and just have the process function grab the
current value and use it through the entire processing period.
Still has a sound glitch when switching, but this switch was never
intended to be used "live".
Closes#353
Since addition of automation, controllers etc. the freeze functionality
has been rather broken and thus adds no value anymore. In order to not
confuse users with broken functionality, remove it at all.
Closes#345.
On Windows the working directory is not set to the installation directory
when launching LMMS by opening an associated project file. Because of this
the RemotePlugin programs can't be launched as the required DLL files are
missing.
Closes#351.
Mallets: artwork update by Bill Y.
New knob: knob_vintage32, currently only used in Mallets, can be used for other things in the future (maybe if we get some more vintage-style synths/effects?)
Graph widget: added new drawing mode (bar style graph) for future use, currently unused anywhere, have plans
The volume of an InstrumentTrack is applied separately when post-processing
the audio buffer and is not related to MIDI processing. It therefore should
not be included into MIDI velocity calculation.
Closes#301.
For some reason roundf() causes an exception on Win32 when calling with
negative values. This caused LMMS to crash when turning an external MIDI
pitch wheel downwards.
Closes#281.
As FLTK 1.3 is available in all recent Linux distributions as well as
our MinGW-X PPA there's no need to maintain a copy of the FLTK source
code inside LMMS.
As of commit 1266278229 silent buffers
from InstrumentPlayHandle-driven instruments are ignored. This is a good
thing but can beak PeakController instances attached to e.g. ZynAddSubFX.
Fixes playback of unfa-Spoken.mmpz.
InstrumentPlayHandle-driven instruments (i.e. instruments producing only
one sound stream for all notes) are running all the time even if no notes
are running. The plugin itself usually does not consume much CPU time
while silent but all effects afterwards inside LMMS unneccessarily
consume lots of CPU time for processing silent buffer.
Typical case: a song with lots of instruments like ZynAddSubFX.
With this change, all processing is skipped on silent buffers which
notably decreases CPU load for many projects. All effects in following
effect chains continue to run until they're silent as well.
Closes#267.
Use the extra information to determine whether we need to process input
at all if plugin is not running anymore.
In FX mixer we now omit starting effects if no data has been mixed to
a certain FX channel. Instead let effects running until they finished.
First of multiple fixes for #267.
Back in time we obviously didn't manage to get construction dependencies
sorted so we needed to mess with the pointer to the SongEditor instance in
the engine class.
Thanks to Alexandre Almeida for pointing out this issue.
Closes#261.
As the pitch range model defines the range of the pitch model we have
to load it first so the range of m_pitchModel gets adjusted accordingly.
Closes#272.
There's no need to transpose MIDI events inside a MidiPort instance. Any
correction to the outer world should (if at all) happen in the according
MIDI backends.
Closes#242.
As of commit c60e7ba8d1 the whole playback
control has been revised. As this was an old patch, it didn't take care
of the VST sync functionality. This is fixed now for the most part.
Closes#184.
Commit 3a53473d10 aimed at allowing users
without a middle mouse button (like on touchpads) to move the left loop
point. However nothing stops us from keeping the old behaviour as well,
so here we go!
Next big coding style update - this time all PlayHandle classes are
affected. Functions like done() and released() were renamed to
isFinished() and isReleased().
Global initialization happens via a global startup/shutdown handler
instance. For some reason this does not work properly when building
a DLL file, therefore create this startup/shutdown handler instance
as a static variable in ladspa_descriptor().
Furthermore marked ladspa_descriptor as extern-C.
Even though there are probably not many old projects out there, at least
old presets didn't load properly anymore as of ad27039b9b.
Fix this by reintroducing compat code.
If a note is played via MIDI (e.g. with infinite frame count) and arpeggio
is enabled the NotePlayHandle never got deleted as framesLeft() always
returned a big value even after release.
Closes#169.
We must not record notes when receiving external MidiNoteOff events
as e.g. the sustain pedal still might be pressed. State tracking for
features like these is done inside NotePlayHandle so move the recording-
related signal emission from InstrumentTrack to NotePlayHandle.
Closes#168.
We should not need compat code for project files < 0.4.x anymore.
Anybody who wants to load project files made before 2008 is advised to
open them in LMMS 0.4.x first and save them so they get upgraded.
Even though ZynAddSubFX does not support pitch wheel sensitivity RPN
events and thus we can't update the pitch range from LMMS automatically,
at least default to 100 semitones pitch wheel bend range so behaviour
is consistent with default pitch range in LMMS.
When changing the pitch range all we can do for MIDI is to update the
MIDI pitch bend sensitivity RPN even though this is only supported by
some MIDI instruments.
Closes#129.
As undo/redo are not working properly at the moment, do not expose
according menu items to the user. This will be fixed in upcoming releases.
Closes#152.
If we receive MidiNoteOn, MidiNoteOff or MidiKeyPressure events we always
kind of handle them in processInEvent() so do not forward them to the
instrument.
This fixes a freeze when loading VST plugins as PianoView::focusOutEvent()
tried to send MIDI events to the not yet completely loaded and thus locked
VST plugin.
Closes#160.
Newer versions of GCC seem to assume an array size of 0 for arrays whose
size is not specified explicitely. This causes a warning about an
out-of-bounds array access.
There are situations where processOutEvent() is being called while
loading instrument track settings e.g. when loading the pitch model
whose dataChanged() signal is connected to InstrumentTrack::updatePitch()
which in turn calls processOutEvent(). At this time we do not have an
instrument instance and therefore have to skip processing.
Closes#164.
For some reason executing git shortlog in Qt Creator cmake project
import hangs. This is a workaround so that it is still possible to
use Qt Creator without changing the normal build, in which git shortlog
will certainly complete in 1 second.
As processInEvent() is responsible for starting/stopping notes, we do
not have to set the state of the piano. This is done in processOutEvents()
already.
The MIDI event handling in InstrumentTrack was complex and buggy. It has
been simplified now such that processInEvent() tries to handle note on,
note off and key pressure events. The actions taken should result in
equivalent calls to processOutEvent() by NotePlayHandle instances. The
processOutEvent() function sends according MIDI events to the attached
instruments. All unhandled MIDI events are directly forwarded to the
instrument in processInEvent().
It's possible that some corner-cases are not handled yet with the new code
and we have regressions now.
Furthermore renamed midiTime/midiEvent to MidiTime/MidiEvent to match
coding style.
Closes#72.
Arpeggiator got InstrumentFunctionArpeggio and ChordCreator got
InstrumentFunctionNoteStacking. All related views and instances have
been renamed for better consistency.
A file save dialog (inherits FileDialog) that provides buttons to
increment or decrement a version which is appended to the file name.
(e.g. "MyProject-01.mmpz")
Also removed all blocks similar to
```
#if QT_VERSION >= 0x040806
filedialog.setOption( QFileDialog::DontUseCustomDirectoryIcons );
#endif
```
as this now takes place in the new subclass's constructor.
Moving the left loop point is now possible using right click + shift
instead of the middle mouse button (which is difficult on laptops).
Furthermore some coding style improvements.
Closes#81.
In order to provide smooth muting functionality (i.e. immediate proper
sound when unmuting) always render audio buffers for MIDI-based
instruments. This is more important than potentially reduced CPU usage
while muted.
Closes#69.
When opening the Piano Roll for the first time and clicking on "A", you
would expect the same note that is previewed in the preview pane (A5),
but it is instead one octave lower (A4).
Fixed this by adusting INITIAL_START_KEY.
Closes#94.
This updates knobs to feel smoother and allow the user to have finer
control over the value of the knob by multiplying the mouse drag delta
by a smoothness factor.
Also since it is significantly easier to point the knob where you want
it, I removed the magnet effect. This can easily be put back in; try it
out and see what you think.
The FX chain background should look consistently and not change with
various numbers of inserted effects. Also IMHO we don't need extra
frames here. The drop shadow for the effects should be fixed as well.
Instead of creating a DetuningHelper instance for every note (which sums
up to thousands of AutomationPatterns) create them on-demand when opening
automation editor or loading settings.
There's no need to initialize an automation pattern with the value of the
model if it's default already. This fixes tons of dummy automation patterns
being saved for every note (as part of the note detuning feature).
In order to avoid data loss because of full disks or other storage
failures write a temporary file first, rename current file to backup
file and rename temporary file to current file.
Closes#26.
Now that we solved the problem with wrong default values in newly
introduced models when loading older projects we can safely implement
the new PeakController features.
This reverts commit 9cb52ccf0d.
When loading older projects where a particular model did not exist and
thus did not save any data do not load the possibly invalid default data
but reset to default value of model.
The new displayOffset property is an offset which is always added to the
value of model so we can display values in a user-friendly way if they
internally start at 0.
The change breaks existing projects that use PeakController (i.e. they
sound completely different which is not acceptable) as there's no sane
default value for the new amount multiply model (why do we need it at all
BTW instead of just advancing the range of the existing amount model?) and
the changed math results in calculation of completely different RMS values.
This reverts commit 5e8dbb6157.
When loading a project, instrument tracks usually are instantiated/loaded
before the FX mixer settings are loaded which results in an empty FX mixer
and thus 0 FX channels. The actual FX channel value for the instrument track
would be lost that way. Therefore set a big value which is being corrected
later by the FxMixerView for all instruments.
We lost short peaks because the display update rate usually is much lower
than the number of audio buffers processed per second which lead to lost
peaks. We mitigate this issue by caching the maximum peak value until the
next display update where it is reset.
Using FREETYPE_INCLUDE_DIRS turned out to break the build as it is a list consisting of two paths.
During configuring, the list is then concatenated to "path1 path2". This makes cmake to think of the second path as the directory to configure.
Fixed by manually concatenating the strings with a ";" character.
Revert changes of commit 17babf6abc as commit 26665dde55 was complete indeed regarding the FIND_PACKAGE statement.
Add REQUIRED statement to FIND_PACKAGE(Freetype)
Use FREETYPE_INCLUDE_DIRS instead of FREETYPE_INCLUDE_DIR_freetype2 or FREETYPE_INCLUDE_DIR_ft2build
There once have been huge efforts to implement FX send support in the
master branch. In order to make it available on a stable base here's
a backport which is non-trivial as there have been major rewrites of
the mixer's worker thread architecture.
There still seem to be bugs which we have to fix before merging into
stable branch.
Thanks to Andrew Kelley for the original work.
We only need to display numbers in LCD style, therefore use new LcdWidget
class instead of LcdSpinBox.
Fixes display problems introduced in commit f568a81c7a.
Thanks to Vesa for pointing out this issue.
Besides discrete automation it's now possible to setup interpolation
modes such as linear and cubic-hermite.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
There's no need for having each JournallingObject maintain it's own
checkpoints and build a complex (and buggy) logic in ProjectJournal
in order to manage all the JournallingObject with their checkpoints.
Instead do it the simple way: in ProjectJournal maintain a stack for
undo checkpoints and a stack for redo checkpoints. On each undo or redo
operation simply push and pop to/from the according stacks and save
and load states of the concerned JournallingObject.
This basically strips most functionality from JournallingObject. All
what's left is the management of its ID which unluckily is still
required in order to properly implement undo/redo of additions and
removals of JournallingObject.
Recording single changes of objects or their specific properties is
completely superfluous as we have full implemented state tracking in all
objects already. Therefore use SerializingObject::saveState() and
SerializingObject::restoreState() in order to implement the undo/redo
functionality.
This is just an initial commit and needs some further work (especially
regarding stability). However even things like undo/redo of
addition/removal of Tracks and TrackContentObjects do work already.
Path to VST plugin will be stored as relative, if plugin is opened
from default VST plugin path. Should remain compatible with project saves
from old releases or vice versa.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
We now also maintain information about playback time in order to display
it later.
Most of the code provided by Rubén Ibarra Pastor <pastorrub/at/msn/dot/com>.
Further improvements by Raine M. Ekman <raine/at/iki/dot/fi>.
The ALSA sequencer interface is not reentrant and thus we can't queue
MIDI events for output from different threads (which happens with multicore
rendering as processOutEvent() is being called by individual note play
handles). We therefore have to care that we don't call the ALSA sequencer
functions concurrently.
Thanks to Benjamin Kusch for providing a testcase.
Closes#531.
As controller connections are not fully restored via
AutomatableModel::loadSettings(), a call to
ControllerConnection::finalizeConnections() is neccessary to do so.
Normally this function is called at the end when loading a project but
when the user just toggles ZASF's UI settings are saved/loaded without
finalizing connections which results in connected knobs which are not
reacting to the controller they are connected to.
Closes#544.
As libsndfile does not seem to have an UTF8-compatible implementation
on Windows we have to pass the filename as local 8 bit encoding in order
to make the file written properly.
Closes#530.
When attaching a control object to an AutomationPattern initialize the
value at position 0 with the current value of the control object.
This is similiar to the behaviour found in LMMS < 0.4.14 and has been
reintroduced as requested by some users.
Closes#535.
AudioFileProcessorWaveView::slideSampleByFrames() gets called before the
knobs are created and/or after they are destroyed if the sample is
reversed. Added checks for nonexistant knobs.
Closes Patch #41 and Bug #525.
In commit a3abcdb2e0 we introduced
multitimbral MIDI support. However the new code path causes the mixer
not being unlocked at exit and thus causes a freeze of LMMS.
Thanks to nuio for pointing out this issue and providing a patch.
Closes#532.
This is in addition to songs. Simply use multimediaProject. Don't
screw around with Song(). Also, needed to move creation of xml
preamble (processing instruction) due to duplicate entry when
doing a load/save.
Conflicts:
src/core/main.cpp
Possible endless loop if these two state variables are not intialized.
Now a line will have the origin of (0,0) if drawn (shift-click) without
previously clicking on a starting spot. Perhaps not the best fix, but
it works. And I think allowing this first line (instead of blocking it)
is better for the enabling the user to accidently discover the feature.
Conflicts:
src/gui/AutomationEditor.cpp
It seems 64bit builds for some reason have problems with VST Sync feature on,
workaround seems to be converting VST sync patch from double to floats,
which does work both with 32 and 64bit builds. Double precision
seems to produce odd numbers with 64bit build. (tested on VirtualBox Linux
Mint 14.1 64 bit OS)
(cherry picked from commit 011f87e6e60cccd16f3783e9c4885e03d95c1e56)
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
Folowing change should ensure VST effect is opened just once, once
loaded from project file.
Double opening seems to trace back to commit 184ddc4d1c
from 2006, when this VST effect save / load feature was introduced as new.
Anyway VST effect parameters seems to load corectly in
VstEffectControls::loadSettings, from project file even without double
VST effect opening.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
This patch will set plugin name (information which is not stored with lmms
project file) according plugin file, without *.dll, when is LMMS project
loaded from the file.
Future verion could maybe use PluginBrowser or EffectSellectDialog for the
same.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
This patch should bring VST to host synchronization for LMMS.
(e.g. for plugins like dBlue Glitch, TAL Filters).
Synchronization is done via shared memory, missing song time
positions are reccalculated and added to PPQ position sync values
(SHM - common input interface for sync of all VST plugins)
When deciding whether to forward a MIDI event directly to the instrument
plugin do not evaluate realOutputChannel() for the time being as it is
ranged from 0 to 15 and has no don't-care-state like the input channel.
This is a workaround - we need a better solution here.
In the special case that a MIDI event comes from a MIDI port, the
instrument is MIDI based (VST plugin, Sf2Player etc.) and the user did
not set dedicated MIDI output channel, directly forward the MIDI event
to the instrument plugin so properties such as MIDI channels are kept.
Based on patch by nuio <numa_shsk/at/mail/dot/goo/dot/ne/dot/jp>, 2013-01-20
This new property is going to signal whether a specific event comes from
a MIDI port is was generated internally.
Based on patch by nuio <numa_shsk/at/mail/dot/goo/dot/ne/dot/jp>, 2013-01-20
Master channel keeps freezing, when VST effects are placed directly
into Master channels FxChain, on slower computers.
Provided solution prolongs VST initialisation phase, by waiting on two extra messages,
which usually follows initialisation and are possibly not yet implemented well.
IdSampleRateInformation,
IdBufferSizeInformation
This seems to prevent Master channel freezes e.g. on VST effects like Tiny-Q.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
Various fixes improvements:
+ Added support for VST parameters control for windows.
+ New `Close` button for VST parameter controls.
+ Faster GUI for all instruments, effects-loading, not only VSTs,
and both one-instrument track window mode and normal window
mode should be supported.
+ Better integration for VST GUIs on Linux, e.g. plugin window
should not stay always on top of other windows.
+ VST GUI overlook should remain same with different wine setups
( except for whole virtual desktops emulations ).
+ VST effect control window merged with VST effect editor window
should be more easier to control.
+ Little corections at effectviews model updates of instrument
tracks effect chains.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
When sending MIDI events to the ZynAddSubFX engine do not statically
send them on channel 0 but on the MIDI channel which is set as output
MIDI channel of the instrument track. This adds some flexibility when
it comes to multipart ZynAddSubFX presets which are connected to
different MIDI channels.
A natural minor scale was missing which lead to some irritations about
the harmonic and melodic minor scales. Had to add the new scale at the
end of the chord table in order to not break existing projects and
presets in which simple chord table indices are saved.
Closes#3594824.
MIDI commands All Notes Off, All Sound Off and Omni/Mono/Poly mode will
now silence all playing notes, as they should.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
When using the multitrack export feature the output files always had
the extension ".wav", even if exported as OGG. This patch fixes this
issue.
Closes#3595157.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
In automation patterns there always had to be a value at position zero
which also had a special semantic concerning the initial values of
connected objects. However that logic was buggy and confusing.
I therefore completely removed the neccessity for a value at position
zero (automated value will be 0 until the first set point).
Up to now there was no possibility to remove song-global automation from
a control once created. Overcome this issue by adding an according action
in the context menu of all AutomatableModelView instances.
Window title for VSTi parameter controlling window should be set according to
actual track name, not from VST plugin name as its now, it is hard to get to know
which window belongs to where when same plugin is e.g. opened several times, so
with the same name. Now this is handled in paint event, but TBD whenever is
that track name changed. tbd, temporary solution.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
When you double-click on some knob to change its VST parameter value
manually, new dialog window now has same title as what was that knobs
name. (instead of "lmms" title string)
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
Filter to display only automated / all knobs (new button) on LMMS VST parametr control window.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
After project save/load unsaved VST control parameters in LMMS VST control wrapper are not set to zero now, but reloaded according plugins saved state.
No need to sync values manualy again, after project save, load.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
Only not automated values are synced from VST plugin, no need to sync already automated values.
Synced values are now not trackable with undo / redo, before all changes were tracked individualy,
but user could lose ability to undo easily changes before sync buton was pressed.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
Fixed destuctors for various types of VST automation panel removal.
Automated signals correct disconection on panel removal.
When you load new VST plugin in the place of old one, while automation
is already connected and active there, this should not result in LMMS crash
or reuse of that old automation connections and automation window destructor
should not leave zombie VST plugins on application exit.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
src/core/RemotePlugin.cpp @ RemotePlugin::process
Above function should be now more thread safe, but functionality remains.
This prevent lmms locks, when automation is connected to lmms VST plugin wrappers controler / knob on Linux.
On win32 build whenever is lmms wrapper parameter controler / knob amended.
plugins/vst_base/VstPlugin.cpp @ VstPlugin::setParam
plugins/vst_base/RemoteVstPlugin.cpp @ RemoteVstPlugin::processMessage
In above functions we dont wait for message confirmation when parameter setter function finish, and dont send such confirmations.
This workaround prevent locks on Linux, whenever there is automation connected and if you try to move with VST plugin
(not via lmms plugins wrapper, but with VSTs internal window) than it freezes, on win32 build it will freeze whenever you connect
automation and than if you move your mouse above this VST plugin window.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
Thanks to Tres Finocchiaro for pointing out this issue and many thanks
to Mike Choi for providing a helper script for automatically fixing
the preset files.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
Previously a boolean model would be dragged when Ctrl-Dragging on a
button belonging to a button group. This fix causes the integer-model
of the group to be dragged instead.
The original behavior would allow the user to toggle multiple values
simultaneously by using several automation tracks. Plus, I would think
this new behavior is more convenient.
git-svn-id: https://lmms.svn.sf.net/svnroot/lmms/trunk/lmms@1968 0778d3d1-df1d-0410-868b-ea421aaaa00d
Conflicts:
ChangeLog.old
src/gui/widgets/automatable_button.cpp
As reported by Mikobuntu on 2012-12-06 there's a problem when minimizing
the FX mixer window. The problem disappears when not setting a size
constraint on the mixer's MDI window.
The previous behaviour was very annoying because starting to drag the
knob almost always resulted in a value change. This has been changed
by a rewritten logic for mouse click and move behaviour.
Closes#3588157.
Use GCC's builtin atomic add/subtract operation for incrementing/
decrementing the recursive lock variable. This is needed to avoid race
conditions and is much faster than using mutexes etc.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
Not all plugins save current program in their chunk (or do not restore
it properly). We therefore have to save and restore the current program
manually.
Closes#3581879.
The code for managing programs/presets of RemotePlugin instances was
very confusing, mainly within the VstPlugin and RemoteVstPlugin class.
I therefore started to reorganize and rewrite functions.
This patch adds the option to remove the extra silence at the end,
so that the exported song can be seamlessly looped.
This is a backport of commit 8f1657164a.
Closes#3588890.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
We have to use the new semantics of the ProjectRenderer management when
exporting the whole project as one track as well. Otherwise the program
crashed as it tried to utilize the ProjectRenderer instance twice.
Due to various bug reports, I think we should turn off auto save per
default. Users who want this feature can turn it on explicitely (and
live with problems when they have big projects).
We have too many components in LMMS relying on FFTW3. Building LMMS
without them cripples LMMS' functionality substantially, so simply
make fftw3 a requirement.
Closes#3495736.
It came to me that having LMMS output one fixed note from a track could
be useful for controlling drum machines or something like that, so here's
a new spinbox for the MIDI tab.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
Here is the patchset for my multiple track export feature. It works now
the way I originally envisioned.
For example, after I export tracks on my little song, I see this in the
directory I created:
devin@devin-studio:~/lmms/projects/fff$ ls
0_Defaultpreset.wav 3_Defaultpreset.wav 6_csidSouwav.wav
1_Defaultpreset.wav 4_spacenoiseswavwav.wav 7_HHOPENwav.wav
2_Defaultpreset.wav 5_csidkickwav.wav 8_HHOPENwav.wav
Each instrument or sample track is exported individually, regardless of
whether in its own song track or playing as part of a BB track. The
name is taken from either the song track name or from the BB track name.
My goal was to get the tracks individually exported, so that I could
combine them with other tracks in Ardour.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
Here's one way to cram more stuff onto small screens, or otherwise help
reducing visual clutter: Allow tracks to be shift-dragged all the way
down to 8 px height.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
This patch includes:
* sampleBuffer::visualise(): add possibility to specified a range to visualize instead of the whole sample
* add sampleBuffer::sampleRate() and sampleBuffer::sampleLength() getters
* definition of AudioFileProcessorWaveView and AudioFileProcessorWaveView::knob classes for AudioFileProcessor plugin
* knob::getValue() specified “virtual” to allow redefinition in child class AudioFileProcessorWaveView::knob
* delete audioFileKnob class (made obsolete by AudioFileProcessorWaveView::knob)
* add audioFileProcessor::isPlaying() signal, which is emitted in audioFileProcessor::playNote
* change type of AudioFileProcessorView::m_startKnob and AudioFileProcessorView::m_endKnob (AudioFileProcessorWaveView::knob instead of audioFileKnob)
* replace AudioFileProcessorView::m_graph (QPixmap) by AudioFileProcessorView::m_waveView (AudioFileProcessorWaveView)
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
A break was missing in the function where MIDI events are generated from
raw MIDI data. This always has been broken as of commit d188056683
but was not observed as the code for all switch-cases has been identical.
The problem comes from AutomatableModel::m_initValue wich is not fitted
either in constructor or in setter. Idem for m_value in constructor, imo
this is not enough consistent.
I propose to:
- call fittedValue() in init value setter.
- always call setter to initialize current & init values.
Upstream commit 460642bfae534679b4094e6887714828c90d8172 removes LADSPA
support from CALF which definitely is not desired for LMMS. Therefore
simply revert it in our sources.
When building LMMS with recent stable versions of GCC it generates
wrong code for the implicit REALTYPE specialization of the template
method stringFrom<T>() (problem in std::stringstream implementation).
By writing a custom template specialization which uses sprintf() the
bug can be circumvented.
The RemoteVstPlugin process crashed for plugins with lots of presets
as there was an overflow of the presName buffer. Chosing a bigger buffer
size fixes the problem.
Additionally initialize len variable in loadChunkFromPresetFile().
Added an option to shrink the track buttons horizontally, mainly by
moving the track name into a tooltip.
Closes#3459241.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
By Mikobuntu:
I have created a patch ( tested on stable) that adds a metadata entry
"Software" with the value "LMMS (libsndfile-1.0.21)" I'm not quite sure
what calls in the libsndfile entry as my only field entered was LMMS,
but i guess it does no harm anyway to know ;)
Closes#3374272.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
If the settings for an AutomationPattern contain just one value at
position 0, this value was not loaded properly. Thanks to raine for
pointing out this issue and providing a patch.
Closes#3448562.
When freezing patterns the freezer hung forever as it checked for any
running play handles in order to render echoes etc. after the last note.
However if there are MIDI-based instruments such as LB302, ZASF,
Sf2Player etc. there will always be play handles (InstrumentPlayHandles)
in the mixer's play handle array. Therefore explicitely check for
remaining NotePlayHandles when freezing pattern. Furthermore added a
counter variable for safety reasons so rendering note tails will never
exceed 2000 buffer periods.
Thanks to Mikobuntu for reporting this issue!
Closes#3109262.
Note detuning did not work properly for patterns starting after the
first bar in the song editor. This has been fixed by introducing
additional information about parent's song-global offset to
NotePlayHandle objects.
Closes#3462555.
LMMS failed to build with recent versions of CMake if CMAKE_RC_COMPILER
was not set in MinGWCrossCompile.cmake. Furthermore PKG_CONFIG_FOUND
manually needs to be set to TRUE.
LMMS VST Support Layer has been greatly advanced as it now features
(automatable) VST controls as well as support for VST presets. This
still needs some work as it crashes with various plugins (e.g. z3ta+).
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
As ZynAddSubFX still uses the horrible approach of storing global
settings (such as the currently used samplerate) in global static
variables the Echo effect will crash when the samplerate is changed
for a previously loaded ZynAddSubFX instance.
As a quick fix the original samplerate used for instantiating and
accessing internal arrays (whose size depends on global samplerate
variable) is saved for each instance and used everywhere instead of
SAMPLE_RATE.
Fixes crash when exporting e.g. Saber-FinalStep.mmpz at a higher
samplerate than LMMS normally runs with.
Catch the case the model is empty in ComboBoxModel::currentText() and
return an empty string instead of crashing. Fixes crash with settings
dialog if no sound devices are accessible via PortAudio.
Even though there's no known code path for this event to happen we
should always make sure m_runningMidiNotes[x] does not become negative
as this might mess up future key events.
As libogg, libsndfile & friends do not seem to have an UTF8-compatible
implementation on Windows we have to pass the filename as local 8 bit
encoding in order to make the file being read properly.
Closes#2952858.
We must not use "recover.mmp" as regular filename after we recovered
the sesion from it as this causes following save cycles to go into
the recovery file. Instead load the recovery file via
song::createNewProjectFromTemplate() so the used will be asked for
a filename when saving the recovered project the first time.
Closes#3294122.
There has been a problem UTF-8 characters in the configuration file
since 2006 (!), as the length of the data to be written was mis-
calculated. We can omit the specification of the data length at all
when just passing a QByteArray object to QFile::write().
Fixes setup dialog appearing each start if one of the configured paths
in the setup dialog contains non-ASCII characters.
Closes#3348920, #3017409, #2812054.
Once I added the SWH LADSPA plugins I just added a small selection of
them in order to improve clarity. However lots of projects use SWH
LADSPA plugins that are not shipped with LMMS and thus can't be
played properly e.g. on Windows. Fix this by adding missing plugins
(except the analog and FM oscillators).
Most of the projects represented LMMS and it's capabilities from a few
years ago. Therefore removed most old projects and added fresh ones from
the sharing platform.
Also started to add licensing information about these files in each
project directory.
As the interface for the "AccessibleName" property might not be available
when Qt was built without accessibility support, use the "WindowTitle"
property instead where appropriate.
Closes#3300101.
We must not process the FX mixer if we notice that currently a pattern
is frozen. Furthermore renamed some state-reading messages of the
pattern class.
Closes#3316495.
Based on the patch by Thorsten Müller provided at #3307037, I continued
the work to display nice indicators for the peak value of the last 1500
ms.
Closes#3307037.
Added tooltips to show the actual value when moving the fader handle.
This works mostly like the same feature we already have for the volume
knobs. Depending on settings the value is shown in a range between
0% to 200% or -inf/-34dBV to 6.02 dBV. Again that's the same as for the
volume knob. Value range could be adjusted easily if necessary.
Closes#3305914.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
Testing the last two characters of the filename against "so" is
insufficient as this might cover e.g. ISO files as well. Therefore
explicitely check for ".so".
Thanks to Mikobuntu for the contribution.
Closes#3289932.
It's a very bad idea to autosave while playing as this causes severe
underrun problems. Therefore instead of autosaving, trigger a re-try
timer for 10 seconds.
Closes#3317776.
Now that we updated FLTK we also need to regenerate ZynAddSubFX'
UI source code files using recent Fluid tool. Indentation seems to
have been fixed.
(cherry picked from commit 13d1e38f4b)
Instead of always loading the last auto-saved session (which might end
up in an endless cycle if recover.mmp is faulty or causes a crash) ask
the user whether to do so.
Updated CAPS plugins to version 0.4.5 - changes:
* Narrower plugin added
* fixed 'configure.py' to work with python3
* fixed Sin, Roessler and Lorenz gain smoothing on activation
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
Instead of passing an initialized pa_cvolume structure, pass NULL as
recommended by the documentation for pa_stream_connect_playback(). This
fixes the volume erroneously being set to 100% at startup.
Thanks to Thomas Moschny for forwarding the bug report.
* Simplify exciter code. No functional change... I hope!
* Work in progress on rotary speaker. May contain bugs.
* Replace allpass vibrato in Calf Organ with a simulation of scanner vibrato.
* Implement switchable vibrato type.
* Initialise delta members in ramp classes.
The settings for the new attack and decay controls weren't saved and
loaded at all while just the values of all other knobs were saved
(instead automation data, controllers etc.).
Per default do not append the version to the installation directory
anymore as this causes unneccessary problems when not properly
uninstalling an older version. Instead files should be overwritten by
recent ones from now on.
Partially closes#3149779.
There were some issues with the ControllerRackView when closing it
with recent Qt versions. Issue seems to be fixed by not setting a
size constraint policy for the QMdiSubWindow.
Partially closes#3149779.
When creating a new Sf2Player plugin instance, load the default
soundfont. Might decrease performance a little bit when loading projects
which make use of many other soundfonts but for the sake of improved
usability we should accept this.
Partially closes#3149779.
When there's no BB track but a track is added to the BB editor,
automatically create a BB track so that the user doesn't get confused
by new empty track (not even showing clickable beats).
Partially closes#3149779.
The decay knob didn't actually do anything before. Now it's useful
together with newly introduced attack knob. One can do much better
sidechaining now without disturbing artifacts due to too responsive
volume changes.
(cherry picked from commit 9615ceabd5)
Using the -nostartfiles linker flag makes the CMT LADSPA plugin
library not being linked against neccessary libraries on recent Linux
systems. Therefore remove it.
every time auto-save ran, it would change the current project to
"recover.mmp". Now it doesn't do this because Song has
guiSaveProject(), guiSaveProjectAs(), and saveProjectFile().
(the latter is used for auto-save)
(cherry picked from commit 953522f34a)
auto-save time is not configurable yet. saves "recover.mmp" to
WORKING_DIR every 60 seconds. Deletes recover.mmp on successful
close of LMMS. If recover.mmp is found upon start, it loads that
project.
(cherry picked from comit f73ccadc17)
Instead of flipping to next page when the play position marker reaches
the right edge, scroll to next page smoothly using the QTimeLine class.
Closes#3144318.
There were many changes in the CALF repository. Cherry picking all of
them individually would be lot's of work, that's why I just applied
a diff made up from the following commits:
* Add ChangeLog entries of the remaining bugfix 0.0.18 releases.
* First attempt to update ChangeLog with the changes from last 2 years.
* Fluidsynth: set sample rate on a synth instance.
* Monosynth: allow modulation matrix when configure is available.
* Improve LADISH level 1 integration. Doxygenize host_session a little bit.
* Avoid starting LASH just to display the help text.
* Reuse instance IDs of removed plugins.
* Don't crash on failure of the save operation.
* Remove by pointer, not by position - better for rearranged lists.
* Mark the reorder function as experimental. Print new plugin order to stdout.
* Add channel number to internal MIDI API. Fix stack overflow in Calf Organ.
* Ignore data type for now, to help diagnosing restore issue with Ardour.
(cherry picked from commit a6c6e18508)
When packaging the ZynAddSubFxCore library (Windows builds), there's no
need for including the DLL import library, so skip it. Furthermore make
sure to strip the ZynAddSubFxCore library which decreases its size from
8 MB to about 1 MB.
(cherry picked from commit 4616a53eb2)
I updated the MinGW cross compiling packages to come alogn with
Qt 4.7 and a revised build architecture. Qt's devel tools such as
qmake, moc & friends are now built natively and allow using them like
native Qt installations. This means there's less to hardcode in the
MinGWCrossCompile file.
The PortAudio backend lay down broken for quite a while. However as it
offers much better realtime capabilities on Windows compared to SDL, I
started to resurrect it, removed support for PortAudio < 1.9 and fixed
various bugs and crashes.
When changing an InstrumentTrack's base note while NotePlayHandles are
active, they will send a wrong MidiNoteOff event due to the masterKey()
translation in InstrumentTrack::processOutEvent().
Therefore in NotePlayHandle remember the original base note value and
add the difference between original and current base note to the value
returned by NotePlayHandle::key(). Fixes hanging notes in MIDI-based
instruments such as ZynAddSubFX.
Furthermore some coding style improvements.
Closes#3146975.
* win64-vst:
VST support layer: fixed non-working 64 bit VST plugins
VST support layer: added 32 bit VST plugin support for Win64
Win64Toolchain: added 32 bit compiler configuration
ZynAddSubFX: use new RemotePlugin::init() method
RemotePlugin: added support for running remote process multiple times
(cherry picked from commit 65c073ec63)
When instantiating the SpectrumAnalyzer plugin more than once the
processed data somehow got invalid and caused all but the first
SpectrumAnalyzer instance not to work at all. This can be fixed easily
by clearing m_buffer in SpectrumAnalyzer's constructor.
Closes#3137877.
(cherry picked from commit ab814c03a7)
Use "LMMS ${VERSION}" for the CPACK_NSIS_DISPLAY_NAME variable. This
affects the start menu entries on Windows where we want the user to be
able to distinct between various installed versions of LMMS easily.
* calf-updates:
Reimplement modulation matrix (and tables in general) using configure variables. Slow and most likely incomplete, but a good start.
Add extra checks to detect when param_count != param array size - 1.
Fix another install-related crash, this time due to invalid params in fluidsynth. (cherry picked from commit 034e3a47cd40eb6bb7d221274fda2a5c1c79f42f)
Fix the infamous crash on install. (cherry picked from commit f0568e2f8a4c7d0003cc5a15e300aa2ebb3f93cb)
The range given in the comment wasn't really correct. (cherry picked from commit 292cdaa81dab7e7d948f597041cb86d70dc5ff92)
Use symmetric dB range for EQ plugins.
Fix a few bugs in compilation of limited versions (DSSI without GUI, no JACK host).
Initialise the vintage delay properly... hopefully this time. (cherry picked from commit c96ff1d680148cc877fab3b641d666068eea06aa)
Unbreak Monosynth by changing listview to use a 'key' attribute instead of 'param'.
(cherry picked from commit c562952800)
* calf-updates:
Make meters in compressor/EQ/distortion modules sample-rate-dependent. (cherry picked from commit 47a87c696223625d31cf106e12ed08cd3293be14)
(cherry picked from commit 6581a11a45)
There's no need to implement an own (buggy) window activation history
for InstrumentTrackWindows. Use QMdiArea::subWindowList(...) instead.
Fixes buggy keyboard focus when switching between InstrumentTrackWindows.
(cherry picked from commit c05965117c)
Added a one-window-mode which allows to have only one instrument track
window open at a time. The content of this window is replaced each time
you open a different track.
Furthermore added global reception and forwarding of key events to the
piano widget of the top-most instrument track window. This for example
enables the user to play test sounds while tweaking some effects in a
different subwindow.
(cherry picked from commit 93681760d2)
With Qt 4.7 the alternating row color in the Sf2 patch selector dialog
somehow was messed up. Fixed this by explicitely setting the alternating
row color in the style's CSS files.
(cherry picked from commit fd40743772)
Whenever closing the sample track effects window using its own close
button and trying to open it again there was only a really small window
without functionality. Fixed this by explicitely also showing subwindow
content in showEffects().
Closes#3075205.
(cherry picked from commit 830c2cb975)
* calf-updates:
LADSPA/CALF: removed unused file
One table_edit_iface per table; start implementing a bridge class. (cherry picked from commit 2019ae2d8f9636b7d5cdb0c1fdd5f0d6f2b47e3d)
Move the table_edit_iface out of plugin_metadata_iface, where it should have never been in first place. (cherry picked from commit 6907dc9670eae2313707b142c552a8d9e8b477b5)
Fix organ crash in calfjackhost. (cherry picked from commit b2853103199b3f5f3a5d22271c5d89122514dd53)
Remove the forgotten leftover references to the old extensions. (cherry picked from commit deb8b77bdb1e1648a38589b3be3d4d66175b4934)
Replace string port/message context using persist extension. (cherry picked from commit b8e69ceb2ff7aca549efd939d04447e2f08ad5a8)
Comment out the barfage when passing configure variables via message_run. (cherry picked from commit 1e767ff88578011c2f65466d5516953271e2cafd)
Add a crude incomplete implementation of persist extension support. (cherry picked from commit 3ec11c04799fc08fd408c4ef2350df65f88ccfde)
Add LV2 persist extension by paniq. (cherry picked from commit 1965282a28c6940164ffff7ebd106b27cafd7f2a)
More refactoring of the VUs. The goal: to be able to add peak meters without major hassle. (cherry picked from commit 00ee132cc2ebe3b664c7d5760260d76dda37bf26)
Fix handling of very short notes in Monosynth. (cherry picked from commit 5965d9922a0753e2dce4f743a23b9512be01a7ac)
(cherry picked from commit 01c91b6ce3)
For some reaons with recent versions of Qt we can't embed the VST FX
GUI into an existing EffectControlDialog anymore. As a workaround, embed
it into a new subwindow and added an additional show/hide button.
Closes#3028717.
(cherry picked from commit fa9e0f762c)
We must not only restore the controller knobs but also send updates
to ZynAddSubFX. However this only applies to knobs that were modified.
Therefore save and remember which knobs this applies for.
(cherry picked from commit b2cc802528)
The filter resonance controller erroneously was labeled with something
like "cutoff" which is definitely wrong. Use "resonance" instead.
(cherry picked from commit 1546b7cec0)
Commit 491910357b was a first try to fix
bug #3052228 but it broke InstrumentPlayHandle-driven instruments.
When losing focus now simply send NoteOff MIDI events for all keys
regardless of the state indicated by Piano::m_pressedKeys.
Closes#3052228.
(cherry picked from commit f8e73c5293)
The first version of mikobuntu's logo had a white semitransparent
background. This has been fixed. Additionally the background artwork
of the SID plugin has been changed as well to include the new logo.
Thanks to pgib for preparing this.
(cherry picked from commit eb673c0ad5)
If we lose focus, call InstrumentTrack::silenceAllNotes() after
explicitely sending NoteOff MIDI events for all keys for which presses
were recorded. In case the arpeggiator is enabled this is not
sufficient. Fixes hanging notes when switching active subwindow while
pressing keys in an instrument track window with arpeggiator enabled.
Closes#3052228.
(cherry picked from commit 2f921303eb)
Commit 534c4debb5 introduced a regression.
If knobs have a song-global automation or controllers attached, they
save these settings in a sub XML node which confused the ZASF preset
loader which assumed the first child node would always be the ZASF
preset data. Fix this by explicitely searching for an XML element named
"ZynAddSubFX-data".
Closes#3057275.
(cherry picked from commit 4e695a4ea8)
This is an attempt to improve commit c17bb3ba18. The logo has
been mirrored using ImageMagick which doesn't seem to mess up the 8 bit
alpha channel.
(cherry picked from commit 4763da4daa)
On Linux and OS X search for pthread library and link against it
explicitely. This fixes link problems on recent Linux distributions
where indirect linking (by dependencies) is disabled. Thanks to thm
for pointing out this issue.
(cherry picked from commit 1b84b360f4)
After introducing the control knobs it's not always desired to forward
all MIDI Control Change events to ZynAddSubFX. Therefore added an LED
checkbox which allows to disable forwarding of such events.
Closes#3055332.
(cherry picked from commit 0b7e37ca6a)
There's no reason for not forwarding MIDI events such as NoteOff,
ControlChange etc. when muted. Therefore only do not forward NoteOn
when muted.
(cherry picked from commit 39918f8835)
* calf-updates:
Use generic single VU meter in some dynamics plugins as well. (cherry picked from commit 50505a2d304555bb3b766c43af5cd1a27de331e2)
Refactor metering code out of distortion plugins. (cherry picked from commit 84d873861da7b4ad205061b00fcc9f73c47140b6)
More variable initialisation. (cherry picked from commit 40bbe048f27fc7190001383f93097127119ee667)
Initialise old-state variables to prevent "stuck" graphs. (cherry picked from commit 2a795084ee9e73712a4b690b84158cc745ff1d30)
(cherry picked from commit cb52114261)
Notes are always drawn on-top of each other starting from the left
to the right. However the behaviour when clicking notes was reverse,
which made it quite hard to edit notes sometimes. Now the top most
note is edited/selected/moved/resized if notes overlay.
Closes#2808603.
(cherry picked from comit 28eb7e00bf)
This is workaround for a bug in libsndfile or our libsndfile decoder
causing some OGG files to be distorted. Therefore try the OGG Vorbis
decoder first if filename extension matches "ogg".
Closes#2957937.
(cherry picked from commit 6e64bcfc42)
Some ZynAddSubFX presets have one or more leading blank lines which
confuses the QtXml module. Therefore dynamically remove characters from
the beginning of the data until we encounter a '<' character.
Closes#3047560.
(cherry picked from commit 32dbda5b33)
There's no reason to not allow changing volume and panning of step notes
in PianoRoll. Therefore simply check whether the length is not equal to
zero (which might be disabled step notes) instead of checking for length
being greater than zero.
Closes#2836799.
(cherry picked from commit 8286c1031d)
There were some bugs when pressing Ctrl while in SelectMode. Fix this
by always setting m_ctrlMode and m_editMode in keyPressEvent() when
Ctrl was pressed.
Closes#2854958 and #2836576.
(cherry picked from commit 46c20bdcbd)
We have to reset global models such as tempo, master volume etc. before
clearing the global automation patterns attached to them. Fixes bug with
persistent automation on these controls when clearing project.
Closes#3046039.
(cherry picked from commit 2614474246)
When resetting a MeterModel we also have to clear global automation
patterns attached to it. Fixes bug with persistent automation data on
e.g. time signature widget when clearing project.
(cherry picked from commit 23a3efcac0)
For an unknown reason the ControllerRackView looses focus when adding
a new controller. Fix this by explicitely calling QWidget::setFocus()
at the end of ControllerRackView::addController().
Closes#3046041.
(cherry picked from commit 676a6fbad1)
We used QObject::disconnect() the wrong way leading to multiple
connections from InstrumentTrack::instrumentChanged() to
InstrumentTrackWindow::updateInstrumentView(). This resulted in
loading times being doubled each time you loaded a preset on the same
InstrumentTrack.
Closes#2934099.
(cherry picked from commit 9acb47a7a8)
In compat code of InstrumentTrack::loadTrackSpecificSettings() also
check for nodeName being equal to ControllerConnection::classNodeName().
This avoids trying to load the non-existing instrument "connection".
In master branch this has been fixed ugly in commit 22c877d4 before,
however implement a cleaner solution which is also suitable for
backporting.
Closes#3021259.
(cherry picked from commit 65311ef2b4)
We must not set the Qt::WA_OpaquePaintEvent attribute when using a
semitransparent background image in paintEvent(). Fixes artifacts
in EffectView's shadowed border.
(cherry picked from commit d830e7f622)
The pluginWidget of a VstPlugin (i.e. the VST editor) might be destroyed
outside VstPlugin's control resulting in a dangling pointer. This leads
to crashes for example when changing the model of an EffectView where a
VST plugin is attached, i.e. when re-opening a InstrumentTrackWindow of
an InstrumentTrack with a VST effect inside.
This can be fixed easily by using QPointer.
Closes#3045102.
(cherry picked from commit f4b84a6058)
The SampleTrackView did not explicitely have a SampleTrack model
attached and thus trackView::modelChanged() was not called. This way
SampleTrackView's mute and solo buttons were not connected to the
according models of the SampleTrack model. Fix this by calling
setModel() in SampleTrackView::SampleTrackView() (as done in
constructors of other track types too) and overload the
SampleTrackView::modelChanged() method.
Closes#3043836.
(cherry picked from commit 311bc92bde)
According to http://www.ladspa.org/ladspa_sdk/shared_plugins.html,
LADSPA_PATH is supposed to be delimited by colons. This patch does so,
except on Windows. On Windows we use ';' instead of ':' since colon is
a legal character for a path.
When dragging preset files into BB Editor the patterns were messed up
because simple serializing was not enabled (and thus newly created
patterns were removed again). Fix this by enabling simple serializing
mode before calling InstrumentTrack::loadSettings().
Closes#3041686.
When adding the new knobs for automatable parameters of ZynAddSubFX,
I forgot to include them in the save/load routines.
(cherry picked from commit 534c4debb5)
Thanks to pgib who pointed out the duplicate help item for the
--interpolate option. Additionally updated the program description.
(cherry picked from commit 5f131f1a69)
The MinGW packages have changed such that zlib is an external library
again (instead of built-in into QtCore), therefore we need to copy the
according DLL into the Windows package.
The height of TextFloat objects was not sufficient e.g. when used as
tooltips for knobs (while changing their values). Fixed improper
geometry calculation and static values in TextFloat::paintEvent().
(cherry picked from commit db8de3450c)
Added knobs for some MIDI controls that are recognized by ZynAddSubFX.
This allows to automate some basic parameters of ZynAddSubFX inside LMMS.
(cherry picked from commit 7a4f110af3)
The previous blurry background artwork was reported to be quite
annoying. Therefore replaced it with a more decent one.
(cherry picked from commit 4d532371e7)
Using QVector involves calls to malloc & friends which are not RT safe
and thus must not be used in AudioJack::processCallback(). Instead
allocate the required array upon initialization.
(cherry picked from commit ae7a4e4c2f13432d39b13c25b66231bdd6a1cc65)
There's been some more code that is only required if AUDIO_PORT_SUPPORT
is set. Added according #ifdefs and fixed a typo in AudioPort support
code.
(cherry picked from commit e98726ae992c77fb2dfdb6668319b5521ff8aaef)
* zynaddsubfx-master:
FLTK/CMakeLists.txt: fix CMAKE_MODULE_PATH, don't use 3rdparty code
ZynAddSubFX/FLTK: updated to SVN revision 7680
ZynAddSubFX: check whether QDomDocument::setContent() succeeded
ZynAddSubFX: completely reinitialize config after changing working dir
ZynAddSubFX: set working directory before setting preset directory
ZynAddSubFX/CMakeLists.txt: use global binary dir as last include dir
ZynAddSubFX/CMakeLists.txt: remove accidently added subdirectory
ZynAddSubFX: resynced with upstream (version 2.4.1)
ZynAddSubFX/FLTK: updated to SVN revision 6970
Misc: Minor changes to filter_ to reduce warnings (cherry picked from commit e2b1eb9b1077e6516c0cc4e2283e5c886bed0e58)
Cleanup: Separated Presets into Presets/PresetsArray
ZynAddSubFX: fixed commit d61283ad93
ZynAddSubFX/FLTK: updated to SVN revision 6943
small changelog fix (cherry picked from commit c8d411b5f7e7a295286c1ac2c09ae22f15a1db51)
VirKeyboard: Fixed possible segfault
small changes on Bandwidth on Reverb (cherry picked from commit d0b0a4e00a44559a4e78035fd04568bd4bab9651)
ZynAddSubFX: new QtXmlWrapper, a QtXml-based XML backend for ZASF
(cherry picked from commit 278b70384e)
Printing error messages using fprintf() does not help much with
RemotePlugins as their stdout/stderr usually is not redirected to the
parent process. Instead use the debugMessage() function.
(cherry picked from commit a55d71cf7f)
All flags which are used now for building Win32 version of LMMS are now
defined in the top level build_mingw32 script instead of the
Win32Toolchain cmake files.
On non-Linux platforms configuration file was saved in the application
path which definitely is not desired and also will not work in many
situations. Therefore always save ZynAddSubFX configuration file in
LMMS working directory.
(cherry picked from commit 000f67d01d)
Added a window icon to ZynAddSubFX windows for better appearance.
This is currently only possible for the win32 version a lot more hacks
are required to achieve this for X as well :-(
(cherry picked from commit 30060e41b7)
It's now possible to hide the ZynAddSubFX UI by simply closing its main
window instead of going back to LMMS and toggle the "Show UI" button.
Furthermore moved code for GUI thread into a non-static member function
of RemoteZynAddSubFx and removed the old code for handling IdHideUI
messages.
(cherry picked from commit fe7486750b)
We must not have any file called config.h in directories which are added
to global include directories. For example when building the CALF plugin
the file config.h from libsamplerate was used rather than CALF's local
one. Fixes missing LADSPA symbols in CALF library if no usable
libsamplerate was found in the system at configure time.
Also bumped version number in src_config.h.
(cherry picked from commit e07ed33827)
When calling TrackContentObject::paste(), only the content should be
pasted, not the position. This fixes pasting for example note patterns
and is also a more generic solution for the bug fixed in commit
4ec5c6afe1.
Closes#3005649.
(cherry picked from commit 5306f7b0ca)
Cloning a BB track can be rather confusing (e.g. two "Beat/Bassline 0").
Therefore prepend an indication to the name of the cloned BB track.
(cherry picked from commit 3b642271a8)
Not sure when it broke but cloning BB tracks erroneously cloned
positions of TCOs as well which made the source BB track have
two TCOs one upon the other while the destination BB did not have
any TCOs at all.
The fix is to save the position of the destination TCO before and
restore it manually after paste().
(cherry picked from commit c16e04c0dd)
If we choose to export an OGG file in the first dialog, it's really
annoying having to select OGG a second time. Therefore guess file
format from extension (backport from master).
Commit 884b9ca671 completely broke the
note detuning feature as the detuning value was not incoorporated into
the frequency calculation anymore. Fix this by adding the detuning value
to the pitch variable.
(cherry picked from commit b30e91042b)
* calf-updates:
Fix incorrect plugin class (spotted by Luis Garrido).
Add windowing-based antialiasing to hard sync in Monosynth; update last stretch even if synth is idle. (cherry picked from commit d64a0487d88f6730ef90dd6d79b892ad4a114138)
(cherry picked from commit 8ef98b63db)
The compiler flag -ftree-vectorize brings only little advantages in
some special cases. In all other cases either worse or even wrong code is
generated due to bugs in GCC (especially for Win32). Therefore remove it.
Various plugins were missing the PLUGIN_EXPORT declaration with their
PluginDescriptor instantiations and lmms_plugin_main implementation
which made some plugins not show up with latest Win32 build.
Silence a compiler warning introduced by custom changes and fix a
possible compile failure by including another header file in a header
file that we cleared before.
(cherry picked from commit 4393ec8281)
As the colors of QToolTip depend on the desktop environment used,
explicitely set background and text color for fixing cases like
white text on bright yellow background.
Closes#3006955.
(cherry picked from commit d7ce7d485b)
Integrates Sami Boukortt's patch described below:
I have made a patch for the “Save changes?” dialog box to let the user choose
between “Save”, “Discard” and “Cancel” instead of “Yes”, “No” and “Cancel”.
I find this way more intuitive, since it enables Qt to reorganize the buttons
properly according to the platform and to give them an icon (at least on X11).
It also allows users to know what is going to happen without having to read
the question.
(cherry picked from commit f9015ac945)
Thanks to Fryderyk Dziarmagowski for providing a patch for the .desktop
file of LMMS. It should be standard conform now. An icon is now
explicitely installed in /usr/share/pixmaps so the .desktop and menu
files can specify a generic icon name rather than an absolute file path
to a PNG file of LMMS' default theme.
(cherry picked from commit 4d3040297c)
It's a bad style to manage global instances of an object in the object
itself. Therefore introduced a nested helper class which manages all
instances of EnvelopeAndLfoParameters globally. It is now responsible
for global reset/triggers of LFOs. In contrast to previous state, this
is now done thread-safe. Fixes crashes for example while importing
MIDI files.
(cherry picked from commit 5f6c42f19c)
The new deleteHelper() template function takes a pointer, saves it
to a temporary, sets the passed pointer to NULL and then deletes the
object it was referring to before. This way we can spot bugs caused by
undesired references to global objects at shutdown more easily.
(cherry picked from commit fe7d5e3d5a)
It was not safe to immediately delete the AutomationPattern attached to
an InlineAutomation object before commit "InlineAutomation: delete
attached AutomationPattern immediately" as the AutomationPattern
destructor sometimes fiddles around with AutomationEditor (GUI!).
However this has changed now and this enables us to delete the
AutomationPattern immediately. This fixes some random crashes with
scheduling AutomationPatterns for later deletion.
Closes#2982696.
(cherry picked from commit a9abdc3e75)
It was not possible to call any of the functions of AutomationEditor
from threads other than the main GUI thread as the m_pattern pointer
was not protected by a mutex. It is however desired to be able to call
for example AutomationEditor::setCurrentPattern(...) from different
threads (mainly required when deleting AutomationPatterns in other
threads). Thus made this method and all accesses to the m_pattern
pointer thread-safe.
(cherry picked from commit afba8a7ad4)
The global channel link checkbox did not work as expected as of the
M/V-split during 0.3.x -> 0.4.x development. Connected the slot
responsible for updating individual ports after toggling checkbox and
fixed the logic behind.
Closes#2964800.
(cherry picked from commit ace2266529)
Cross compile support for Win32 and Win64 has been unified,
simplified and adapted to the new MinGW64-based build environment.
This finally allows to produce working Win64 binaries.
(cherry picked from commit 51103bb674)
The per-note-panning support is broken (not sure whether this is a bug
in FluidSynth or our code) and leads to improperly panned sounds all
the time - even with all notes being panned to center. Thus disable it
until we have a proper fix for it.
(cherry picked from commit 22489ae321)
There's currently no need for analyzing the sound data if
SpectrumAnalyzer's view is not visible. This saves some CPU time
if SpectrumAnalyzer's view is not shown.
(cherry picked from commit 70b80efec1)
For some effects it is helpful to know whether their attached EffectView
is visible or not. This mainly concerns effects that actually do not
touch the sound data but analyze it and display the results.
(cherry picked from commit 9c9bca7098)
* calf-updates:
Simplify Multiband Compressor code and fix several bugs.
Remove zombie small plugin code.
Remove small plugins together with all the supporting infrastructure.
Add Doxygen documentation for plugin_registry class.
More refactoring.
General refactoring. Start implementing external GUI.
+ LV2: add external UI header (not used for anything yet)
(cherry picked from commit ceacb484a1)
Fixed some spelling errors found by Lintian while checking the Debian
package of LMMS. Thanks to Patrick Winnertz for pointing out this issue.
(cherry picked from commit 9fd3dacb67)
* calf-updates:
CALF: resync source files due to forgotten commits
+ JACK host: implemented Save/Save as...; Open not implemented yet - who could possibly want THAT?
+ EQ: Fix adding EQ plugin using menu in calfjackhost
Some changes in style, smaller h/v-scale added
+ LADSPA: make plugin IDs unique across Calf plugins, add an install-time check
+ EQ-5: refactoring to eliminate code duplication, side effect: stereo meters
+ EQ-n: shorter names for calfjackhost and others
+ Equalizers: convert lists of per-band parameters using macros (ugly, but effective)
+ EQ-8, EQ-12: reduce copypasta by using a class template
+ Compatibility: workaround for GStreamer crash bug in Ubuntu 9.10 (thanks to Stefan Kost for diagnosing the problem and suggesting the workaround)
+ Compressor simplification, added optional audio ports
(cherry picked from commit c8a444d026)
* calf-updates:
+ Deesser: use correct threshold
+ Equalizer: remove unused variables
+ Gain reduction module: clearer authorship information
+ Framework: placeholder for waveshaper class (need it to merge further changes from Markus)
(cherry picked from commit 774bd74c77)
* calf-updates:
New widget: Tube with light and falloff
New Deesser, some minor bugs in sc-comp
Sidechain compressor bugs/settings, 3 equalizer
Minor bugs, sidechain frequency display
New FX: Sidechain compressor
New button (big mama), VU-meters with falloff and hold, bug in delay (value)
In the middle of nowhere
Fully redesigned
Sidebars, GUI layouts, black buttons again, input knob for compressor
Added 6 new LED's and peak hold function for VU-meters
meter_gain in gain_reduction module with falloff
(cherry picked from commit 083c2e1b0b)
In Base64::decode() we mess around with pointers so it's more type-safe
to realize everything as a template function. This also silences compiler
warning about dereferencing type-punned pointer in Vibed plugin.
(cherry picked from commit 81cea79c38)
We should not only test whether a specific path (e.g. STK or LADSPA
path) is empty but also whether it does not exist so we can reset it
to a sensible default value (for example when upgrading LMMS on Win32
where the program's path will change).
Furthermore default to "C:\Program Files\VstPlugins" for the VST
directory on Win32 which is the default location for VST plugins.
Up to now the MainWindow's icon was used for VST plugin GUI subwindows.
Improve this a little bit by using the VeSTige logo now.
(cherry picked from commit 5e711875f5)
Removed some old projects that did not represent LMMS and its abilities
anymore. We also need to replace most of the "Cool songs" and replace
them by more recent projects from LSP.
(cherry picked from commit ca2440d1c4)
Users reported the last buffer played repeatedly while the dialog asking
whether to save project is shown. This behaviour even continued while
loading a project. An easy workaround for this is to stop playing song
(or whichever TrackContainer is active at the moment) in
MainWindow::mayChangeProject().
Closes bug #2904781.
(cherry picked from commit 04699ba412)
The background tile pixmap used to draw the background of
TrackContentWidgets was only updated on size changes but not on
changes of zoom level in according editor. Fix this by updating
background pixmaps in trackContainerView::setPixelsPerTact().
As of Stk 4.4 all classes and types have been moved to the namespace "stk".
This breaks build of the Mallets plugin. This can be easily fixed by
using the namespace "stk". For compatibility reasons we have to declare
the namespace before, because it did not exist in previous versions.
Closes#2870878.
(cherry picked from commit bf0f0151d2)
It's not a good idea to allocate the buffer for VST chunk data on the
stack as chunks might become quite big (several megabytes) and thus
could cause a stack overflow. Fix this by using new/delete.
(cherry picked from commit 5f241e6374)
Try to adjust latency of PulseAudio according to our settings of mixer
so it does not have such a bad latency anymore.
Furthermore force PulseAudio to play silence instead of rewinding
streams in case of underruns.
(cherry picked from commit 92047f5e9e)
There have been some problems with the threading logic in the
AudioPulseAudio backend resulting in an endless loop when quitting LMMS.
Furthermore allocated PulseAudio resources were not freed properly.
Thanks to Armin Kazmi <armin.kazmi@tu-dortmund.de> for pointing out
this issue.
(cherry picked from commit 168805745e)
As we have quite a few Qt Designer based dialogs now, there's a whole
bunch of new strings to be translated for each language.
(cherry picked from commit 52fbd3694d)
For whatever reason I did not add UI files to lupdate calls, so strings
in Qt Designer based dialogs could not be translated. Trivial fix.
(cherry picked from commit b3b038eaf6)
Rewrote implementation of class SideBar to use QToolBar instead of
KMultiTabBar. We can style the SideBar now easily via CSS and do not
have to ship 3rd party KDE code with LMMS. Also the QToolBar based
SideBar integrates much better into the according widget style.
Furthermore renamed SideBar related classes and files to match new
coding style.
(cherry picked from commit 822a22ca37)
Commit 3c18e436cd makes it impossible to
build LMMS with embedded ZynAddSubFX if "-Wl,--as-needed" is used in
LINKER_FLAGS during the link step of RemoteZynAddSubFx:
Linking CXX executable RemoteZynAddSubFx
libZynAddSubFxCore.so: undefined reference to `fftwf_plan_r2r_1d'
libZynAddSubFxCore.so: undefined reference to `fftwf_execute'
libZynAddSubFxCore.so: undefined reference to `fftwf_destroy_plan'
This happens because fftw3f, which is a system lib, is linked to before
the ZASF core libs when linking RemoteZynAddSubFx. With "--as-needed",
correct library order matters.
(cherry picked from commit 0f28295ac7)
Added #include <pthread.h> in PADnoteParameters.h to fix windows compile error
Patch by: Tobias Doerffel
(cherry picked from commit 14d2751bed1e6bb11805bb17e4a73e622c85a4ac)
(cherry picked from commit 415a966d25)
VstPlugin creates a temporary file for exchanging data chunks of VST
plugins with the remote process. After calling QFile::write(...) data
has not neccessarily been written due to QFile's internal write buffer.
Therefore explicitely call QFile::flush() so all data is guaranteed
to be written.
Fixes problems with plugins which save small data chunks.
(cherry picked from commit 4b8ddcc14f)
LMMS' ZynAddSubFX plugin creates a temporary file for exchanging XML
data with the remote process. After calling QFile::write(...) data
has not neccessarily been written due to QFile's internal write buffer.
Therefore explicitely call QFile::flush() so all data is guaranteed
to be written.
Closes#2877916.
(cherry picked from commit 17b388d482)
Still QString::toAscii() & friends were used in several places causing
problems such as failed access to files with non-ASCII characters in
name.
Closes#2884115.
(cherry picked from commit 1633cf2593)
Updated FLTK to SVN revision 6921 of branch-1.3:
- Managing all Widget flags in a single location now (STR #2161)
- Fixed all color related call to Fl_Color type (STR #2208)
- File chooser preview now recognizes utf8 encoded
text files (STR #2218)
- Empty functions in Fluid no longer create an
implementation (STR #2259)
- Fixed Fluid dependency on X11 (STR #2261)
- Updated the bundled libpng to v1.2.40 (released Sep. 10, 2009)
- Fixed Fl_Choice contrast with light-on-dark settings (STR #2219)
- Fixed X server "lock", if a modal dialog window is opened
while a menu is active (STR #1986)
- Updated mirror sites in documentation (STR #2220)
- Setting a default font for Xft (STR #2216)
- Temporarily limited builds to 32-bit on OX S to stay
compatible to Snow Leopard
- Fixed Windows compile bug with "#define USE_COLORMAP 0"
(STR #2241)
(cherry picked from commit c734023be2)
* zynaddsubfx-master: (28 commits)
ZynAddSubFX: explicitely link RemoteZynAddSubFx.exe against Core library
Revert "ZynAddSubFX/FLTK: updated to SVN revision 6909"
Style: Restylized entire codebase
SUBnote: integrated memcpy/memset
ADnote: started to use memset/memcpy
ADnote: Documented/added const usage
OSS: Added failsafe based upon Jrmie Andri patch
Unison improvements
Bandwidth effect on Reverb
Started to rewrite the Reverb's Bandwidth effect (based on a better idea)
ZynAddSubFX/FLTK: updated to SVN revision 6909
Merge branch 'master' into newXML
ZynAddSubFX: rebuilt UI files with non-buggy Fluid
ZynAddSubFX: rebuilt source files from UI files
Merge branch 'master' of ssh://zynaddsubfx.git.sourceforge.net/gitroot/zynaddsubfx/zynaddsubfx
Started to implement Bandwidth to the Reverb effect.
Small enhancements and bugfixes to Unison
Made unison vibratto LFO smoother
Other improvements and bugfixes on Unison.
Bugfixes
...
(cherry picked from commit fbacebca65)
ZynAddSubFX has gained some new developer power so development has been
going on well for quite a while now in their Git repo. It's time for
the first big resync so future changes can be integrated easily.
(cherry picked from commit 3c18e436cd)
After refreshing TS files in commit 8641023053
we need to regenerate final localization files (*.qm) to make changes
take effect.
(cherry picked from commit a3cac6ae79)
Due to changes introduced by commit 5685663233
we need to refresh localization files. This also fixes problems with
translations not working anymore due to class name changes.
(cherry picked from commit 8641023053)
By passing two additional parameters to lupdate we can suppress useless
location information for messages in *.ts files. Furthermore drop
obsolete translated strings when updating a localization file for not
cluttering repository.
(cherry picked from commit 5685663233)
Translations didn't work because I didn't "release" within Linguist. I
wonder how to update the *.ts files with missing strings...
(cherry picked from commit 49c2f6bad1)
Previously, the extensions were stored in the translations, this i18n
more difficult, additionally, there was a preprocessor statement that
would cause the translated phrase to change! Hence, no translations if
you didn't have ZIP file support. The text is now split into seperate
translations and I added "All Files".
(cherry picked from commit beb92563f1)
All versions of OS X except Snow Leopard ship GCC 4.0 which does not
understand the "-finline-functions-called-once" flag. Therefore do not
use this flag when building for OS X.
(cherry picked from commit 01ae99d6aa)
ChangeLog has been removed as of commit
c896488e13, therefore "dist" target fails.
Removing ChangeLog from list of files to be copied into tarball fixes
this issue.
(cherry picked from commit de8e13b44b)
* calf-updates:
+ DSP primitives: fix a rather stupid bug in clamping functions
+ Monosynth: fix type bug that made it impossible to compile with g++ 4.2
+ AutoHell: update AUTHORS file
+ GUI, Multiband Compressor, Toggle button: apply more fixes and additions by Markus Schmidt
+ Multiband Compressor: better metadata
+ Multiband Compressor: new module (first version, by Markus Schmidt, based on code by me and Thor) plus associated refactoring and graph colour scheme update
(cherry picked from commit 65f6bb7135)
This reverts commit dd260245ec.
The commit fixed the compilation problem but according to upstream
causes new problems because of the huge data structures on the stack.
Upstream provided a better patch which will be applied next.
(cherry picked from commit 68bd237061)
The std::vector::data() method is a special feature of GCC and
therefore not portable. This causes a compile failure of CALF plugin
on OS X. Therefore I replaced the code with standard arrays
allocated on stack.
Upstream needs to be informed about this patch.
Thanks to Daniel Klaffenbach for pointing out this issue.
(cherry picked from commit dd260245ec)
Source directory structure of the CALF plugin shipped with LMMS was
not equal with original one which makes cherry-picking commits from
CALF Git impossible.
(cherry picked from commit b8d339e196)
The knobs were broken because the classnames of these instruments was
changed without properly changing the selectors in the style.css
(cherry picked from commit 2622edd140)
Conflicts:
data/themes/cusis/style.css
There's no need to call plugin dispatcher in hostCallback. It makes
plugins like Garritan Personal Orchestra 4 lock up. After removing
these calls the affected plugins work.
(cherry picked from commit 44e25a6ad5)
After cherry-picking massive changes to ZynAddSubFX (and not resolving
conflicts properly) some 0.4.x specific code did not compile anymore.
This commit fixes those issues.
As location of UI files has changed in master and we cherry-picked
some related commits we have to look for UI files to process in
src/gui/Forms as well.
OscilGen::tmpsmps and OscilGen::outoscilFFTfreqs were static member
variables initialized once in LocalZynAddSubFx class. However having
this data global is not a good idea because it gets modified by each
synth (possibly in parallel), causing heavy distortion under various
circumstances. Now that this data is allocated and used per-synth
everything works fine.
(cherry picked from commit b73474ca73)
While regular instruments were excluded from processing when muted
this did not happen for InstrumentPlayHandle-based instruments. Muting
for exampling tracks with VSTi's inside did not decrease CPU usage.
Checking whether related InstrumentTrack is muted before calling
Instrument::play() fixes this issue.
Closes#2857426.
(cherry picked from commit 6940d19969)
While fixing the name of the plugin library in commit
883836aa8a the plugin descriptor
structure has not been updated.
(cherry picked from commit 5c96adbd6d)
If we'd rename all plugins like I did with ZynAddSubFX, we'd run into
serious troubles, therefore keep plugin names lower case.
(cherry picked from commit 883836aa8a)
Added a new GUI-less mode to ZynAddSubFX instrument plugin which allows
to let ZynAddSubFX audio processing happen within LMMS, giving a much
better realtime behaviour.
As soon as showing up the GUI settings of GUI-less ZynAddSubFX instance
are saved and a traditional RemoteZynAddSubFx process is being launched
and the settings are applied there.
(cherry picked from commit f1d383d04d)
Moved all ZynAddSubFX instance related functions and variables into
RemoteZynAddSubFX class so there're no globals anymore. Also removed
some unused headers and ZynAddSubFX' main.c.
Additionally make use of full 80 chars/line with ts=4.
(cherry picked from commit d2eea754bc)
Fix problem with main-window scrollbars not adjusting when toggling
off-screen children. Seems like Qt bug #260116.
(cherry picked from commit 669b4e7198)
If DEBUG_REMOTE_PLUGIN was set, RemotePlugin::process() always returned
as RemotePlugin::isRunning() returned false. Fix this by always
returning true when debugging.
(cherry picked from commit ee63a13f2d)
Some platform-specific constants got renamed during sed-mass-replace.
Fix this by reverting concerning constant names.
(cherry picked from commit 78536d9065)
Instead of writing QVector<Plugin::Descriptor> everywhere, mix up
iterators etc. centrally define Plugin::DescriptorList and use it
everywhere.
Additionally made pointers to Plugin::Descriptor and
Plugin::Descriptor::SubPluginFeatures::Key const in various places
so we can use ConstIterator everywhere when iterating through
Plugin::DescriptorList.
(cherry picked from commit 2287eca802)
We can safely make fillDescriptionWidget() and listSubPluginKeys()
const methods. Furthermore descriptor pointer to listSubPluginKeys()
can be const as well. Might allow more optimizations by the compiler.
(cherry picked from commit 1c76c77d22)
All of the GUI code of EffectSelectDialog has been replaced by an
according UI file. Also merged EffectListWidget class into
EffectSelectDialog to further simplify logic.
(cherry picked from commit cb85bfc906)
Some variables got renamed the way the shouldn't. Doesn't have any
functional impact but fix it for the sake of cosmetics.
(cherry picked from commit d7365e4cf3)
Most files and most of the core classes and their methods have been
renamed to match new coding style conventions:
391 files changed, 25400 insertions(+), 25598 deletions(-)
Furthermore splitted some files where model and view classes were
declared or implemented together in the same file.
Should be tested thoroughly as I might have missed renaming some virtual
methods or SIGNAL/SLOT parameters.
(cherry picked from commit 8c9a9dd14c)
Passing -nw as option for MOC to QT4_WRAP_CPP macro silences warnings
about non-MOCable headers (which confused a lots of users).
(cherry picked from commit f7af62eab4)
If a certain step was set for a model, the fitted value (i.e. value
divided by step, rounded and multiplied with step again) could become
smaller than minValue or greater than maxValue. Therefore explicitely
check those cases after performing the described calculation.
Closes#2840202.
(cherry picked from commit b5d9fab944)
After (exactly) 5 years of silence, there's a new relase of TAP LADSPA
plugins. It fixes issues on 64 bit machines, uninitialised variables
and denormal issues.
(cherry picked from commit 6a9e45f733)
Most of the stuff that was in main(...) function before directly is
related to creating a new instance of ZynAddSubFX master class,
therefore moved initialization and shutdown code into constructor
and destructor of RemoteZynAddSubFX class. Should have no functional
impact.
The shutdown code was extended to properly destroy the ZynAddSubFX
instance.
(cherry picked from commit 9c5e04ba73)
Per default child processes inherit all file descriptors of their
parent process. This applied for file descriptors pointing to sound
devices as well. Reopening sound devices while e.g. a ZynAddSubFX
process was running always failed due to this "feature".
By manually setting the FD_CLOEXEC flag for the sound device file
descriptors they do not get inherited by child processes anymore.
(cherry picked from commit 80f101cec6)
So far we ignored all events other than MidiNoteOn, MidiNoteOff and
MidiPitchBend. By also processing MidiControlChange events one can
control some basic parameters of ZynAddSubFX via MIDI now.
(cherry picked from commit 49ebb835af)
When opening up the ControllerConnectionDialog by default auto detect
is enabled and all MIDI input devices are selected. Upon the first
event all devices but the one the event came from get unchecked. This
eases the process of assigning MIDI controls to software controls.
(cherry picked from commit 27f5d20e05)
Added functionality to query the name of the source port of a MidiEvent
by calling MidiClient::sourcePortName( const MidiEvent & ).
(cherry picked from commit 5ec96a9483)
The MidiClient::writablePorts() method was not overloaded properly in
MidiWinMM implementation due to a typo. This should fix list of output
devices being empty on win32.
(cherry picked from commit 40c56de898)
A port name is constructed from snd_seq_* structures at various places,
therefore separate it into a static helper function. This avoids
redundancy and eases maintainability.
(cherry picked from commit bfe90a8ade)
Use poll() with a finite timeout so we can quit the thread properly
without manually writing stuff into the pipe.
Check for pending events at the beginning of the loop so we can't end up
in an endless loop.
Furthermore check return value of snd_seq_event_input() and get out of
loop if it indicates an error.
(cherry picked from commit 9d811bf080)
Use QString::isEmpty() rather than comparing against an empty string.
Furthermore use QStrin::toUtf8() instead of QString::toAscii() for
retrieving name of a MidiPort.
(cherry picked from commit 295b332650)
If libraries are being used from somewhere other than
/usr/include or /usr/local/include, building vst_remote would fail.
Now it checks CMAKE_INSTALL_PREFIX/include.
(cherry picked from commit 7d0c1ef6c2)
If libraries are being used from somewhere other than
/usr/include or /usr/local/include, building plugins would fail.
Now it checks CMAKE_INSTALL_PREFIX/include.
(cherry picked from commit a86ca968b7)
The audio_jack driver currently treats the jack transport status as a
flag for whether or not to output audio. This is incorrect and
unintended usage of jack transport. The attached patch simply removes
all references to jack transport from the driver, so that LMMS will
always be able to produce audio.
Closes#2816029.
(cherry picked from commit 1fe0c689b0)
A break directive was missing in MidiWinMM::handleInputEvent(), leading
to inappropriate calls to qWarning() on pitch bend.
(cherry picked from commit 58023cf2cf)
As per popular demand I added CALF LADSPA plugins to be shipped with
LMMS. After some minor modifications the plugins compile and work on
win32 platform too.
(cherry picked from commit 35ca0aab69)
Added a range check for channel parameter when adding notes. This fixes
a crash when for example importing the project posted on lmms-devel
by Andew Kelley lately.
(cherry picked from commit ee9d88e2d4)
There have been some changes to strings in the program which weren't
translated to German lately. Furthermore improved existing
translations and fixed mis-spellings.
Added cheese_enthusiast's <bdreed@woh.rr.com> new, better-looking piano keys. Also includes pressed piano-roll keys.
(cherry picked from commit 367d8360fc)
Apparently I didn't compile the latest version of my changes and there
was a lurking error. This has been fixed.
(cherry picked from commit a9a3c796f7)
Per request, make the Controller-rack vertically sizable. This is also
part of our effort to slowly deprecate old fixed-positioning code in
favor of layouts.
(cherry picked from commit bb76ba5121)
Switching to HQ mode in standard workflow doesn't make much sense and
is likely to cause problems. Therefore remove the HQ mode button for
for time being. One can still export projects in high(er) quality.
(cherry picked from commit d66c71ebf8)
MINGW_PREFIX is a better variable name than CC_PREFIX (cross copmling
prefix), therefore rename it. Furthermore define QT_HEADERS_DIR due to
changed logic in CMake's FindQt4 module.
(cherry picked from commit 94ebcf30bc)
Updated FLTK to SVN revision 6841 of branch-1.3:
- Fixed glibc 2.10 compiler problems (Fedora 11 and others)
with scandir() and strchr() (STR #2222)
- Fl_Scroll mods for global scrollbar size control
- various other minor stuff (see SVN log)
(cherry picked from commit 803fd68a56)
Do not crash if no fluid_voice could be determined in
sf2Instrument::playNote() (which for example happens if no soundfont
is loaded). Furthermore protect the FluidSynth API calls in the
envelope and panning code with global synth mutex.
(cherry picked from commit 144f0c6c80)
Finally there's proper support for panning and volume envelopes. This
is achieved by changing parameters of individual voices (one voice is
being created for each note). The new code also replaces the old
panning hacks which played notes on different channels and changed
panning of individual channels.
Closes#2010818.
(cherry picked from commit 4baf459da2)
stable-0.4 branch: forward-ported various trivial changes from master.
There's no need to send a MidiNotePanning event twice in
PianoRoll::testPlayNote(). Removed the duplicate function call.
(cherry picked from commit 4cdcd1a670)
Casting to panning_t in calculation in panningToMidi() leads to
integer overflows and thus to miscalculations. This resulted for
example in wrong panning during note preview when editing panning
of a note in PianoRoll. Casting to int instead fixes the issue.
(cherry picked from commit 6e3e1513c7)
* cleaned up code and improved coding style
* removed old SINGLE_SOURCE_COMPILE macro relicts
* use QString::toUtf8() instead of QString::toAscii() wherever possible
(cherry picked from commit 0bb54199b0)
The macro logic for defining the SPINLOCK_PAUSE macro tested against
LMMS_HOST_X86_64 twice instead of testing against LMMS_HOST_X86_64 and
LMMS_HOST_X86. This caused the SPINLOCK_PAUSE macro not being set on
x86.
(cherry picked from commit bf8f823751)
Updated CAPS plugins to version 0.4.3 - changes:
* basics.h cleanup / comments
* minor Makefile cleanup
* comment cosmetics
* Eq and Eq2x2 per-band Q changed to 1.414 (= 1 octave)
* Eq lowest band default value fixed to read 0
* Niclas' fix for the bessel function implemented
* uninitialised plugin states eliminated thanks to Damon
* linker options for OSX added to the Makefile
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit e0df82056c)
QString::toStdString() is not aware of locale specific characters (it
just converts to ASCII). Therefore added new macro QSTR_TO_STDSTR which
converts a QString to std::string with UTF8 characters.
Use this new macro in LMMS VST Support Layer and ZynAddSubFX plugin.
This fixes for example VST plugins not being loaded when the path to
the DLL contains non-ASCII (e.g. cyrillic) characters.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit f3e13c4427)
Setting time signatures 1/16+ lead to divisions by zero in two places.
Fixed this by adding according qMax() call (closes#2818125).
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit cb72bf2260)
Commit 4ad5add745 introduced a typo which
lead to compilation failure. This commit fixes it.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit c4c94985a6)
Added a typedef for VstMidiEventList so actual type does not have
to be hard-coded each time in the code.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit 4ad5add745)
Don't process MIDI events in GUI thread as this might corrupt MIDI
event array if both GUI and processing thread access it. Fixes
possible crashes.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit e7ab8e5670)
Locking the plugin is now achieved by calling RemoteVstPlugin::lock()
and RemoteVstPlugin::unlock().
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit 2240d6644d)
MidiPort::outputChannelModel is ranged from 1 to 16 for displaying
user-friendly values. However internally MIDI channels are ranged from
0 to 15. Therefore added realOutputChannel() which returns zero-based
MIDI channel which should be used everywhere except for the GUI.
Fixes MIDI events being sent to VST plugins on channel 2 instead of
channel 1. Makes some more VST plugins actually usable.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit 4f249400ac)
Different threading models aren't used anymore as SplittedThreadingModel
after all recent improvements works fine for all plugins tested so far.
It even shows that a lot more VST plugins are running now properly.
Therefore all support for TraditionalThreadingModel has been removed
which greatly simplifies code and makes it much more maintainable.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit 41c9318be8)
When saving or restoring settings, prefer chunks over parameters.
This fixes some problems with plugins which get confused e.g. if you
restore individual parameters rather than the whole chunk.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit dffd9ecfbe)
Starting with Qt 4.5 there were minor graphical glitches in
TrackContentWidget. Fix this by not setting Qt::WA_OpaquePaintEvent
attribute.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit 1015868e1f)
O_BINARY flag is not supported on Linux, therefore define it to 0.
Fixes compilation failure on Linux.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit d6a451bdf5)
When writing chunk to file or read it back from file, open file with
O_BINARY flag. Otherwise on win32 for example line endings (\n) are
converted (\r\n) and with real binary data this screws up things.
Thanks to Oleg Sharonov for pointing this out.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit 48a3d4ebe4)
When pasing notes via Ctrl+V somehow the edit-tool was left in an
undefined state. Therefore explicitely switch back to draw mode so
user can move pasted notes (closes#2808607).
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit cf7539caaf)
Now that we fixed RemotePlugin support on OS X, we can enable build of
ZynAddSubFX on OS X. Some GUI threading issues still have to be solved
though.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit ea376e90fe)
Variuos features (native/Qt semaphores/shared memory) are now
configured by macros like USE_QT_SHMEM and USE_QT_SEMAPHORES. This
allows central and individual configuration of features according to
the platform to build for at the beginning of the file.
Finally makes RemotePlugin work on OS X by not using native semaphores
rather than QSystemSemaphore's.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit 2ef5dffec0)
In InstrumentTrack::play(...) the local variable "bb_track" always
was either undefined or NULL due to a lost call (probably during M/V
architecture switch) to bbTrack::findBBTrack(...). This could lead to
crashes and/or misbehaviour when playing frozen patterns in BB tracks.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit fb58dc00ab)
The class forward declaration for "bbTrack" is neither used nor
required, therefore remove it.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit 913aa5a6e8)
Added new DEBUG_REMOTE_PLUGIN macro. If it is set, the process won't
be launched. Instead important information are printed allowing the
developer to run the process with according parameters in a debugger.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit 33ce491caf)
When input/output count changes, always print new number of inputs and
outputs as debugg message.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit 5838f63d0b)
Reset m_inputs and m_outputs to NULL after deleting the memory they're
pointing to. Fixes possible crash if new input or output count is 0
and the count changes again later.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit 206d906c10)
Some plugins call host callback from within their main function,
causing RemoteVstPlugin::m_plugin not to be set yet. Therefore
explicitely set RemoteVstPlugin::m_plugin if it's NULL. Makes plugins
by Wallander Instruments (and possibly others as well) work.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit 38f7552ce4)
Plugin dispatcher was called without any protection from various threads
leading to regular crashes or deadlocks within the plugin. The plugin
dispatching is now encapsulated into one central function which protects
the dispatcher by a mutex.
Furthermore improved handling of audioMasterIdle and
audioMasterUpdateDisplay in host callback by posting a message to GUI
thread asking for idle processing instead of directly calling plugin
dispatcher.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit e65b282166)
Renamed class remoteVstPlugin to RemoteVstPlugin + other minor coding
style fixes.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit cca39513d0)
Saving and restoring chunks from/to plugin seems to work now after a
few tweaks regarding memory-allocation and threading (according
functions need to be called from withing GUI thread). However needs the
new code some testing (especially whether it breaks previously working
plugins).
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit db878b664d)
Check for m_plugin being NULL in RemoteVstPlugin::inputCount(),
RemoteVstPlugin::outputCount() and RemoteVstPlugin::pluginVersion().
Makes various VST's load properly now.
Thanks to Oleg Sharonov for pointing this out.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit 9b5c0d19f8)
Some VST plugins save their state as chunks rather than parameters.
According code to save/restore those chunks has been taken from FST 1.9.
However restore currently is disabled as it mostly fails for whatever
reason.
(cherry picked from commit 0abd4aad70)
When compiling with GCC always allocate a temporary buffer for
resampling on stack rather than doing an expensive heap allocation.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit d1353247d9)
Do not build the ZynAddSubFX plugin on OS X until a proper replacement
for unnamed semaphores (which for whatever reason are not supported on
OS X) has been implemented. Using the win32 code (QSystemSemaphore)
could be an option but needs testing.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit fd9d2b0e61)
There were various (trivial) problems with settings of the build system
which prevented LMMS from being built on OS X.
Thanks to Daniel Klaffenbach for providing his Mac for development
purposes.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit ed30985aa4)
Set pen for drawing automation pattern outside of inner loop. This
might save some CPU cycles.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit ddf3d3dc66)
When clicking at an invalid position with the detune tool, LMMS could
crash as an invalid iterator was referenced (closes#2808589).
Furthermore renamed PianoRoll::ModeOpen to PianoRoll::ModeEditDetuning.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit 9ca93040de)
Renamed type noteVector to NoteVector as well as ::iterator to
::Iterator and ::const_iterator to ::ConstIterator.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit e12476f79c)
We must not keep the iterator at the same position when erasing notes
from the m_notes array. This usually is not a problem when using QVector
but we might switch to QList somewhen later.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit 2d5dfc7b15)
Commit 08ea133aa2 uncovered a flaw in
NotePlayHandle::play(...). When iterating over subnotes for each subnote
after playing it, we check whether it is finished. If this is true, the
according subnote gets erased from the m_subNotes array. However we have
to set the subnote iterator to what QList::erase(...) returns instead of
keeping it where it was before. This accidentally worked when using
QVector as type for NotePlayHandle arrays but caused a crash now that
we're using QList.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit 0d6ba6291b)
Reset window title when creating new project from template (after
actually loading template file). Furthermore do not reset window title
at the beginning of load process anymore.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit cf0a91637b)
Use QList instead of QVector when using a set of PlayHandle's. QList
has faster insert/remove operations and in most cases we iterate through
the array using iterators so there's no performance drop.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit 2cc49b8010)
* do not include instrument_track.h in note_play_handle.h by making
two functions non-inline
* renamed notePlayHandleVector / constNotePlayHandleVector to
NotePlayHandleList / ConstNotePlayHandleList and changed typedef
to QList (which has faster insert- and remove-operations).
* removed unused method willFinishThisPeriod()
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit 08ea133aa2)
Detect whether a given file is compressed by first trying to parse
its content as XML data. If it failed, try to uncompress and
parse again. This is more flexible than just looking whether the
filename extension is "mmpz".
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit c0794d0c41)
Added new method silenceAllNotes() which is a replacement for
invalidateAllMyNPH() and also resets m_runningMidiNotes array.
silenceAllNotes() is now used in destructor as well.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit 3c9859da9f)
The old constructor treated the string argument either as filename or
as raw XML data, depending on 2nd parameter. This is a mess and quickly
leads to confusion.
Now we have two constructors taking either a filename as string or a
QByteArray with XML data. Loading actual data has been separated into
MultimediaProject::loadData( const QByteArray & ).
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit 5a00ebd360)
For a long time presetPreviewPlayHandle has been a friend class of
InstrumentTrack as it had to modify MidiPort settings. However the
InstrumentTrack's MidiPort is now accessible via getMidiPort() so
there's no need for keeping presetPreviewPlayHandle a friend class
anymore.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit a6090ebe23)
Proteus VX requires SplittedThreading model in order to run properly.
Issues with actually working UI interaction still need to be worked
out although it rather looks like a bug in WINE.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit b3c5d498e2)
Fixed compilation failure of FLTK on systems with glibc newer than
version 2.9 where the signature of scandir(...) has changed.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit dc539d88de)
Fixed compilation failure of FLTK on broken systems where strchr()
takes a non-const char pointer.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit 3003163e9b)
Fixed invocation of cmake in the MinGW cross compiling script so it
works properly when doing an out-of-tree build (which should be the
default way of building LMMS).
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit 8c50e0ef9a)
Processed all Fluid UI files with Fluid from FLTK 1.3 branch so the
generated code is up to date.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit 5b1900c4d0)
Integrated FLTK 1.3.0 branch from SVN which brings UTF8 support and
fully integrated Xft support (SVN rev. 6791).
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
(cherry picked from commit 8affa66c61)
Due to optimizations in Qt 4.5 setting Qt::WA_OpaquePaintEvent attribute
for TrackView widgets caused a line of distorted pixels at the bottom of
the left part so do not set this attribute anymore (closes#2795861).
(cherry picked from commit cdcc158c03)
In ControllerConnection::finalizeConnections() we did not check whether
the current controller ID really exists in Song's controller array.
Fixes segfault when loading projects with screwed controller settings.
(cherry picked from commit 6d77f83ae9)
Removed unused variable volumeHandles in
PianoRoll::computeSelectedNotes(bool) which as a side-effect also fixes
/usr/include/qt4/QtCore/qvector.h: In member function ‘void PianoRoll::computeSelectedNotes(bool)’:
/usr/include/qt4/QtCore/qvector.h:421: warning: dereferencing pointer ‘<anonymous>’ does break strict-aliasing rules
/usr/include/qt4/QtCore/qvector.h:114: note: initialized from here
(cherry picked from commit 24353ca248)
Do not use private m_pitchModel member variable of InstrumentTrack even
if NotePlayHandle is a friend class. Instead use the already existing
InstrumentTrack::pitchModel() method.
(cherry picked from commit 9dcb62c630)
This commit fixes some calls to functions that are taking a format
string and an optional set of parameters as arguments. At some places
no format string was specified if only a simple C string was to be
sprintf()ed. However for security reasons this is bad and was replaced
by code like
sprintf( dest, "%s", str );
(cherry picked from commit af284e980f)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by the
Free Software Foundation; either version 2 of the License, or (at your option)
any later version.
This program is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
details.
You should have received a copy of the GNU General Public License along
with this program; if not, write to the Free Software Foundation, Inc.,
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
What is LMMS?
--------------
LMMS is a free cross-platform alternative to commercial programs like FL Studio (R), which allow you to produce music with your computer. This includes the creation of melodies and beats, the synthesis and mixing of sounds, and arranging of samples. You can have fun with your MIDI-keyboard and much more; all in a user-friendly and modern interface.
Features
---------
* Song-Editor for composing songs
* A Beat+Bassline-Editor for creating beats and basslines
* An easy-to-use Piano-Roll for editing patterns and melodies
* An FX mixer with 64 FX channels and arbitrary number of effects allow unlimited mixing possibilities
* Many powerful instrument and effect-plugins out of the box
* Full user-defined track-based automation and computer-controlled automation sources
* Compatible with many standards such as SoundFont2, VST(i), LADSPA, GUS Patches, and full MIDI support
* Import of MIDI and FLP (Fruityloops(R) Project) files
Requirements
------------
The most important requirement is for sure a fast computer, so don't try to get
LMMS working on a pentium I with 60 MHz... ;-) Therefore you should have at
least 500 MHz, but for really enjoying LMMS less than 1 GHz makes no sense...
Required libraries:
- Qt >= 4.3.0 with devel-files (4.4.x recommended)
Optional, but strongly recommended:
- JACK with devel-files
- libvorbis & libogg with devel-files
- libalsa with devel-files
- SDL with devel-files
- libsamplerate >= 0.1.7 with devel-files
- libsndfile with devel-files
- WINE + WINE-devel-files
- stk, libstk + libstk-dev
- libfluidsynth with devel files
- fftw3 with devel-files
For compiling you should have an up to date GCC with g++.
If you have problems with compiling or running LMMS, find any bug or have
suggestions and so on, please feel free to e-mail me (for mail-address see
below)!
Building
---------
See INSTALL for information on how to build LMMS.
Join LMMS-development
----------------------
If you are interested in LMMS, it's programming, artwork, testing, writing
demo-songs, (and improving this README...) or something like that,
you're welcome to participate on the development of LMMS!
The project-homepage of LMMS, mailingslists and a list of things you can do
can be found at
http://lmms.sourceforge.net
Details on development can be found at
http://lmms.sourceforge.net/development.php
or in the Wiki:
http://lmms.sourceforge.net/wiki/
Before coding a new big feature, please ALWAYS post your idea and suggestions
about your feature and about the intended implementation to the
LMMS-devel-mailinglist (lmms-devel@lists.sourceforge.net) and wait for replies!
Maybe there're different ideas, improvements, hints or maybe your feature is
d="m 10,-30 c -1.108,0 -2,0.892 -2,2 l 0,56 c 0,1.108 0.892,2 2,2 l 44,0 c 1.108,0 2,-0.892 2,-2 l 0,-43 c 0,-1 -1,-2 -1,-2 L 43,-29 c 0,0 -1,-1 -2,-1 z"
MESSAGE(STATUS"Bash completion script for ${SCRIPT_NAME} will be installed to ${BASHCOMP_PKG_PATH} or fallback to ${BASHCOMP_USER_PATH} if unwritable.")
echo"Connecting to $PPA_HOST to get list of packages..."
wget -qO- $PPA_URL|grep "Filename:" > $temp_file
for j in $skip_files;do
grep -v $j$temp_file > $temp_temp_file
mv $temp_temp_file$temp_file
done
line_count=`wc -l $temp_file|awk '{print $1}'`
echo"Found $line_count packages for download..."
echo"Downloading packages. They will be saved to $ppa_dir"
mkdir $ppa_dir
for j in `cat $temp_file`;do
if["$j"="Filename:"];then
continue
fi
echo"Downloading $j..."
wget -O $ppa_dir$(basename $j)$PPA_ROOT/$j
done
echo"Cleaning up temporary files..."
rm -rf $temp_file
echo"Packages have been saved to $ppa_dir. Please run extract_debs.sh"
Some files were not shown because too many files have changed in this diff
Show More
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.