Instead of doing a whole string comparison against "", use
QString::isEmpty() which is both faster and better style.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
It's not a good idea to have a separate constant determining the number
of items in an enumeration because you can easily get inconsistencies.
Use the last element of enumeration as NumActions constant instead.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
Sizing of the columns in the action table corrected in the
setup dialog for MidiControlListener.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
This adds some nearly-standard keys and controllers to give new users
a hint how the MIDI remote control works.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
Implements the MCL actions JumpToLoopStart and JumpToLoopEnd which
update the position in the via the timeLine object.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
MidiControlListener's toggleLoop action makes the song object emit a
loopPointsChanged signal, which timeLine connects to and enables or
disables the loop points accordingly.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
LMMS didn't compile successfully if individual paths to headers of
each Qt module were not added to the list of include directories to be
searched by the pre-processor. However it has to work this way,
therefore I changed lines like
#include <QGraphicsScene>
to
#include <QtGui/QGraphicsScene>
Please care in the future!
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
Do not save configuration file in destructor of ConfigManager as
at this place the whole LMMS engine already has been shutdown and
thus saving e.g. configuration of MidiControlListener causes a
segfault. Instead explicitely save configuration file at the
beginning of Engine::destroy().
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
The MIDI device(s) where the MidiControlListener can receive events from
can now be configured in the setup dialog.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
Moved the code to unsubscribe all readable and/or writeable ports to own
methods and thus made them publically available to avoid duplicate code.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
Changed MidiControlListener to use the built-in API to save and restore
the midiPort configuration instead and removed the old iterator.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
Introduces a new class, DummyMidiEventProcessor, that does nothing but
update the baseNoteModel upon keypress.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
elementsByTagName() may return an empty list thought there should be
elements. As the reason and circumstances of the method for doing so
are unclear, an iterator approach is used instead
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
Adds GUI elements to the global setup dialog to configure remote
controlling of LMMS via MIDI. The GUI is not yet fully functional,
though.
Signed-off-by: Tobias Doerffel <tobias.doerffel@gmail.com>
Moved baseNoteModel from InstrumentTrack class to MidiEventProcessor
class in order to make Piano class independent from InstrumentTrack
class (so it can be used by other classes as well).
Furthermore did various cleanups and coding style improvements.
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).
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.
So far the type and basedir properties were saved as numbers (as they
are defined in internal enumeration). This is bad style so these
properties are now translated into a human-readable string when saving
and back to internal enumeration type when loading.
Always create an instance of AutomationRecorder in Engine class as
it is not related to GUI at all. Fixes crash when rendering a project
in console-only mode.
Added a new LCD spinbox which allows to control the range of the pitch
knob. This way it's possible to extend the range of the pitch knob up
to 24 semitones in each direction.
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
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.
LV2 core was not compiled conditionally into LMMS binary so compilation
failed when building without LV2 support. Furthermore added
compatibility code for SLV2 <= 0.6.2.
MidiControlListener is MidiEventProcessor that listens for specific
MIDI events in order to control LMMS' transportation (currently only
start/stop). Can be advanced later to control other things in LMMS.
Make progress dialog when loading project a proper sub-window of LMMS
by passing main window as parent to constructor of QProgressDialog.
Fixes default window icon and additional taskbar item.
Added new stringPairDrag type "pluginpresetfile", allowing to drag
and drop any kind of plugin-specific preset files everywhere in the
program. Adopted changes in ZynAddSubFX plugin.
For each model but the tempoSyncKnobModel the name property was properly
passed to the according constructor. This made time-based knobs in LADSPA
effects have no internal name, e.g. there were blank captions in the
knob's context menu or empty titles when used in combination with
automation patterns.
Do not add empty subwindows for effects that do not have a control
dialog at all (i.e. Effect::getControlCount() == 0). Also check whether
creation of control dialog was successful. Fixes possible crashes if
something went wrong with the effect (e.g. loading VST effect failed).
Allows you to record automation by arming an automatable model
and then recording with the RecordAndPlay button.
Known bugs:
* when you record and there is already an auto clip, it repeats it
* it freezes when you try to do it with the Volume or Panning slider
* crashes when you try to do it with a solo/mute button
When closing an InstrumentTrackWindow make sure it doesn't still have
keyboard focus (looks like a bug in Qt) and set focus on
trackLabelButton instead (closes#2780590).
When closing a InstrumentTrackWindow save its position so it can be
restored later when showing it. Fixes windows always popping up
somewhere else when toggling instrument track button repeatedly.
When starting LMMS, loading an existing project and opening a pattern
with notes inside in piano roll, moving single notes showed unexpected
behaviour, i.e. the according note has been moved somewhere unreachable.
I tracked this down to a missing initialization of m_moveBoundary*
variables. Adding a few lines fixes the issue (closes#2632909).