From 3a827f061f71541d7373ee9453f14a4a9425a11d Mon Sep 17 00:00:00 2001 From: Tobias Doerffel Date: Sat, 25 Jan 2014 23:52:25 +0100 Subject: [PATCH] Reworked MIDI event handling in InstrumentTrack and renamed MIDI classes 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. --- include/AutomationEditor.h | 8 +- include/AutomationPattern.h | 14 +- include/AutomationTrack.h | 4 +- include/Instrument.h | 6 +- include/InstrumentTrack.h | 12 +- include/{midi.h => Midi.h} | 144 +-------------- include/MidiAlsaSeq.h | 6 +- include/MidiClient.h | 14 +- include/MidiController.h | 8 +- include/MidiEvent.h | 209 ++++++++++++++++++++++ include/MidiEventProcessor.h | 14 +- include/MidiPort.h | 15 +- include/{midi_time.h => MidiTime.h} | 58 +++--- include/MidiWinMM.h | 6 +- include/RemotePlugin.h | 11 +- include/SampleRecordHandle.h | 2 +- include/SampleTrack.h | 8 +- include/TrackContainerView.h | 6 +- include/bb_track.h | 4 +- include/bb_track_container.h | 2 +- include/note.h | 40 ++--- include/note_play_handle.h | 24 ++- include/panning.h | 4 +- include/pattern.h | 4 +- include/piano_roll.h | 14 +- include/song.h | 4 +- include/song_editor.h | 2 +- include/timeline.h | 26 +-- include/track.h | 36 ++-- include/volume.h | 4 +- plugins/flp_import/FlpImport.cpp | 3 +- plugins/midi_import/MidiImport.cpp | 13 +- plugins/midi_import/MidiImport.h | 6 +- plugins/opl2/opl2instrument.cpp | 23 ++- plugins/opl2/opl2instrument.h | 3 +- plugins/vestige/vestige.cpp | 8 +- plugins/vestige/vestige.h | 6 +- plugins/zynaddsubfx/LocalZynAddSubFx.cpp | 32 ++-- plugins/zynaddsubfx/LocalZynAddSubFx.h | 5 +- plugins/zynaddsubfx/RemoteZynAddSubFx.cpp | 7 +- plugins/zynaddsubfx/ZynAddSubFx.cpp | 16 +- plugins/zynaddsubfx/ZynAddSubFx.h | 3 +- src/core/AutomationPattern.cpp | 18 +- src/core/InstrumentFunctions.cpp | 2 +- src/core/Piano.cpp | 5 +- src/core/RemotePlugin.cpp | 12 +- src/core/SampleRecordHandle.cpp | 2 +- src/core/bb_track_container.cpp | 12 +- src/core/midi/MidiAlsaSeq.cpp | 80 ++++----- src/core/midi/MidiClient.cpp | 57 +++--- src/core/midi/MidiController.cpp | 11 +- src/core/midi/MidiPort.cpp | 58 +++--- src/core/midi/MidiWinMM.cpp | 18 +- src/core/note.cpp | 8 +- src/core/note_play_handle.cpp | 48 +++-- src/core/song.cpp | 8 +- src/core/timeline.cpp | 16 +- src/core/track.cpp | 80 ++++----- src/gui/AutomationEditor.cpp | 33 ++-- src/gui/AutomationPatternView.cpp | 6 +- src/gui/ControllerConnectionDialog.cpp | 10 +- src/gui/PianoView.cpp | 14 +- src/gui/TrackContainerView.cpp | 4 +- src/gui/piano_roll.cpp | 126 +++++++------ src/gui/song_editor.cpp | 22 +-- src/tracks/AutomationTrack.cpp | 10 +- src/tracks/InstrumentTrack.cpp | 206 +++++++++------------ src/tracks/SampleTrack.cpp | 8 +- src/tracks/bb_track.cpp | 12 +- src/tracks/pattern.cpp | 72 ++++---- 70 files changed, 901 insertions(+), 891 deletions(-) rename include/{midi.h => Midi.h} (53%) create mode 100644 include/MidiEvent.h rename include/{midi_time.h => MidiTime.h} (62%) diff --git a/include/AutomationEditor.h b/include/AutomationEditor.h index d725366a4..1e37cd9b4 100644 --- a/include/AutomationEditor.h +++ b/include/AutomationEditor.h @@ -31,7 +31,7 @@ #include "lmms_basics.h" #include "JournallingObject.h" -#include "midi_time.h" +#include "MidiTime.h" #include "AutomationPattern.h" #include "ComboBoxModel.h" @@ -127,7 +127,7 @@ protected slots: void pasteValues(); void deleteSelectedValues(); - void updatePosition( const midiTime & _t ); + void updatePosition( const MidiTime & _t ); void zoomingXChanged(); void zoomingYChanged(); @@ -218,7 +218,7 @@ private: QScrollBar * m_leftRightScroll; QScrollBar * m_topBottomScroll; - midiTime m_currentPosition; + MidiTime m_currentPosition; actions m_action; @@ -258,7 +258,7 @@ private: signals: void currentPatternChanged(); - void positionChanged( const midiTime & ); + void positionChanged( const MidiTime & ); } ; diff --git a/include/AutomationPattern.h b/include/AutomationPattern.h index 8b11c332c..ea20bb3a0 100644 --- a/include/AutomationPattern.h +++ b/include/AutomationPattern.h @@ -33,7 +33,7 @@ class AutomationTrack; -class midiTime; +class MidiTime; @@ -72,12 +72,12 @@ public: } void setTension( QString _new_tension ); - virtual midiTime length() const; + virtual MidiTime length() const; - midiTime putValue( const midiTime & _time, const float _value, + MidiTime putValue( const MidiTime & _time, const float _value, const bool _quant_pos = true ); - void removeValue( const midiTime & _time ); + void removeValue( const MidiTime & _time ); inline const timeMap & getTimeMap() const { @@ -104,8 +104,8 @@ public: return m_timeMap.isEmpty() == false; } - float valueAt( const midiTime & _time ) const; - float *valuesAfter( const midiTime & _time ) const; + float valueAt( const MidiTime & _time ) const; + float *valuesAfter( const MidiTime & _time ) const; const QString name() const; @@ -123,7 +123,7 @@ public: return classNodeName(); } - void processMidiTime( const midiTime & _time ); + void processMidiTime( const MidiTime & _time ); virtual trackContentObjectView * createView( trackView * _tv ); diff --git a/include/AutomationTrack.h b/include/AutomationTrack.h index 834174ece..a4c44b302 100644 --- a/include/AutomationTrack.h +++ b/include/AutomationTrack.h @@ -36,7 +36,7 @@ public: AutomationTrack( TrackContainer* tc, bool _hidden = false ); virtual ~AutomationTrack(); - virtual bool play( const midiTime & _start, const fpp_t _frames, + virtual bool play( const MidiTime & _start, const fpp_t _frames, const f_cnt_t _frame_base, int _tco_num = -1 ); virtual QString nodeName() const @@ -45,7 +45,7 @@ public: } virtual trackView * createView( TrackContainerView* ); - virtual trackContentObject * createTCO( const midiTime & _pos ); + virtual trackContentObject * createTCO( const MidiTime & _pos ); virtual void saveTrackSpecificSettings( QDomDocument & _doc, QDomElement & _parent ); diff --git a/include/Instrument.h b/include/Instrument.h index 7cec41019..f0ff145c2 100644 --- a/include/Instrument.h +++ b/include/Instrument.h @@ -35,8 +35,8 @@ // forward-declarations class InstrumentTrack; class InstrumentView; -class midiEvent; -class midiTime; +class MidiEvent; +class MidiTime; class notePlayHandle; class track; @@ -99,7 +99,7 @@ public: // sub-classes can re-implement this for receiving all incoming // MIDI-events - inline virtual bool handleMidiEvent( const midiEvent &, const midiTime & ) + inline virtual bool handleMidiEvent( const MidiEvent&, const MidiTime& = MidiTime() ) { return false; } diff --git a/include/InstrumentTrack.h b/include/InstrumentTrack.h index 3514b0aa7..0217cb19a 100644 --- a/include/InstrumentTrack.h +++ b/include/InstrumentTrack.h @@ -69,12 +69,10 @@ public: void processAudioBuffer( sampleFrame * _buf, const fpp_t _frames, notePlayHandle * _n ); - midiEvent applyMasterKey( const midiEvent & _me ); + MidiEvent applyMasterKey( const MidiEvent& event ); - virtual void processInEvent( const midiEvent & _me, - const midiTime & _time ); - virtual void processOutEvent( const midiEvent & _me, - const midiTime & _time ); + virtual void processInEvent( const MidiEvent& event, const MidiTime& time = MidiTime() ); + virtual void processOutEvent( const MidiEvent& event, const MidiTime& time = MidiTime() ); // silence all running notes played by this track void silenceAllNotes(); @@ -117,13 +115,13 @@ public: } // play everything in given frame-range - creates note-play-handles - virtual bool play( const midiTime & _start, const fpp_t _frames, + virtual bool play( const MidiTime & _start, const fpp_t _frames, const f_cnt_t _frame_base, int _tco_num = -1 ); // create new view for me virtual trackView * createView( TrackContainerView* tcv ); // create new track-content-object = pattern - virtual trackContentObject * createTCO( const midiTime & _pos ); + virtual trackContentObject * createTCO( const MidiTime & _pos ); // called by track diff --git a/include/midi.h b/include/Midi.h similarity index 53% rename from include/midi.h rename to include/Midi.h index 09a9afa1b..25a9fecc8 100644 --- a/include/midi.h +++ b/include/Midi.h @@ -1,7 +1,7 @@ /* - * midi.h - constants, structs etc. concerning MIDI + * Midi.h - constants, structs etc. concerning MIDI * - * Copyright (c) 2005-2013 Tobias Doerffel + * Copyright (c) 2005-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -26,8 +26,6 @@ #define _MIDI_H #include "lmms_basics.h" -#include "panning_constants.h" -#include enum MidiEventTypes @@ -60,7 +58,7 @@ enum MidiEventTypes MidiMetaEvent = 0xFF } ; -enum MidiMetaEvents +enum MidiMetaEventTypes { MidiMetaInvalid = 0x00, MidiCopyright = 0x02, @@ -79,6 +77,7 @@ enum MidiMetaEvents MidiMetaCustom = 0x80, MidiNotePanning } ; +typedef MidiMetaEventTypes MidiMetaEventType; enum MidiStandardControllers @@ -120,139 +119,4 @@ const int MidiMaxNote = 127; const int MidiMaxPanning = 127; const int MidiMinPanning = -128; - -struct midiEvent -{ - midiEvent( MidiEventTypes _type = MidiActiveSensing, - int8_t _channel = 0, - int16_t _param1 = 0, - int16_t _param2 = 0, - const void * _sourcePort = NULL ) : - m_type( _type ), - m_metaEvent( MidiMetaInvalid ), - m_channel( _channel ), - m_sysExData( NULL ), - m_sourcePort( _sourcePort ), - m_fromMidiPort( false ) - { - m_data.m_param[0] = _param1; - m_data.m_param[1] = _param2; - } - - midiEvent( MidiEventTypes _type, const char * _sysex_data, - int _data_len ) : - m_type( _type ), - m_metaEvent( MidiMetaInvalid ), - m_channel( 0 ), - m_sysExData( _sysex_data ), - m_sourcePort( NULL ), - m_fromMidiPort( false ) - { - m_data.m_sysExDataLen = _data_len; - } - - midiEvent( const midiEvent & _copy ) : - m_type( _copy.m_type ), - m_metaEvent( _copy.m_metaEvent ), - m_channel( _copy.m_channel ), - m_data( _copy.m_data ), - m_sysExData( _copy.m_sysExData ), - m_sourcePort( _copy.m_sourcePort ), - m_fromMidiPort( _copy.m_fromMidiPort ) - { - } - - inline MidiEventTypes type() const - { - return m_type; - } - - inline int channel() const - { - return m_channel; - } - - inline int16_t key() const - { - return m_data.m_param[0]; - } - - inline int16_t & key() - { - return m_data.m_param[0]; - } - - inline uint8_t controllerNumber() const - { - return m_data.m_param[0]; - } - - inline uint8_t controllerValue() const - { - return m_data.m_param[1]; - } - - inline int16_t velocity() const - { - return m_data.m_param[1]; - } - - inline int16_t & velocity() - { - return m_data.m_param[1]; - } - - inline int16_t midiPanning() const - { - return m_data.m_param[1]; - } - - inline volume_t getVolume() const - { - return (volume_t)( velocity() * 100 / MidiMaxVelocity ); - } - - inline const void * sourcePort() const - { - return m_sourcePort; - } - - inline panning_t getPanning() const - { - return (panning_t) ( PanningLeft + - ( (float)( midiPanning() - MidiMinPanning ) ) / - ( (float)( MidiMaxPanning - MidiMinPanning ) ) * - ( (float)( PanningRight - PanningLeft ) ) ); - } - - void setFromMidiPort( bool enabled ) - { - m_fromMidiPort = enabled; - } - - bool isFromMidiPort() const - { - return m_fromMidiPort; - } - - MidiEventTypes m_type; // MIDI event type - MidiMetaEvents m_metaEvent; // Meta event (mostly unused) - int8_t m_channel; // MIDI channel - union - { - int16_t m_param[2]; // first/second parameter (key/velocity) - uint8_t m_bytes[4]; // raw bytes - int32_t m_sysExDataLen; // len of m_sysExData - } m_data; - - const char * m_sysExData; - const void * m_sourcePort; - - -private: - bool m_fromMidiPort; - -} ; - - #endif diff --git a/include/MidiAlsaSeq.h b/include/MidiAlsaSeq.h index 13d250c3f..70640ae3a 100644 --- a/include/MidiAlsaSeq.h +++ b/include/MidiAlsaSeq.h @@ -62,8 +62,8 @@ public: - virtual void processOutEvent( const midiEvent & _me, - const midiTime & _time, + virtual void processOutEvent( const MidiEvent & _me, + const MidiTime & _time, const MidiPort * _port ); virtual void applyPortMode( MidiPort * _port ); @@ -84,7 +84,7 @@ public: } // return name of port which specified MIDI event came from - virtual QString sourcePortName( const midiEvent & ) const; + virtual QString sourcePortName( const MidiEvent & ) const; // (un)subscribe given MidiPort to/from destination-port virtual void subscribeReadablePort( MidiPort * _port, diff --git a/include/MidiClient.h b/include/MidiClient.h index b8f0b459a..2888999ac 100644 --- a/include/MidiClient.h +++ b/include/MidiClient.h @@ -29,7 +29,7 @@ #include -#include "midi.h" +#include "MidiEvent.h" #include "MidiEventProcessor.h" #include "tab_widget.h" @@ -45,8 +45,8 @@ public: virtual ~MidiClient(); // to be implemented by sub-classes - virtual void processOutEvent( const midiEvent & _me, - const midiTime & _time, + virtual void processOutEvent( const MidiEvent & _me, + const MidiTime & _time, const MidiPort * _port ) = 0; // inheriting classes can re-implement this for being able to update @@ -78,13 +78,13 @@ public: } // return name of port which specified MIDI event came from - virtual QString sourcePortName( const midiEvent & ) const + virtual QString sourcePortName( const MidiEvent & ) const { return QString(); } - // (un)subscribe given MidiPort to/from destination-port + // (un)subscribe given MidiPort to/from destination-port virtual void subscribeReadablePort( MidiPort * _port, const QString & _dest, bool _subscribe = true ); @@ -167,7 +167,7 @@ protected: private: // this does MIDI-event-process void processParsedEvent(); - virtual void processOutEvent( const midiEvent& event, const midiTime& time, const MidiPort* port ); + virtual void processOutEvent( const MidiEvent& event, const MidiTime& time, const MidiPort* port ); // small helper function returning length of a certain event - this // is necessary for parsing raw-MIDI-data @@ -188,7 +188,7 @@ private: // event type include? uint32_t m_buffer[RAW_MIDI_PARSE_BUF_SIZE]; // buffer for incoming data - midiEvent m_midiEvent; // midi-event + MidiEvent m_midiEvent; // midi-event } m_midiParseData; } ; diff --git a/include/MidiController.h b/include/MidiController.h index f9d3a0d33..2271e8659 100644 --- a/include/MidiController.h +++ b/include/MidiController.h @@ -43,11 +43,11 @@ public: MidiController( Model * _parent ); virtual ~MidiController(); - virtual void processInEvent( const midiEvent & _me, - const midiTime & _time ); + virtual void processInEvent( const MidiEvent & _me, + const MidiTime & _time ); - virtual void processOutEvent( const midiEvent& _me, - const midiTime & _time) + virtual void processOutEvent( const MidiEvent& _me, + const MidiTime & _time) { // No output yet } diff --git a/include/MidiEvent.h b/include/MidiEvent.h new file mode 100644 index 000000000..38bf33f90 --- /dev/null +++ b/include/MidiEvent.h @@ -0,0 +1,209 @@ +/* + * MidiEvent.h - MidiEvent class + * + * Copyright (c) 2005-2014 Tobias Doerffel + * + * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net + * + * 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 (see COPYING); if not, write to the + * Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, + * Boston, MA 02110-1301 USA. + * + */ + +#ifndef _MIDI_EVENT_H +#define _MIDI_EVENT_H + +#include +#include "Midi.h" +#include "panning_constants.h" + +class MidiEvent +{ +public: + MidiEvent( MidiEventTypes type = MidiActiveSensing, + int8_t channel = 0, + int16_t param1 = 0, + int16_t param2 = 0, + const void* sourcePort = NULL ) : + m_type( type ), + m_metaEvent( MidiMetaInvalid ), + m_channel( channel ), + m_sysExData( NULL ), + m_sourcePort( sourcePort ) + { + m_data.m_param[0] = param1; + m_data.m_param[1] = param2; + } + + MidiEvent( MidiEventTypes type, const char* sysExData, int dataLen ) : + m_type( type ), + m_metaEvent( MidiMetaInvalid ), + m_channel( 0 ), + m_sysExData( sysExData ), + m_sourcePort( NULL ) + { + m_data.m_sysExDataLen = dataLen; + } + + MidiEvent( const MidiEvent& other ) : + m_type( other.m_type ), + m_metaEvent( other.m_metaEvent ), + m_channel( other.m_channel ), + m_data( other.m_data ), + m_sysExData( other.m_sysExData ), + m_sourcePort( other.m_sourcePort ) + { + } + + MidiEventTypes type() const + { + return m_type; + } + + void setType( MidiEventTypes type ) + { + m_type = type; + } + + void setMetaEvent( MidiMetaEventType metaEvent ) + { + m_metaEvent = metaEvent; + } + + MidiMetaEventType metaEvent() const + { + return m_metaEvent; + } + + int8_t channel() const + { + return m_channel; + } + + void setChannel( int8_t channel ) + { + m_channel = channel; + } + + int16_t param( int i ) const + { + return m_data.m_param[i]; + } + + void setParam( int i, uint16_t value ) + { + m_data.m_param[i] = value; + } + + int16_t key() const + { + return param( 0 ); + } + + void setKey( int16_t key ) + { + m_data.m_param[0] = key; + } + + uint8_t velocity() const + { + return m_data.m_param[1] & 0x7F; + } + + void setVelocity( int16_t velocity ) + { + m_data.m_param[1] = velocity; + } + + panning_t panning() const + { + return (panning_t) ( PanningLeft + + ( (float)( midiPanning() - MidiMinPanning ) ) / + ( (float)( MidiMaxPanning - MidiMinPanning ) ) * + ( (float)( PanningRight - PanningLeft ) ) ); + } + int16_t midiPanning() const + { + return m_data.m_param[1]; + } + + volume_t volume() const + { + return (volume_t)( velocity() * 100 / MidiMaxVelocity ); + } + + const void* sourcePort() const + { + return m_sourcePort; + } + + uint8_t controllerNumber() const + { + return param( 0 ) & 0x7F; + } + + void setControllerNumber( uint8_t num ) + { + setParam( 0, num ); + } + + uint8_t controllerValue() const + { + return param( 1 ); + } + + void setControllerValue( uint8_t value ) + { + setParam( 1, value ); + } + + uint8_t program() const + { + return param( 0 ); + } + + uint8_t channelPressure() const + { + return param( 0 ); + } + + int16_t pitchBend() const + { + return param( 0 ); + } + + void setPitchBend( uint16_t pitchBend ) + { + setParam( 0, pitchBend ); + } + + +private: + MidiEventTypes m_type; // MIDI event type + MidiMetaEventType m_metaEvent; // Meta event (mostly unused) + int8_t m_channel; // MIDI channel + union + { + int16_t m_param[2]; // first/second parameter (key/velocity) + uint8_t m_bytes[4]; // raw bytes + int32_t m_sysExDataLen; // len of m_sysExData + } m_data; + + const char* m_sysExData; + const void* m_sourcePort; + +} ; + +#endif diff --git a/include/MidiEventProcessor.h b/include/MidiEventProcessor.h index 1b3d0dd33..dafcfb6cd 100644 --- a/include/MidiEventProcessor.h +++ b/include/MidiEventProcessor.h @@ -25,27 +25,25 @@ #ifndef _MIDI_EVENT_PROCESSOR_H #define _MIDI_EVENT_PROCESSOR_H -class midiEvent; -class midiTime; +#include "MidiEvent.h" +#include "MidiTime.h" // all classes being able to process MIDI-events should inherit from this class MidiEventProcessor { public: - inline MidiEventProcessor() + MidiEventProcessor() { } - virtual inline ~MidiEventProcessor() + virtual ~MidiEventProcessor() { } // to be implemented by inheriting classes - virtual void processInEvent( const midiEvent & _me, - const midiTime & _time ) = 0; - virtual void processOutEvent( const midiEvent & _me, - const midiTime & _time ) = 0; + virtual void processInEvent( const MidiEvent& event, const MidiTime& time = MidiTime() ) = 0; + virtual void processOutEvent( const MidiEvent& event, const MidiTime& time = MidiTime() ) = 0; } ; diff --git a/include/MidiPort.h b/include/MidiPort.h index a5b1aee0e..c407f1f8f 100644 --- a/include/MidiPort.h +++ b/include/MidiPort.h @@ -1,8 +1,8 @@ /* - * MidiPort.h - abstraction of MIDI ports which are part of LMMS's MIDI- + * MidiPort.h - abstraction of MIDI ports which are part of LMMS' MIDI * sequencing system * - * Copyright (c) 2005-2009 Tobias Doerffel + * Copyright (c) 2005-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -28,16 +28,17 @@ #include #include -#include +#include -#include "midi.h" +#include "Midi.h" +#include "MidiTime.h" #include "AutomatableModel.h" class MidiClient; +class MidiEvent; class MidiEventProcessor; class MidiPortMenu; -class midiTime; // class for abstraction of MIDI-port @@ -104,8 +105,8 @@ public: return outputChannel() - 1; } - void processInEvent( const midiEvent & _me, const midiTime & _time ); - void processOutEvent( const midiEvent & _me, const midiTime & _time ); + void processInEvent( const MidiEvent& event, const MidiTime& time = MidiTime() ); + void processOutEvent( const MidiEvent& event, const MidiTime& time = MidiTime() ); virtual void saveSettings( QDomDocument & _doc, QDomElement & _parent ); diff --git a/include/midi_time.h b/include/MidiTime.h similarity index 62% rename from include/midi_time.h rename to include/MidiTime.h index f7f857624..9a86f3b48 100644 --- a/include/midi_time.h +++ b/include/MidiTime.h @@ -1,8 +1,8 @@ /* - * midi_time.h - declaration of class midiTime which provides data-type for - * position- and length-variables + * MidiTime.h - declaration of class MidiTime which provides data type for + * position- and length-variables * - * Copyright (c) 2004-2009 Tobias Doerffel + * Copyright (c) 2004-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -35,25 +35,25 @@ const int DefaultStepsPerTact = 16; const int DefaultBeatsPerTact = DefaultTicksPerTact / DefaultStepsPerTact; -class EXPORT midiTime +class EXPORT MidiTime { public: - inline midiTime( const tact_t _tact, const tick_t _ticks ) : - m_ticks( _tact * s_ticksPerTact + _ticks ) + MidiTime( const tact_t tact, const tick_t ticks ) : + m_ticks( tact * s_ticksPerTact + ticks ) { } - inline midiTime( const tick_t _ticks = 0 ) : - m_ticks( _ticks ) + MidiTime( const tick_t ticks = 0 ) : + m_ticks( ticks ) { } - inline midiTime( const midiTime & _t ) : - m_ticks( _t.m_ticks ) + MidiTime( const MidiTime& time ) : + m_ticks( time.m_ticks ) { } - inline midiTime toNearestTact() const + MidiTime toNearestTact() const { if( m_ticks % s_ticksPerTact >= s_ticksPerTact/2 ) { @@ -62,30 +62,30 @@ public: return getTact() * s_ticksPerTact; } - inline midiTime & operator=( const midiTime & _t ) + MidiTime& operator=( const MidiTime& time ) { - m_ticks = _t.m_ticks; + m_ticks = time.m_ticks; return *this; } - inline midiTime & operator+=( const midiTime & _t ) + MidiTime& operator+=( const MidiTime& time ) { - m_ticks += _t.m_ticks; + m_ticks += time.m_ticks; return *this; } - inline midiTime & operator-=( const midiTime & _t ) + MidiTime& operator-=( const MidiTime& time ) { - m_ticks -= _t.m_ticks; + m_ticks -= time.m_ticks; return *this; } - inline tact_t getTact() const + tact_t getTact() const { return m_ticks / s_ticksPerTact; } - inline tact_t nextFullTact() const + tact_t nextFullTact() const { if( m_ticks % s_ticksPerTact == 0 ) { @@ -94,37 +94,34 @@ public: return m_ticks / s_ticksPerTact + 1; } - inline void setTicks( tick_t _t ) + void setTicks( tick_t ticks ) { - m_ticks = _t; + m_ticks = ticks; } - inline tick_t getTicks() const + tick_t getTicks() const { return m_ticks; } - inline operator int() const + operator int() const { return m_ticks; } // calculate number of frame that are needed this time - inline f_cnt_t frames( const float _frames_per_tick ) const + f_cnt_t frames( const float framesPerTick ) const { if( m_ticks >= 0 ) { - return static_cast( m_ticks * - _frames_per_tick ); + return static_cast( m_ticks * framesPerTick ); } return 0; } - static inline midiTime fromFrames( const f_cnt_t _frames, - const float _frames_per_tick ) + static MidiTime fromFrames( const f_cnt_t frames, const float framesPerTick ) { - return midiTime( static_cast( _frames / - _frames_per_tick ) ); + return MidiTime( static_cast( frames / framesPerTick ) ); } @@ -143,6 +140,7 @@ public: s_ticksPerTact = _tpt; } + private: tick_t m_ticks; diff --git a/include/MidiWinMM.h b/include/MidiWinMM.h index 51cccae71..54b6bdf0d 100644 --- a/include/MidiWinMM.h +++ b/include/MidiWinMM.h @@ -56,8 +56,8 @@ public: - virtual void processOutEvent( const midiEvent & _me, - const midiTime & _time, + virtual void processOutEvent( const MidiEvent & _me, + const MidiTime & _time, const MidiPort * _port ); virtual void applyPortMode( MidiPort * _port ); @@ -78,7 +78,7 @@ public: #endif // return name of port which specified MIDI event came from - virtual QString sourcePortName( const midiEvent & ) const; + virtual QString sourcePortName( const MidiEvent & ) const; // (un)subscribe given MidiPort to/from destination-port virtual void subscribeReadablePort( MidiPort * _port, diff --git a/include/RemotePlugin.h b/include/RemotePlugin.h index 46ffc5e15..8eb097ebd 100644 --- a/include/RemotePlugin.h +++ b/include/RemotePlugin.h @@ -1,7 +1,7 @@ /* * RemotePlugin.h - base class providing RPC like mechanisms * - * Copyright (c) 2008-2012 Tobias Doerffel + * Copyright (c) 2008-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -26,7 +26,7 @@ #define _REMOTE_PLUGIN_H #include "export.h" -#include "midi.h" +#include "MidiEvent.h" #include "VST_sync_shm.h" #include @@ -724,7 +724,7 @@ public: bool process( const sampleFrame * _in_buf, sampleFrame * _out_buf ); - void processMidiEvent( const midiEvent &, const f_cnt_t _offset ); + void processMidiEvent( const MidiEvent&, const f_cnt_t _offset ); void updateSampleRate( sample_rate_t _sr ) { @@ -820,8 +820,7 @@ public: virtual void process( const sampleFrame * _in_buf, sampleFrame * _out_buf ) = 0; - virtual void processMidiEvent( const midiEvent &, - const f_cnt_t /* _offset */ ) + virtual void processMidiEvent( const MidiEvent&, const f_cnt_t /* _offset */ ) { } @@ -1120,7 +1119,7 @@ bool RemotePluginClient::processMessage( const message & _m ) case IdMidiEvent: processMidiEvent( - midiEvent( static_cast( + MidiEvent( static_cast( _m.getInt( 0 ) ), _m.getInt( 1 ), _m.getInt( 2 ), diff --git a/include/SampleRecordHandle.h b/include/SampleRecordHandle.h index 465005fbe..6ff8a3d63 100644 --- a/include/SampleRecordHandle.h +++ b/include/SampleRecordHandle.h @@ -61,7 +61,7 @@ private: typedef QList > bufferList; bufferList m_buffers; f_cnt_t m_framesRecorded; - midiTime m_minLength; + MidiTime m_minLength; track * m_track; bbTrack * m_bbTrack; diff --git a/include/SampleTrack.h b/include/SampleTrack.h index 975ba2477..fed785657 100644 --- a/include/SampleTrack.h +++ b/include/SampleTrack.h @@ -43,7 +43,7 @@ public: SampleTCO( track * _track ); virtual ~SampleTCO(); - virtual void changeLength( const midiTime & _length ); + virtual void changeLength( const MidiTime & _length ); const QString & sampleFile() const; virtual void saveSettings( QDomDocument & _doc, QDomElement & _parent ); @@ -58,7 +58,7 @@ public: return m_sampleBuffer; } - midiTime sampleLength() const; + MidiTime sampleLength() const; virtual trackContentObjectView * createView( trackView * _tv ); @@ -121,10 +121,10 @@ public: SampleTrack( TrackContainer* tc ); virtual ~SampleTrack(); - virtual bool play( const midiTime & _start, const fpp_t _frames, + virtual bool play( const MidiTime & _start, const fpp_t _frames, const f_cnt_t _frame_base, int _tco_num = -1 ); virtual trackView * createView( TrackContainerView* tcv ); - virtual trackContentObject * createTCO( const midiTime & _pos ); + virtual trackContentObject * createTCO( const MidiTime & _pos ); virtual void saveTrackSpecificSettings( QDomDocument & _doc, diff --git a/include/TrackContainerView.h b/include/TrackContainerView.h index 2203fb868..a18bf5a78 100644 --- a/include/TrackContainerView.h +++ b/include/TrackContainerView.h @@ -56,7 +56,7 @@ public: return( m_scrollArea ); } - inline const midiTime & currentPosition() const + inline const MidiTime & currentPosition() const { return( m_currentPosition ); } @@ -142,7 +142,7 @@ protected: virtual void undoStep( JournalEntry & _je ); virtual void redoStep( JournalEntry & _je ); - midiTime m_currentPosition; + MidiTime m_currentPosition; private: @@ -180,7 +180,7 @@ private: signals: - void positionChanged( const midiTime & _pos ); + void positionChanged( const MidiTime & _pos ); } ; diff --git a/include/bb_track.h b/include/bb_track.h index 8b0dbff99..a4c440f4c 100644 --- a/include/bb_track.h +++ b/include/bb_track.h @@ -109,10 +109,10 @@ public: bbTrack( TrackContainer* tc ); virtual ~bbTrack(); - virtual bool play( const midiTime & _start, const fpp_t _frames, + virtual bool play( const MidiTime & _start, const fpp_t _frames, const f_cnt_t _frame_base, int _tco_num = -1 ); virtual trackView * createView( TrackContainerView* tcv ); - virtual trackContentObject * createTCO( const midiTime & _pos ); + virtual trackContentObject * createTCO( const MidiTime & _pos ); virtual void saveTrackSpecificSettings( QDomDocument & _doc, QDomElement & _parent ); diff --git a/include/bb_track_container.h b/include/bb_track_container.h index bc9bf7064..3ad0b9157 100644 --- a/include/bb_track_container.h +++ b/include/bb_track_container.h @@ -38,7 +38,7 @@ public: bbTrackContainer(); virtual ~bbTrackContainer(); - virtual bool play( midiTime _start, const fpp_t _frames, + virtual bool play( MidiTime _start, const fpp_t _frames, const f_cnt_t _frame_base, int _tco_num = -1 ); virtual void updateAfterTrackAdd(); diff --git a/include/note.h b/include/note.h index 36bf1640d..199254f9d 100644 --- a/include/note.h +++ b/include/note.h @@ -30,7 +30,7 @@ #include "volume.h" #include "panning.h" -#include "midi_time.h" +#include "MidiTime.h" #include "SerializingObject.h" class DetuningHelper; @@ -81,8 +81,8 @@ const float MaxDetuning = 4 * 12.0f; class EXPORT note : public SerializingObject { public: - note( const midiTime & _length = midiTime( 0 ), - const midiTime & _pos = midiTime( 0 ), + note( const MidiTime & _length = MidiTime( 0 ), + const MidiTime & _pos = MidiTime( 0 ), int key = DefaultKey, volume_t _volume = DefaultVolume, panning_t _panning = DefaultPanning, @@ -93,8 +93,8 @@ public: // used by GUI inline void setSelected( const bool _selected ){ m_selected = _selected; } inline void setOldKey( const int _oldKey ){ m_oldKey = _oldKey; } - inline void setOldPos( const midiTime & _oldPos ){ m_oldPos = _oldPos; } - inline void setOldLength( const midiTime & _oldLength ) + inline void setOldPos( const MidiTime & _oldPos ){ m_oldPos = _oldPos; } + inline void setOldLength( const MidiTime & _oldLength ) { m_oldLength = _oldLength; } @@ -104,11 +104,11 @@ public: } - void setLength( const midiTime & _length ); - void setPos( const midiTime & _pos ); + void setLength( const MidiTime & _length ); + void setPos( const MidiTime & _pos ); void setKey( const int _key ); - virtual void setVolume( const volume_t _volume = DefaultVolume ); - void setPanning( const panning_t _panning = DefaultPanning ); + virtual void setVolume( const volume_t volume = DefaultVolume ); + virtual void setPanning( const panning_t panning = DefaultPanning ); void quantizeLength( const int _q_grid ); void quantizePos( const int _q_grid ); @@ -129,12 +129,12 @@ public: return m_oldKey; } - inline midiTime oldPos() const + inline MidiTime oldPos() const { return m_oldPos; } - inline midiTime oldLength() const + inline MidiTime oldLength() const { return m_oldLength; } @@ -144,23 +144,23 @@ public: return m_isPlaying; } - inline midiTime endPos() const + inline MidiTime endPos() const { const int l = length(); return pos() + l; } - inline const midiTime & length() const + inline const MidiTime & length() const { return m_length; } - inline const midiTime & pos() const + inline const MidiTime & pos() const { return m_pos; } - inline midiTime pos( midiTime _base_pos ) const + inline MidiTime pos( MidiTime _base_pos ) const { const int bp = _base_pos; return m_pos - bp; @@ -191,7 +191,7 @@ public: return classNodeName(); } - static midiTime quantized( const midiTime & _m, const int _q_grid ); + static MidiTime quantized( const MidiTime & _m, const int _q_grid ); DetuningHelper * detuning() const { @@ -226,15 +226,15 @@ private: // for piano roll editing bool m_selected; int m_oldKey; - midiTime m_oldPos; - midiTime m_oldLength; + MidiTime m_oldPos; + MidiTime m_oldLength; bool m_isPlaying; int m_key; volume_t m_volume; panning_t m_panning; - midiTime m_length; - midiTime m_pos; + MidiTime m_length; + MidiTime m_pos; DetuningHelper * m_detuning; void createDetuning(); diff --git a/include/note_play_handle.h b/include/note_play_handle.h index 2c2b2e3f1..e1374276a 100644 --- a/include/note_play_handle.h +++ b/include/note_play_handle.h @@ -2,7 +2,7 @@ * note_play_handle.h - declaration of class notePlayHandle which is needed * by LMMS-Play-Engine * - * Copyright (c) 2004-2012 Tobias Doerffel + * Copyright (c) 2004-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -52,13 +52,19 @@ public: const f_cnt_t _offset, const f_cnt_t _frames, const note & _n, notePlayHandle * _parent = NULL, - const bool _part_of_arp = false ); + const bool _part_of_arp = false, + int midiChannel = -1 ); virtual ~notePlayHandle(); - virtual void setVolume( const volume_t _volume = DefaultVolume ); + virtual void setVolume( const volume_t volume = DefaultVolume ); + virtual void setPanning( const panning_t panning = DefaultPanning ); int midiVelocity() const; int midiKey() const; + int midiChannel() const + { + return m_midiChannel; + } const float & frequency() const { @@ -189,15 +195,15 @@ public: m_bbTrack = _bb_track; } - void processMidiTime( const midiTime & _time ); + void processMidiTime( const MidiTime & _time ); void resize( const bpm_t _new_tempo ); - void setSongGlobalParentOffset( const midiTime &offset ) + void setSongGlobalParentOffset( const MidiTime &offset ) { m_songGlobalParentOffset = offset; } - const midiTime &songGlobalParentOffset() const + const MidiTime &songGlobalParentOffset() const { return m_songGlobalParentOffset; } @@ -266,13 +272,15 @@ private: bpm_t m_origTempo; // original tempo f_cnt_t m_origFrames; // original m_frames - int m_origBaseNote; + const int m_origBaseNote; float m_frequency; float m_unpitchedFrequency; BaseDetuning * m_baseDetuning; - midiTime m_songGlobalParentOffset; + MidiTime m_songGlobalParentOffset; + + const int m_midiChannel; } ; diff --git a/include/panning.h b/include/panning.h index 29d2e5365..60188e3f8 100644 --- a/include/panning.h +++ b/include/panning.h @@ -2,7 +2,7 @@ * panning.h - declaration of some types, concerning the * panning of a note * - * Copyright (c) 2004-2009 Tobias Doerffel + * Copyright (c) 2004-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -30,7 +30,7 @@ #include "volume.h" #include "templates.h" #include "panning_constants.h" -#include "midi.h" +#include "Midi.h" inline stereoVolumeVector panningToVolumeVector( panning_t _p, float _scale = 1.0f ) diff --git a/include/pattern.h b/include/pattern.h index 26b51849e..fcb66fed9 100644 --- a/include/pattern.h +++ b/include/pattern.h @@ -64,8 +64,8 @@ public: void init(); - virtual midiTime length() const; - midiTime beatPatternLength() const; + virtual MidiTime length() const; + MidiTime beatPatternLength() const; // note management note * addNote( const note & _new_note, const bool _quant_pos = true ); diff --git a/include/piano_roll.h b/include/piano_roll.h index 55e193b99..596a29f1a 100644 --- a/include/piano_roll.h +++ b/include/piano_roll.h @@ -135,8 +135,8 @@ protected slots: void pasteNotes(); void deleteSelectedNotes(); - void updatePosition( const midiTime & _t ); - void updatePositionAccompany( const midiTime & _t ); + void updatePosition( const MidiTime & _t ); + void updatePositionAccompany( const MidiTime & _t ); void zoomingChanged(); void quantizeChanged(); @@ -203,9 +203,9 @@ private: pianoRoll( const pianoRoll & ); virtual ~pianoRoll(); - void autoScroll( const midiTime & _t ); + void autoScroll( const MidiTime & _t ); - midiTime newNoteLen() const; + MidiTime newNoteLen() const; void shiftPos(int amount); void shiftSemiTone(int amount); @@ -276,7 +276,7 @@ private: QScrollBar * m_leftRightScroll; QScrollBar * m_topBottomScroll; - midiTime m_currentPosition; + MidiTime m_currentPosition; bool m_recording; QList m_recordingNotes; @@ -315,7 +315,7 @@ private: // remember these values to use them // for the next note that is set - midiTime m_lenOfNewNotes; + MidiTime m_lenOfNewNotes; volume_t m_lastNoteVolume; panning_t m_lastNotePanning; @@ -345,7 +345,7 @@ private: signals: - void positionChanged( const midiTime & ); + void positionChanged( const MidiTime & ); } ; diff --git a/include/song.h b/include/song.h index ed6c18872..32b36e34b 100644 --- a/include/song.h +++ b/include/song.h @@ -65,11 +65,11 @@ public: } ; - class playPos : public midiTime + class playPos : public MidiTime { public: playPos( const int _abs = 0 ) : - midiTime( _abs ), + MidiTime( _abs ), m_timeLine( NULL ), m_timeLineUpdate( true ), m_currentFrame( 0.0f ) diff --git a/include/song_editor.h b/include/song_editor.h index 989636790..af10cd51c 100644 --- a/include/song_editor.h +++ b/include/song_editor.h @@ -84,7 +84,7 @@ private slots: void masterPitchReleased(); void updateScrollBar( int ); - void updatePosition( const midiTime & _t ); + void updatePosition( const MidiTime & _t ); void zoomingChanged(); diff --git a/include/timeline.h b/include/timeline.h index 298f42a7b..ff4661837 100644 --- a/include/timeline.h +++ b/include/timeline.h @@ -61,7 +61,7 @@ public: timeLine( int _xoff, int _yoff, float _ppt, song::playPos & _pos, - const midiTime & _begin, QWidget * _parent ); + const MidiTime & _begin, QWidget * _parent ); virtual ~timeLine(); inline song::playPos & pos() @@ -84,23 +84,23 @@ public: return m_loopPoints == LoopPointsEnabled; } - inline const midiTime & loopBegin() const + inline const MidiTime & loopBegin() const { return ( m_loopPos[0] < m_loopPos[1] ) ? m_loopPos[0] : m_loopPos[1]; } - inline const midiTime & loopEnd() const + inline const MidiTime & loopEnd() const { return ( m_loopPos[0] > m_loopPos[1] ) ? m_loopPos[0] : m_loopPos[1]; } - inline void savePos( const midiTime & _pos ) + inline void savePos( const MidiTime & _pos ) { m_savedPos = _pos; } - inline const midiTime & savedPos() const + inline const MidiTime & savedPos() const { return m_savedPos; } @@ -121,18 +121,18 @@ public: return "timeline"; } - inline int markerX( const midiTime & _t ) const + inline int markerX( const MidiTime & _t ) const { return m_xOffset + static_cast( ( _t - m_begin ) * - m_ppt / midiTime::ticksPerTact() ); + m_ppt / MidiTime::ticksPerTact() ); } public slots: - void updatePosition( const midiTime & ); + void updatePosition( const MidiTime & ); void updatePosition() { - updatePosition( midiTime() ); + updatePosition( MidiTime() ); } void toggleAutoScroll( int _n ); void toggleLoopPoints( int _n ); @@ -162,10 +162,10 @@ private: int m_posMarkerX; float m_ppt; song::playPos & m_pos; - const midiTime & m_begin; - midiTime m_loopPos[2]; + const MidiTime & m_begin; + MidiTime m_loopPos[2]; - midiTime m_savedPos; + MidiTime m_savedPos; textFloat * m_hint; @@ -183,7 +183,7 @@ private: signals: - void positionChanged( const midiTime & _t ); + void positionChanged( const MidiTime & _t ); void loopPointStateLoaded( int _n ); } ; diff --git a/include/track.h b/include/track.h index cbb5faaeb..e30e62e48 100644 --- a/include/track.h +++ b/include/track.h @@ -31,7 +31,7 @@ #include #include "lmms_basics.h" -#include "midi_time.h" +#include "MidiTime.h" #include "rubberband.h" #include "JournallingObject.h" #include "AutomatableModel.h" @@ -101,24 +101,24 @@ public: } - inline const midiTime & startPosition() const + inline const MidiTime & startPosition() const { return m_startPosition; } - inline midiTime endPosition() const + inline MidiTime endPosition() const { const int sp = m_startPosition; return sp + m_length; } - inline const midiTime & length() const + inline const MidiTime & length() const { return m_length; } - virtual void movePosition( const midiTime & _pos ); - virtual void changeLength( const midiTime & _length ); + virtual void movePosition( const MidiTime & _pos ); + virtual void changeLength( const MidiTime & _length ); virtual trackContentObjectView * createView( trackView * _tv ) = 0; @@ -151,8 +151,8 @@ private: track * m_track; QString m_name; - midiTime m_startPosition; - midiTime m_length; + MidiTime m_startPosition; + MidiTime m_length; BoolModel m_mutedModel; BoolModel m_soloModel; @@ -230,7 +230,7 @@ private: textFloat * m_hint; - midiTime m_oldTime;// used for undo/redo while mouse-button is pressed + MidiTime m_oldTime;// used for undo/redo while mouse-button is pressed } ; @@ -258,11 +258,11 @@ public: } } - midiTime endPosition( const midiTime & _pos_start ); + MidiTime endPosition( const MidiTime & _pos_start ); public slots: void update(); - void changePosition( const midiTime & _new_pos = midiTime( -1 ) ); + void changePosition( const MidiTime & _new_pos = MidiTime( -1 ) ); protected: @@ -289,7 +289,7 @@ private: } ; track * getTrack(); - midiTime getPosition( int _mouse_x ); + MidiTime getPosition( int _mouse_x ); trackView * m_trackView; @@ -382,12 +382,12 @@ public: return m_type; } - virtual bool play( const midiTime & _start, const fpp_t _frames, + virtual bool play( const MidiTime & _start, const fpp_t _frames, const f_cnt_t _frame_base, int _tco_num = -1 ) = 0; virtual trackView * createView( TrackContainerView * _view ) = 0; - virtual trackContentObject * createTCO( const midiTime & _pos ) = 0; + virtual trackContentObject * createTCO( const MidiTime & _pos ) = 0; virtual void saveTrackSpecificSettings( QDomDocument & _doc, QDomElement & _parent ) = 0; @@ -415,13 +415,13 @@ public: { return( m_trackContentObjects ); } - void getTCOsInRange( tcoVector & _tco_v, const midiTime & _start, - const midiTime & _end ); + void getTCOsInRange( tcoVector & _tco_v, const MidiTime & _start, + const MidiTime & _end ); void swapPositionOfTCOs( int _tco_num1, int _tco_num2 ); - void insertTact( const midiTime & _pos ); - void removeTact( const midiTime & _pos ); + void insertTact( const MidiTime & _pos ); + void removeTact( const MidiTime & _pos ); tact_t length() const; diff --git a/include/volume.h b/include/volume.h index aeb1daf1c..dedecd504 100644 --- a/include/volume.h +++ b/include/volume.h @@ -2,7 +2,7 @@ * volume.h - declaration of some constants and types, concerning the volume * of a note * - * Copyright (c) 2004-2009 Tobias Doerffel + * Copyright (c) 2004-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -29,7 +29,7 @@ #include "lmmsconfig.h" #include "lmms_basics.h" -#include "midi.h" +#include "Midi.h" const volume_t MinVolume = 0; const volume_t MaxVolume = 200; diff --git a/plugins/flp_import/FlpImport.cpp b/plugins/flp_import/FlpImport.cpp index c374595f8..c238fee10 100644 --- a/plugins/flp_import/FlpImport.cpp +++ b/plugins/flp_import/FlpImport.cpp @@ -1744,8 +1744,7 @@ p->putValue( jt->pos, value, false ); { continue; } - trackContentObject * tco = - bb_tracks[it->pattern]->createTCO( midiTime() ); + trackContentObject * tco = bb_tracks[it->pattern]->createTCO( MidiTime() ); tco->movePosition( it->position ); if( it->length != DefaultTicksPerTact ) { diff --git a/plugins/midi_import/MidiImport.cpp b/plugins/midi_import/MidiImport.cpp index 585c2f5eb..0444ce51a 100644 --- a/plugins/midi_import/MidiImport.cpp +++ b/plugins/midi_import/MidiImport.cpp @@ -38,6 +38,7 @@ #include "pattern.h" #include "Instrument.h" #include "MainWindow.h" +#include "MidiTime.h" #include "debug.h" #include "embed.h" #include "song.h" @@ -152,7 +153,7 @@ public: AutomationTrack * at; AutomationPattern * ap; - midiTime lastPos; + MidiTime lastPos; smfMidiCC & create( TrackContainer* tc ) { @@ -172,11 +173,11 @@ public: } - smfMidiCC & putValue( midiTime time, AutomatableModel * objModel, float value ) + smfMidiCC & putValue( MidiTime time, AutomatableModel * objModel, float value ) { if( !ap || time > lastPos + DefaultTicksPerTact ) { - midiTime pPos = midiTime( time.getTact(), 0 ); + MidiTime pPos = MidiTime( time.getTact(), 0 ); ap = dynamic_cast( at->createTCO(0) ); ap->movePosition( pPos ); @@ -186,7 +187,7 @@ public: lastPos = time; time = time - ap->startPosition(); ap->putValue( time, value, false ); - ap->changeLength( midiTime( time.getTact() + 1, 0 ) ); + ap->changeLength( MidiTime( time.getTact() + 1, 0 ) ); return *this; } @@ -212,7 +213,7 @@ public: Instrument * it_inst; bool isSF2; bool hasNotes; - midiTime lastEnd; + MidiTime lastEnd; smfMidiChannel * create( TrackContainer* tc ) { @@ -247,7 +248,7 @@ public: { if( !p || n.pos() > lastEnd + DefaultTicksPerTact ) { - midiTime pPos = midiTime(n.pos().getTact(), 0 ); + MidiTime pPos = MidiTime( n.pos().getTact(), 0 ); p = dynamic_cast( it->createTCO( 0 ) ); p->movePosition( pPos ); } diff --git a/plugins/midi_import/MidiImport.h b/plugins/midi_import/MidiImport.h index 47ad49486..66b839334 100644 --- a/plugins/midi_import/MidiImport.h +++ b/plugins/midi_import/MidiImport.h @@ -29,7 +29,7 @@ #include #include -#include "midi.h" +#include "MidiEvent.h" #include "ImportFilter.h" @@ -117,8 +117,8 @@ private: } - typedef QVector > eventVector; - eventVector m_events; + typedef QVector > EventVector; + EventVector m_events; int m_timingDivision; } ; diff --git a/plugins/opl2/opl2instrument.cpp b/plugins/opl2/opl2instrument.cpp index 0718a3796..2288e0d32 100644 --- a/plugins/opl2/opl2instrument.cpp +++ b/plugins/opl2/opl2instrument.cpp @@ -286,17 +286,16 @@ int opl2instrument::pushVoice(int v) { return i; } -bool opl2instrument::handleMidiEvent( const midiEvent & _me, - const midiTime & _time ) +bool opl2instrument::handleMidiEvent( const MidiEvent& event, const MidiTime& time ) { emulatorMutex.lock(); int key, vel, voice, tmp_pb; - switch(_me.m_type) { + switch(event.type()) { case MidiNoteOn: // to get us in line with MIDI(?) - key = _me.key() +12; - vel = _me.velocity(); + key = event.key() +12; + vel = event.velocity(); voice = popVoice(); if( voice != OPL2_NO_VOICE ) { @@ -311,7 +310,7 @@ bool opl2instrument::handleMidiEvent( const midiEvent & _me, } break; case MidiNoteOff: - key = _me.key() +12; + key = event.key() +12; for(voice=0; voice<9; ++voice) { if( voiceNote[voice] == key ) { theEmulator->write(0xA0+voice, fnums[key] & 0xff); @@ -323,8 +322,8 @@ bool opl2instrument::handleMidiEvent( const midiEvent & _me, velocities[key] = 0; break; case MidiKeyPressure: - key = _me.key() +12; - vel = _me.velocity(); + key = event.key() +12; + vel = event.velocity(); if( velocities[key] != 0) { velocities[key] = vel; } @@ -337,12 +336,12 @@ bool opl2instrument::handleMidiEvent( const midiEvent & _me, case MidiPitchBend: // Update fnumber table // Pitchbend should be in the range 0...16383 but the new range knob gets it wrong. - // tmp_pb = (2*BEND_CENTS)*((float)_me.m_data.m_param[0]/16383)-BEND_CENTS; + // tmp_pb = (2*BEND_CENTS)*((float)event.m_data.m_param[0]/16383)-BEND_CENTS; // Something like 100 cents = 8192, but offset by 8192 so the +/-100 cents range goes from 0...16383? - tmp_pb = ( _me.m_data.m_param[0]-8192 ) * BEND_CENTS / 8192; + tmp_pb = ( event.pitchBend()-8192 ) * BEND_CENTS / 8192; - printf("Pitch bend: %d -> %d cents\n",_me.m_data.m_param[0],tmp_pb); + printf("Pitch bend: %d -> %d cents\n",event.pitchBend(),tmp_pb); if( tmp_pb != pitchbend ) { pitchbend = tmp_pb; tuneEqual(69, 440.0); @@ -356,7 +355,7 @@ bool opl2instrument::handleMidiEvent( const midiEvent & _me, } break; default: - printf("Midi event type %d\n",_me.m_type); + printf("Midi event type %d\n",event.type()); } emulatorMutex.unlock(); return true; diff --git a/plugins/opl2/opl2instrument.h b/plugins/opl2/opl2instrument.h index af2493f95..39c9d13c2 100644 --- a/plugins/opl2/opl2instrument.h +++ b/plugins/opl2/opl2instrument.h @@ -50,8 +50,7 @@ public: inline virtual bool isMidiBased() const { return true; } - virtual bool handleMidiEvent( const midiEvent & _me, - const midiTime & _time ); + virtual bool handleMidiEvent( const MidiEvent& event, const MidiTime& time ); virtual void play( sampleFrame * _working_buffer ); void saveSettings( QDomDocument & _doc, QDomElement & _this ); diff --git a/plugins/vestige/vestige.cpp b/plugins/vestige/vestige.cpp index e8f59c1f4..f47efe689 100644 --- a/plugins/vestige/vestige.cpp +++ b/plugins/vestige/vestige.cpp @@ -310,13 +310,12 @@ void vestigeInstrument::play( sampleFrame * _buf ) -bool vestigeInstrument::handleMidiEvent( const midiEvent & _me, - const midiTime & _time ) +bool vestigeInstrument::handleMidiEvent( const MidiEvent& event, const MidiTime& time ) { m_pluginMutex.lock(); if( m_plugin != NULL ) { - m_plugin->processMidiEvent( _me, _time ); + m_plugin->processMidiEvent( event, time ); } m_pluginMutex.unlock(); @@ -779,8 +778,7 @@ void VestigeInstrumentView::noteOffAll( void ) { for( int key = 0; key <= MidiMaxNote; ++key ) { - m_vi->m_plugin->processMidiEvent( - midiEvent( MidiNoteOff, 0, key, 0 ), 0 ); + m_vi->m_plugin->processMidiEvent( MidiEvent( MidiNoteOff, 0, key, 0 ), 0 ); } } m_vi->m_pluginMutex.unlock(); diff --git a/plugins/vestige/vestige.h b/plugins/vestige/vestige.h index 600e87e22..b3e670305 100644 --- a/plugins/vestige/vestige.h +++ b/plugins/vestige/vestige.h @@ -1,7 +1,7 @@ /* * vestige.h - instrument VeSTige for hosting VST-plugins * - * Copyright (c) 2005-2012 Tobias Doerffel + * Copyright (c) 2005-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -34,7 +34,6 @@ #include "Instrument.h" #include "InstrumentView.h" -#include "midi.h" #include "note.h" #include "knob.h" @@ -69,8 +68,7 @@ public: return true; } - virtual bool handleMidiEvent( const midiEvent & _me, - const midiTime & _time ); + virtual bool handleMidiEvent( const MidiEvent& event, const MidiTime& time ); virtual PluginView * instantiateView( QWidget * _parent ); diff --git a/plugins/zynaddsubfx/LocalZynAddSubFx.cpp b/plugins/zynaddsubfx/LocalZynAddSubFx.cpp index 24e4ff182..6705bb33d 100644 --- a/plugins/zynaddsubfx/LocalZynAddSubFx.cpp +++ b/plugins/zynaddsubfx/LocalZynAddSubFx.cpp @@ -1,7 +1,7 @@ /* * LocalZynAddSubFx.cpp - local implementation of ZynAddSubFx plugin * - * Copyright (c) 2009-2013 Tobias Doerffel + * Copyright (c) 2009-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -190,47 +190,43 @@ void LocalZynAddSubFx::setLmmsWorkingDir( const std::string & _dir ) -void LocalZynAddSubFx::processMidiEvent( const midiEvent & _e ) +void LocalZynAddSubFx::processMidiEvent( const MidiEvent& event ) { // all functions are called while m_master->mutex is held static NULLMidiIn midiIn; - switch( _e.m_type ) + switch( event.type() ) { case MidiNoteOn: - if( _e.velocity() > 0 ) + if( event.velocity() > 0 ) { - if( _e.key() <= 0 || _e.key() >= 128 ) + if( event.key() <= 0 || event.key() >= 128 ) { break; } - if( m_runningNotes[_e.key()] > 0 ) + if( m_runningNotes[event.key()] > 0 ) { - m_master->NoteOff( _e.channel(), _e.key() ); + m_master->NoteOff( event.channel(), event.key() ); } - ++m_runningNotes[_e.key()]; - m_master->NoteOn( _e.channel(), _e.key(), _e.velocity() ); + ++m_runningNotes[event.key()]; + m_master->NoteOn( event.channel(), event.key(), event.velocity() ); break; } case MidiNoteOff: - if( _e.key() <= 0 || _e.key() >= 128 ) + if( event.key() <= 0 || event.key() >= 128 ) { break; } - if( --m_runningNotes[_e.key()] <= 0 ) + if( --m_runningNotes[event.key()] <= 0 ) { - m_master->NoteOff( _e.channel(), _e.key() ); + m_master->NoteOff( event.channel(), event.key() ); } break; case MidiPitchBend: - m_master->SetController( _e.channel(), C_pitchwheel, - _e.m_data.m_param[0] + - _e.m_data.m_param[1]*128-8192 ); + m_master->SetController( event.channel(), C_pitchwheel, event.pitchBend()-8192 ); break; case MidiControlChange: - m_master->SetController( _e.channel(), - midiIn.getcontroller( _e.m_data.m_param[0] ), - _e.m_data.m_param[1] ); + m_master->SetController( event.channel(), midiIn.getcontroller( event.controllerNumber() ), event.controllerValue() ); break; default: break; diff --git a/plugins/zynaddsubfx/LocalZynAddSubFx.h b/plugins/zynaddsubfx/LocalZynAddSubFx.h index 9d6d66345..3aeab8ba5 100644 --- a/plugins/zynaddsubfx/LocalZynAddSubFx.h +++ b/plugins/zynaddsubfx/LocalZynAddSubFx.h @@ -1,7 +1,7 @@ /* * LocalZynAddSubFx.h - local implementation of ZynAddSubFx plugin * - * Copyright (c) 2009 Tobias Doerffel + * Copyright (c) 2009-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -25,6 +25,7 @@ #ifndef _LOCAL_ZYNADDSUBFX_H #define _LOCAL_ZYNADDSUBFX_H +#include "MidiEvent.h" #include "note.h" class Master; @@ -48,7 +49,7 @@ public: void setPresetDir( const std::string & _dir ); void setLmmsWorkingDir( const std::string & _dir ); - void processMidiEvent( const midiEvent & _e ); + void processMidiEvent( const MidiEvent& event ); void processAudio( sampleFrame * _out ); diff --git a/plugins/zynaddsubfx/RemoteZynAddSubFx.cpp b/plugins/zynaddsubfx/RemoteZynAddSubFx.cpp index 29300bf75..5e25de9fa 100644 --- a/plugins/zynaddsubfx/RemoteZynAddSubFx.cpp +++ b/plugins/zynaddsubfx/RemoteZynAddSubFx.cpp @@ -1,7 +1,7 @@ /* * RemoteZynAddSubFx.cpp - ZynAddSubFx-embedding plugin * - * Copyright (c) 2008-2012 Tobias Doerffel + * Copyright (c) 2008-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -126,10 +126,9 @@ public: } // all functions are called while m_master->mutex is held - virtual void processMidiEvent( const midiEvent & _e, - const f_cnt_t /* _offset */ ) + virtual void processMidiEvent( const MidiEvent& event, const f_cnt_t /* _offset */ ) { - LocalZynAddSubFx::processMidiEvent( _e ); + LocalZynAddSubFx::processMidiEvent( event ); } diff --git a/plugins/zynaddsubfx/ZynAddSubFx.cpp b/plugins/zynaddsubfx/ZynAddSubFx.cpp index ad2dde50a..0984bfecf 100644 --- a/plugins/zynaddsubfx/ZynAddSubFx.cpp +++ b/plugins/zynaddsubfx/ZynAddSubFx.cpp @@ -340,14 +340,13 @@ void ZynAddSubFxInstrument::play( sampleFrame * _buf ) -bool ZynAddSubFxInstrument::handleMidiEvent( const midiEvent & _me, - const midiTime & _time ) +bool ZynAddSubFxInstrument::handleMidiEvent( const MidiEvent& event, const MidiTime& time ) { // do not forward external MIDI Control Change events if the according // LED is not checked - if( _me.type() == MidiControlChange && - _me.sourcePort() != this && - m_forwardMidiCcModel.value() == false ) + if( event.type() == MidiControlChange && + event.sourcePort() != this && + m_forwardMidiCcModel.value() == false ) { return true; } @@ -355,11 +354,11 @@ bool ZynAddSubFxInstrument::handleMidiEvent( const midiEvent & _me, m_pluginMutex.lock(); if( m_remotePlugin ) { - m_remotePlugin->processMidiEvent( _me, 0 ); + m_remotePlugin->processMidiEvent( event, 0 ); } else { - m_plugin->processMidiEvent( _me ); + m_plugin->processMidiEvent( event ); } m_pluginMutex.unlock(); @@ -446,8 +445,7 @@ void ZynAddSubFxInstrument::initPlugin() void ZynAddSubFxInstrument::sendControlChange( MidiControllers midiCtl, float value ) { - handleMidiEvent( midiEvent( MidiControlChange, instrumentTrack()->midiPort()->realOutputChannel(), midiCtl, (int) value, this ), - midiTime() ); + handleMidiEvent( MidiEvent( MidiControlChange, instrumentTrack()->midiPort()->realOutputChannel(), midiCtl, (int) value, this ) ); } diff --git a/plugins/zynaddsubfx/ZynAddSubFx.h b/plugins/zynaddsubfx/ZynAddSubFx.h index f37ba857b..8ea46a124 100644 --- a/plugins/zynaddsubfx/ZynAddSubFx.h +++ b/plugins/zynaddsubfx/ZynAddSubFx.h @@ -70,8 +70,7 @@ public: virtual void play( sampleFrame * _working_buffer ); - virtual bool handleMidiEvent( const midiEvent & _me, - const midiTime & _time ); + virtual bool handleMidiEvent( const MidiEvent& event, const MidiTime& time = MidiTime() ); virtual void saveSettings( QDomDocument & _doc, QDomElement & _parent ); virtual void loadSettings( const QDomElement & _this ); diff --git a/src/core/AutomationPattern.cpp b/src/core/AutomationPattern.cpp index 4babc3c50..1ce04941c 100644 --- a/src/core/AutomationPattern.cpp +++ b/src/core/AutomationPattern.cpp @@ -45,7 +45,7 @@ AutomationPattern::AutomationPattern( AutomationTrack * _auto_track ) : m_tension( "1.0" ), m_progressionType( DiscreteProgression ) { - changeLength( midiTime( 1, 0 ) ); + changeLength( MidiTime( 1, 0 ) ); } @@ -166,7 +166,7 @@ const AutomatableModel * AutomationPattern::firstObject() const //TODO: Improve this -midiTime AutomationPattern::length() const +MidiTime AutomationPattern::length() const { tick_t max_length = 0; @@ -175,19 +175,19 @@ midiTime AutomationPattern::length() const { max_length = qMax( max_length, it.key() ); } - return midiTime( qMax( midiTime( max_length ).getTact() + 1, 1 ), 0 ); + return MidiTime( qMax( MidiTime( max_length ).getTact() + 1, 1 ), 0 ); } -midiTime AutomationPattern::putValue( const midiTime & _time, +MidiTime AutomationPattern::putValue( const MidiTime & _time, const float _value, const bool _quant_pos ) { cleanObjects(); - midiTime newTime = _quant_pos && engine::automationEditor() ? + MidiTime newTime = _quant_pos && engine::automationEditor() ? note::quantized( _time, engine::automationEditor()->quantization() ) : _time; @@ -215,7 +215,7 @@ midiTime AutomationPattern::putValue( const midiTime & _time, -void AutomationPattern::removeValue( const midiTime & _time ) +void AutomationPattern::removeValue( const MidiTime & _time ) { cleanObjects(); @@ -240,7 +240,7 @@ void AutomationPattern::removeValue( const midiTime & _time ) -float AutomationPattern::valueAt( const midiTime & _time ) const +float AutomationPattern::valueAt( const MidiTime & _time ) const { if( m_timeMap.isEmpty() ) { @@ -306,7 +306,7 @@ float AutomationPattern::valueAt( timeMap::const_iterator v, int offset ) const -float *AutomationPattern::valuesAfter( const midiTime & _time ) const +float *AutomationPattern::valuesAfter( const MidiTime & _time ) const { timeMap::ConstIterator v = m_timeMap.lowerBound( _time ); if( v == m_timeMap.end() || (v+1) == m_timeMap.end() ) @@ -417,7 +417,7 @@ const QString AutomationPattern::name() const -void AutomationPattern::processMidiTime( const midiTime & _time ) +void AutomationPattern::processMidiTime( const MidiTime & _time ) { if( _time >= 0 && hasAutomation() ) { diff --git a/src/core/InstrumentFunctions.cpp b/src/core/InstrumentFunctions.cpp index 1de453df8..985fd3152 100644 --- a/src/core/InstrumentFunctions.cpp +++ b/src/core/InstrumentFunctions.cpp @@ -477,7 +477,7 @@ void InstrumentFunctionArpeggio::processNote( notePlayHandle * _n ) } // create new arp-note - note new_note( midiTime( 0 ), midiTime( 0 ), + note new_note( MidiTime( 0 ), MidiTime( 0 ), sub_note_key, (volume_t) qRound( _n->getVolume() * vol_level ), diff --git a/src/core/Piano.cpp b/src/core/Piano.cpp index 3bd85ee8d..584362f46 100644 --- a/src/core/Piano.cpp +++ b/src/core/Piano.cpp @@ -38,6 +38,7 @@ #include "Piano.h" #include "InstrumentTrack.h" +#include "MidiEvent.h" #include "MidiEventProcessor.h" @@ -96,7 +97,7 @@ void Piano::handleKeyPress( int key, int midiVelocity ) { if( isValidKey( key ) ) { - m_midiEvProc->processInEvent( midiEvent( MidiNoteOn, 0, key, midiVelocity ), midiTime() ); + m_midiEvProc->processInEvent( MidiEvent( MidiNoteOn, 0, key, midiVelocity ) ); m_pressedKeys[key] = true; } } @@ -113,7 +114,7 @@ void Piano::handleKeyRelease( int key ) { if( isValidKey( key ) ) { - m_midiEvProc->processInEvent( midiEvent( MidiNoteOff, 0, key, 0 ), midiTime() ); + m_midiEvProc->processInEvent( MidiEvent( MidiNoteOff, 0, key, 0 ) ); m_pressedKeys[key] = false; } } diff --git a/src/core/RemotePlugin.cpp b/src/core/RemotePlugin.cpp index 24e047d99..0128444e8 100644 --- a/src/core/RemotePlugin.cpp +++ b/src/core/RemotePlugin.cpp @@ -1,7 +1,7 @@ /* * RemotePlugin.cpp - base class providing RPC like mechanisms * - * Copyright (c) 2008-2010 Tobias Doerffel + * Copyright (c) 2008-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -281,14 +281,14 @@ bool RemotePlugin::process( const sampleFrame * _in_buf, -void RemotePlugin::processMidiEvent( const midiEvent & _e, +void RemotePlugin::processMidiEvent( const MidiEvent & _e, const f_cnt_t _offset ) { message m( IdMidiEvent ); - m.addInt( _e.m_type ); - m.addInt( _e.m_channel ); - m.addInt( _e.m_data.m_param[0] ); - m.addInt( _e.m_data.m_param[1] ); + m.addInt( _e.type() ); + m.addInt( _e.channel() ); + m.addInt( _e.param( 0 ) ); + m.addInt( _e.param( 1 ) ); m.addInt( _offset ); lock(); sendMessage( m ); diff --git a/src/core/SampleRecordHandle.cpp b/src/core/SampleRecordHandle.cpp index 9d0cff4ad..674af8d93 100644 --- a/src/core/SampleRecordHandle.cpp +++ b/src/core/SampleRecordHandle.cpp @@ -73,7 +73,7 @@ void SampleRecordHandle::play( sampleFrame * /*_working_buffer*/ ) writeBuffer( recbuf, frames ); m_framesRecorded += frames; - midiTime len = (tick_t)( m_framesRecorded / engine::framesPerTick() ); + MidiTime len = (tick_t)( m_framesRecorded / engine::framesPerTick() ); if( len > m_minLength ) { // m_tco->changeLength( len ); diff --git a/src/core/bb_track_container.cpp b/src/core/bb_track_container.cpp index d199f8454..0cbcef43b 100644 --- a/src/core/bb_track_container.cpp +++ b/src/core/bb_track_container.cpp @@ -54,7 +54,7 @@ bbTrackContainer::~bbTrackContainer() -bool bbTrackContainer::play( midiTime _start, fpp_t _frames, +bool bbTrackContainer::play( MidiTime _start, fpp_t _frames, f_cnt_t _offset, int _tco_num ) { bool played_a_note = false; @@ -63,7 +63,7 @@ bool bbTrackContainer::play( midiTime _start, fpp_t _frames, return false; } - _start = _start % ( lengthOfBB( _tco_num ) * midiTime::ticksPerTact() ); + _start = _start % ( lengthOfBB( _tco_num ) * MidiTime::ticksPerTact() ); TrackList tl = tracks(); for( TrackList::iterator it = tl.begin(); it != tl.end(); ++it ) @@ -99,7 +99,7 @@ void bbTrackContainer::updateAfterTrackAdd() tact_t bbTrackContainer::lengthOfBB( int _bb ) { - midiTime max_length = midiTime::ticksPerTact(); + MidiTime max_length = MidiTime::ticksPerTact(); const TrackList & tl = tracks(); for( TrackList::const_iterator it = tl.begin(); it != tl.end(); ++it ) @@ -172,7 +172,7 @@ void bbTrackContainer::fixIncorrectPositions() { for( int i = 0; i < numOfBBs(); ++i ) { - ( *it )->getTCO( i )->movePosition( midiTime( i, 0 ) ); + ( *it )->getTCO( i )->movePosition( MidiTime( i, 0 ) ); } } } @@ -252,10 +252,10 @@ void bbTrackContainer::createTCOsForBB( int _bb ) { while( tl[i]->numOfTCOs() < _bb + 1 ) { - midiTime position = midiTime( tl[i]->numOfTCOs(), 0 ); + MidiTime position = MidiTime( tl[i]->numOfTCOs(), 0 ); trackContentObject * tco = tl[i]->createTCO( position ); tco->movePosition( position ); - tco->changeLength( midiTime( 1, 0 ) ); + tco->changeLength( MidiTime( 1, 0 ) ); } } } diff --git a/src/core/midi/MidiAlsaSeq.cpp b/src/core/midi/MidiAlsaSeq.cpp index 95b351197..662dc43ea 100644 --- a/src/core/midi/MidiAlsaSeq.cpp +++ b/src/core/midi/MidiAlsaSeq.cpp @@ -31,6 +31,7 @@ #include "gui_templates.h" #include "song.h" #include "MidiPort.h" +#include "MidiTime.h" #include "note.h" @@ -160,73 +161,70 @@ QString MidiAlsaSeq::probeDevice() -void MidiAlsaSeq::processOutEvent( const midiEvent & _me, - const midiTime & _time, - const MidiPort * _port ) +void MidiAlsaSeq::processOutEvent( const MidiEvent& event, const MidiTime& time, const MidiPort* port ) { // HACK!!! - need a better solution which isn't that easy since we // cannot store const-ptrs in our map because we need to call non-const // methods of MIDI-port - it's a mess... - MidiPort * p = const_cast( _port ); + MidiPort* p = const_cast( port ); snd_seq_event_t ev; snd_seq_ev_clear( &ev ); snd_seq_ev_set_source( &ev, ( m_portIDs[p][1] != -1 ) ? m_portIDs[p][1] : m_portIDs[p][0] ); snd_seq_ev_set_subs( &ev ); - snd_seq_ev_schedule_tick( &ev, m_queueID, 1, static_cast( _time ) ); + snd_seq_ev_schedule_tick( &ev, m_queueID, 1, static_cast( time ) ); ev.queue = m_queueID; - switch( _me.m_type ) + switch( event.type() ) { case MidiNoteOn: snd_seq_ev_set_noteon( &ev, - _me.channel(), - _me.key() + KeysPerOctave, - _me.velocity() ); + event.channel(), + event.key() + KeysPerOctave, + event.velocity() ); break; case MidiNoteOff: snd_seq_ev_set_noteoff( &ev, - _me.channel(), - _me.key() + KeysPerOctave, - _me.velocity() ); + event.channel(), + event.key() + KeysPerOctave, + event.velocity() ); break; case MidiKeyPressure: snd_seq_ev_set_keypress( &ev, - _me.channel(), - _me.key() + KeysPerOctave, - _me.velocity() ); + event.channel(), + event.key() + KeysPerOctave, + event.velocity() ); break; case MidiControlChange: snd_seq_ev_set_controller( &ev, - _me.channel(), - _me.m_data.m_param[0], - _me.m_data.m_param[1] ); + event.channel(), + event.controllerNumber(), + event.controllerValue() ); break; case MidiProgramChange: snd_seq_ev_set_pgmchange( &ev, - _me.channel(), - _me.m_data.m_param[0] ); + event.channel(), + event.program() ); break; case MidiChannelPressure: snd_seq_ev_set_chanpress( &ev, - _me.channel(), - _me.m_data.m_param[0] ); + event.channel(), + event.channelPressure() ); break; case MidiPitchBend: snd_seq_ev_set_pitchbend( &ev, - _me.channel(), - _me.m_data.m_param[0] - 8192 ); + event.channel(), + event.param( 0 ) - 8192 ); break; default: - fprintf( stderr, "ALSA-sequencer: unhandled output " - "event %d\n", (int) _me.m_type ); + qWarning( "MidiAlsaSeq: unhandled output event %d\n", (int) event.type() ); return; } @@ -353,7 +351,7 @@ void MidiAlsaSeq::removePort( MidiPort * _port ) -QString MidiAlsaSeq::sourcePortName( const midiEvent & _event ) const +QString MidiAlsaSeq::sourcePortName( const MidiEvent & _event ) const { if( _event.sourcePort() ) { @@ -535,70 +533,70 @@ void MidiAlsaSeq::run() switch( ev->type ) { case SND_SEQ_EVENT_NOTEON: - dest->processInEvent( midiEvent( MidiNoteOn, + dest->processInEvent( MidiEvent( MidiNoteOn, ev->data.note.channel, ev->data.note.note - KeysPerOctave, ev->data.note.velocity, source ), - midiTime( ev->time.tick ) ); + MidiTime( ev->time.tick ) ); break; case SND_SEQ_EVENT_NOTEOFF: - dest->processInEvent( midiEvent( MidiNoteOff, + dest->processInEvent( MidiEvent( MidiNoteOff, ev->data.note.channel, ev->data.note.note - KeysPerOctave, ev->data.note.velocity, source ), - midiTime( ev->time.tick) ); + MidiTime( ev->time.tick) ); break; case SND_SEQ_EVENT_KEYPRESS: - dest->processInEvent( midiEvent( + dest->processInEvent( MidiEvent( MidiKeyPressure, ev->data.note.channel, ev->data.note.note - KeysPerOctave, ev->data.note.velocity, source - ), midiTime() ); + ), MidiTime() ); break; case SND_SEQ_EVENT_CONTROLLER: - dest->processInEvent( midiEvent( + dest->processInEvent( MidiEvent( MidiControlChange, ev->data.control.channel, ev->data.control.param, ev->data.control.value, source ), - midiTime() ); + MidiTime() ); break; case SND_SEQ_EVENT_PGMCHANGE: - dest->processInEvent( midiEvent( + dest->processInEvent( MidiEvent( MidiProgramChange, ev->data.control.channel, ev->data.control.param, ev->data.control.value, source ), - midiTime() ); + MidiTime() ); break; case SND_SEQ_EVENT_CHANPRESS: - dest->processInEvent( midiEvent( + dest->processInEvent( MidiEvent( MidiChannelPressure, ev->data.control.channel, ev->data.control.param, ev->data.control.value, source ), - midiTime() ); + MidiTime() ); break; case SND_SEQ_EVENT_PITCHBEND: - dest->processInEvent( midiEvent( MidiPitchBend, + dest->processInEvent( MidiEvent( MidiPitchBend, ev->data.control.channel, ev->data.control.value + 8192, 0, source ), - midiTime() ); + MidiTime() ); break; case SND_SEQ_EVENT_SENSING: diff --git a/src/core/midi/MidiClient.cpp b/src/core/midi/MidiClient.cpp index 8e3895d24..673d5f20d 100644 --- a/src/core/midi/MidiClient.cpp +++ b/src/core/midi/MidiClient.cpp @@ -25,7 +25,6 @@ #include "MidiClient.h" #include "MidiPort.h" -#include "templates.h" #include "note.h" @@ -44,32 +43,32 @@ MidiClient::~MidiClient() -void MidiClient::applyPortMode( MidiPort * ) +void MidiClient::applyPortMode( MidiPort* ) { } -void MidiClient::applyPortName( MidiPort * ) +void MidiClient::applyPortName( MidiPort* ) { } -void MidiClient::addPort( MidiPort * _port ) +void MidiClient::addPort( MidiPort* port ) { - m_midiPorts.push_back( _port ); + m_midiPorts.push_back( port ); } -void MidiClient::removePort( MidiPort * _port ) +void MidiClient::removePort( MidiPort* port ) { QVector::Iterator it = - qFind( m_midiPorts.begin(), m_midiPorts.end(), _port ); + qFind( m_midiPorts.begin(), m_midiPorts.end(), port ); if( it != m_midiPorts.end() ) { m_midiPorts.erase( it ); @@ -79,14 +78,14 @@ void MidiClient::removePort( MidiPort * _port ) -void MidiClient::subscribeReadablePort( MidiPort *, const QString & , bool ) +void MidiClient::subscribeReadablePort( MidiPort*, const QString& , bool ) { } -void MidiClient::subscribeWritablePort( MidiPort * , const QString & , bool ) +void MidiClient::subscribeWritablePort( MidiPort* , const QString& , bool ) { } @@ -124,7 +123,7 @@ void MidiClientRaw::parseData( const unsigned char c ) { if( c == MidiSystemReset ) { - m_midiParseData.m_midiEvent.m_type = MidiSystemReset; + m_midiParseData.m_midiEvent.setType( MidiSystemReset ); m_midiParseData.m_status = 0; processParsedEvent(); } @@ -206,34 +205,30 @@ void MidiClientRaw::parseData( const unsigned char c ) * We simply keep the status as it is, just reset the parameter counter. * If another status byte comes in, it will overwrite the status. */ - m_midiParseData.m_midiEvent.m_type = static_cast( m_midiParseData.m_status ); - m_midiParseData.m_midiEvent.m_channel = m_midiParseData.m_channel; + m_midiParseData.m_midiEvent.setType( static_cast( m_midiParseData.m_status ) ); + m_midiParseData.m_midiEvent.setChannel( m_midiParseData.m_channel ); m_midiParseData.m_bytes = 0; /* Related to running status! */ - switch( m_midiParseData.m_midiEvent.m_type ) + switch( m_midiParseData.m_midiEvent.type() ) { case MidiNoteOff: case MidiNoteOn: case MidiKeyPressure: case MidiProgramChange: case MidiChannelPressure: - m_midiParseData.m_midiEvent.m_data.m_param[0] = - m_midiParseData.m_buffer[0] - KeysPerOctave; - m_midiParseData.m_midiEvent.m_data.m_param[1] = - m_midiParseData.m_buffer[1]; + m_midiParseData.m_midiEvent.setKey( m_midiParseData.m_buffer[0] - KeysPerOctave ); + m_midiParseData.m_midiEvent.setVelocity( m_midiParseData.m_buffer[1] ); break; case MidiControlChange: - m_midiParseData.m_midiEvent.m_data.m_param[0] = m_midiParseData.m_buffer[0]; - m_midiParseData.m_midiEvent.m_data.m_param[1] = m_midiParseData.m_buffer[1]; + m_midiParseData.m_midiEvent.setControllerNumber( m_midiParseData.m_buffer[0] ); + m_midiParseData.m_midiEvent.setControllerValue( m_midiParseData.m_buffer[1] ); break; case MidiPitchBend: // Pitch-bend is transmitted with 14-bit precision. // Note: '|' does here the same as '+' (no common bits), // but might be faster - m_midiParseData.m_midiEvent.m_data.m_param[0] = - ( ( m_midiParseData.m_buffer[1] * 128 ) | - m_midiParseData.m_buffer[0] ); + m_midiParseData.m_midiEvent.setPitchBend( ( m_midiParseData.m_buffer[1] * 128 ) | m_midiParseData.m_buffer[0] ); break; default: @@ -251,33 +246,29 @@ void MidiClientRaw::processParsedEvent() { for( int i = 0; i < m_midiPorts.size(); ++i ) { - m_midiPorts[i]->processInEvent( m_midiParseData.m_midiEvent, - midiTime() ); + m_midiPorts[i]->processInEvent( m_midiParseData.m_midiEvent ); } } -void MidiClientRaw::processOutEvent( const midiEvent & _me, - const midiTime & , - const MidiPort * _port ) +void MidiClientRaw::processOutEvent( const MidiEvent& event, const MidiTime & , const MidiPort* port ) { // TODO: also evaluate _time and queue event if necessary - switch( _me.m_type ) + switch( event.type() ) { case MidiNoteOn: case MidiNoteOff: case MidiKeyPressure: - sendByte( _me.m_type | _me.channel() ); - sendByte( _me.m_data.m_param[0] + KeysPerOctave ); - sendByte( tLimit( (int) _me.m_data.m_param[1], - 0, 127 ) ); + sendByte( event.type() | event.channel() ); + sendByte( event.key() + KeysPerOctave ); + sendByte( event.velocity() ); break; default: qWarning( "MidiClientRaw: unhandled MIDI-event %d\n", - (int) _me.m_type ); + (int) event.type() ); break; } } diff --git a/src/core/midi/MidiController.cpp b/src/core/midi/MidiController.cpp index d323e6e7f..5e65b5cd0 100644 --- a/src/core/midi/MidiController.cpp +++ b/src/core/midi/MidiController.cpp @@ -73,20 +73,19 @@ void MidiController::updateName() -void MidiController::processInEvent( const midiEvent & _me, - const midiTime & _time ) +void MidiController::processInEvent( const MidiEvent& event, const MidiTime& time ) { unsigned char controllerNum; - switch( _me.m_type ) + switch( event.type() ) { case MidiControlChange: - controllerNum = _me.m_data.m_bytes[0] & 0x7F; + controllerNum = event.controllerNumber(); if( m_midiPort.inputController() == controllerNum + 1 && - ( m_midiPort.inputChannel() == _me.m_channel + 1 || + ( m_midiPort.inputChannel() == event.channel() + 1 || m_midiPort.inputChannel() == 0 ) ) { - unsigned char val = _me.m_data.m_bytes[2] & 0x7F; + unsigned char val = event.controllerValue(); m_lastValue = (float)( val ) / 127.0f; emit valueChanged(); } diff --git a/src/core/midi/MidiPort.cpp b/src/core/midi/MidiPort.cpp index eb6949356..c798fd265 100644 --- a/src/core/midi/MidiPort.cpp +++ b/src/core/midi/MidiPort.cpp @@ -2,7 +2,7 @@ * MidiPort.cpp - abstraction of MIDI-ports which are part of LMMS's MIDI- * sequencing system * - * Copyright (c) 2005-2013 Tobias Doerffel + * Copyright (c) 2005-2014 Tobias Doerffel * * This file is part of Linux MultiMedia Studio - http://lmms.sourceforge.net * @@ -123,64 +123,58 @@ void MidiPort::setMode( Modes _mode ) -void MidiPort::processInEvent( const midiEvent & _me, const midiTime & _time ) +void MidiPort::processInEvent( const MidiEvent& event, const MidiTime& time ) { // mask event if( inputEnabled() && - ( inputChannel()-1 == _me.m_channel || inputChannel() == 0 ) ) + ( inputChannel() == 0 || inputChannel()-1 == event.channel() ) ) { - midiEvent ev = _me; - if( _me.m_type == MidiNoteOn || - _me.m_type == MidiNoteOff || - _me.m_type == MidiKeyPressure ) + MidiEvent inEvent = event; + if( event.type() == MidiNoteOn || + event.type() == MidiNoteOff || + event.type() == MidiKeyPressure ) { - ev.key() = ev.key() + KeysPerOctave; - if( ev.key() < 0 || ev.key() >= NumKeys ) + inEvent.setKey( inEvent.key() + KeysPerOctave ); + if( inEvent.key() < 0 || inEvent.key() >= NumKeys ) { return; } } - if( fixedInputVelocity() >= 0 && _me.velocity() > 0 ) + if( fixedInputVelocity() >= 0 && inEvent.velocity() > 0 ) { - ev.velocity() = fixedInputVelocity(); + inEvent.setVelocity( fixedInputVelocity() ); } - ev.setFromMidiPort( true ); - m_midiEventProcessor->processInEvent( ev, _time ); + m_midiEventProcessor->processInEvent( inEvent, time ); } } -void MidiPort::processOutEvent( const midiEvent & _me, const midiTime & _time ) +void MidiPort::processOutEvent( const MidiEvent& event, const MidiTime& time ) { // mask event - if( outputEnabled() && realOutputChannel() == _me.m_channel ) + if( outputEnabled() && realOutputChannel() == event.channel() ) { - midiEvent ev = _me; - // we use/display MIDI channels 1...16 but we need 0...15 for - // the outside world - // We are already in "real" MIDI channel space here - /* if( ev.m_channel > 0 ) - { - --ev.m_channel; - } */ - if( ( _me.m_type == MidiNoteOn || _me.m_type == MidiNoteOff ) && + MidiEvent outEvent = event; + + if( ( event.type() == MidiNoteOn || event.type() == MidiNoteOff ) && fixedOutputNote() >= 0 ) { // Convert MIDI note number (from spinbox) -> LMMS note number // that will be converted back when outputted. - ev.key() = fixedOutputNote() - KeysPerOctave; + outEvent.setKey( fixedOutputNote() - KeysPerOctave ); } - if( fixedOutputVelocity() >= 0 && _me.velocity() > 0 && - ( _me.m_type == MidiNoteOn || - _me.m_type == MidiKeyPressure ) ) + + if( fixedOutputVelocity() >= 0 && event.velocity() > 0 && + ( event.type() == MidiNoteOn || event.type() == MidiKeyPressure ) ) { - ev.velocity() = fixedOutputVelocity(); + outEvent.setVelocity( fixedOutputVelocity() ); } - m_midiClient->processOutEvent( ev, _time, this ); + + m_midiClient->processOutEvent( outEvent, time, this ); } } @@ -420,9 +414,9 @@ void MidiPort::updateWritablePorts( void ) void MidiPort::updateOutputProgram( void ) { - processOutEvent( midiEvent( MidiProgramChange, + processOutEvent( MidiEvent( MidiProgramChange, realOutputChannel(), - outputProgram()-1 ), midiTime( 0 ) ); + outputProgram()-1 ), MidiTime( 0 ) ); } diff --git a/src/core/midi/MidiWinMM.cpp b/src/core/midi/MidiWinMM.cpp index dc06db891..7920bc3e3 100644 --- a/src/core/midi/MidiWinMM.cpp +++ b/src/core/midi/MidiWinMM.cpp @@ -57,8 +57,8 @@ MidiWinMM::~MidiWinMM() -void MidiWinMM::processOutEvent( const midiEvent & _me, - const midiTime & _time, +void MidiWinMM::processOutEvent( const MidiEvent & _me, + const MidiTime & _time, const MidiPort * _port ) { const DWORD shortMsg = ( _me.m_type + _me.channel() ) + @@ -137,7 +137,7 @@ void MidiWinMM::removePort( MidiPort * _port ) -QString MidiWinMM::sourcePortName( const midiEvent & _event ) const +QString MidiWinMM::sourcePortName( const MidiEvent & _event ) const { if( _event.sourcePort() ) { @@ -232,22 +232,22 @@ void MidiWinMM::handleInputEvent( HMIDIIN _hm, DWORD _ev ) case MidiNoteOff: case MidiKeyPressure: ( *it )->processInEvent( - midiEvent( cmdtype, chan, par1 - KeysPerOctave, - par2 & 0xff, &_hm ), midiTime() ); + MidiEvent( cmdtype, chan, par1 - KeysPerOctave, + par2 & 0xff, &_hm ), MidiTime() ); break; case MidiControlChange: case MidiProgramChange: case MidiChannelPressure: ( *it )->processInEvent( - midiEvent( cmdtype, chan, par1, par2 & 0xff, &_hm ), - midiTime() ); + MidiEvent( cmdtype, chan, par1, par2 & 0xff, &_hm ), + MidiTime() ); break; case MidiPitchBend: ( *it )->processInEvent( - midiEvent( cmdtype, chan, par1 + par2*128, 0, &_hm ), - midiTime() ); + MidiEvent( cmdtype, chan, par1 + par2*128, 0, &_hm ), + MidiTime() ); break; default: diff --git a/src/core/note.cpp b/src/core/note.cpp index 2d77f0237..ce86cb9c0 100644 --- a/src/core/note.cpp +++ b/src/core/note.cpp @@ -35,7 +35,7 @@ -note::note( const midiTime & _length, const midiTime & _pos, +note::note( const MidiTime & _length, const MidiTime & _pos, int _key, volume_t _volume, panning_t _panning, DetuningHelper * _detuning ) : m_selected( false ), @@ -96,7 +96,7 @@ note::~note() -void note::setLength( const midiTime & _length ) +void note::setLength( const MidiTime & _length ) { // addJournalEntry( journalEntry( ChangeLength, m_length - _length ) ); m_length = _length; @@ -105,7 +105,7 @@ void note::setLength( const midiTime & _length ) -void note::setPos( const midiTime & _pos ) +void note::setPos( const MidiTime & _pos ) { // addJournalEntry( journalEntry( ChangePosition, m_pos - _pos ) ); m_pos = _pos; @@ -144,7 +144,7 @@ void note::setPanning( const panning_t _panning ) -midiTime note::quantized( const midiTime & _m, const int _q_grid ) +MidiTime note::quantized( const MidiTime & _m, const int _q_grid ) { float p = ( (float) _m / _q_grid ); if( p - floorf( p ) < 0.5f ) diff --git a/src/core/note_play_handle.cpp b/src/core/note_play_handle.cpp index 88482599c..c8845b6f6 100644 --- a/src/core/note_play_handle.cpp +++ b/src/core/note_play_handle.cpp @@ -29,6 +29,7 @@ #include "DetuningHelper.h" #include "InstrumentSoundShaping.h" #include "InstrumentTrack.h" +#include "MidiEvent.h" #include "MidiPort.h" #include "song.h" @@ -48,7 +49,8 @@ notePlayHandle::notePlayHandle( InstrumentTrack * _it, const f_cnt_t _frames, const note & _n, notePlayHandle *parent, - const bool _part_of_arp ) : + const bool _part_of_arp, + int MidiEventChannel ) : playHandle( NotePlayHandle, _offset ), note( _n.length(), _n.pos(), _n.key(), _n.getVolume(), _n.getPanning(), _n.detuning() ), @@ -73,7 +75,8 @@ notePlayHandle::notePlayHandle( InstrumentTrack * _it, m_frequency( 0 ), m_unpitchedFrequency( 0 ), m_baseDetuning( NULL ), - m_songGlobalParentOffset( 0 ) + m_songGlobalParentOffset( 0 ), + m_midiChannel( MidiEventChannel >= 0 ? MidiEventChannel : instrumentTrack()->midiPort()->realOutputChannel() ) { if( isTopNote() ) { @@ -103,12 +106,10 @@ notePlayHandle::notePlayHandle( InstrumentTrack * _it, if( !isTopNote() || !instrumentTrack()->isArpeggioEnabled() ) { - // send MIDI-note-on-event - m_instrumentTrack->processOutEvent( midiEvent( MidiNoteOn, - m_instrumentTrack->midiPort()->realOutputChannel(), - midiKey(), midiVelocity() ), - midiTime::fromFrames( offset(), - engine::framesPerTick() ) ); + // send MidiNoteOn event + m_instrumentTrack->processOutEvent( + MidiEvent( MidiNoteOn, midiChannel(), midiKey(), midiVelocity() ), + MidiTime::fromFrames( offset(), engine::framesPerTick() ) ); } } @@ -151,10 +152,21 @@ notePlayHandle::~notePlayHandle() void notePlayHandle::setVolume( const volume_t _volume ) { note::setVolume( _volume ); - m_instrumentTrack->processOutEvent( midiEvent( MidiKeyPressure, - m_instrumentTrack->midiPort()->realOutputChannel(), - midiKey(), midiVelocity() ), 0 ); - + + m_instrumentTrack->processOutEvent( MidiEvent( MidiKeyPressure, midiChannel(), midiKey(), midiVelocity() ) ); +} + + + + +void notePlayHandle::setPanning( const panning_t panning ) +{ + note::setPanning( panning ); + + MidiEvent event( MidiMetaEvent, midiChannel(), midiKey(), panningToMidi( panning ) ); + event.setMetaEvent( MidiNotePanning ); + + m_instrumentTrack->processOutEvent( event ); } @@ -341,12 +353,10 @@ void notePlayHandle::noteOff( const f_cnt_t _s ) if( !isTopNote() || !instrumentTrack()->isArpeggioEnabled() ) { - // send MIDI-note-off-event - m_instrumentTrack->processOutEvent( midiEvent( MidiNoteOff, - m_instrumentTrack->midiPort()->realOutputChannel(), - midiKey(), 0 ), - midiTime::fromFrames( m_framesBeforeRelease, - engine::framesPerTick() ) ); + // send MidiNoteOff event + m_instrumentTrack->processOutEvent( + MidiEvent( MidiNoteOff, midiChannel(), midiKey(), 0 ), + MidiTime::fromFrames( m_framesBeforeRelease, engine::framesPerTick() ) ); } m_released = true; @@ -501,7 +511,7 @@ void notePlayHandle::updateFrequency() -void notePlayHandle::processMidiTime( const midiTime& time ) +void notePlayHandle::processMidiTime( const MidiTime& time ) { if( detuning() && time >= songGlobalParentOffset()+pos() ) { diff --git a/src/core/song.cpp b/src/core/song.cpp index f49f1bb31..f01e7f0cd 100644 --- a/src/core/song.cpp +++ b/src/core/song.cpp @@ -76,7 +76,7 @@ #include #endif -tick_t midiTime::s_ticksPerTact = DefaultTicksPerTact; +tick_t MidiTime::s_ticksPerTact = DefaultTicksPerTact; @@ -256,7 +256,7 @@ void song::setTempo() void song::setTimeSignature() { - midiTime::setTicksPerTact( ticksPerTact() ); + MidiTime::setTicksPerTact( ticksPerTact() ); emit timeSignatureChanged( m_oldTicksPerTact, ticksPerTact() ); emit dataChanged(); m_oldTicksPerTact = ticksPerTact(); @@ -494,7 +494,7 @@ void song::processNextBuffer() #endif // did we play a whole tact? - if( ticks >= midiTime::ticksPerTact() ) + if( ticks >= MidiTime::ticksPerTact() ) { // per default we just continue playing even if // there's no more stuff to play @@ -525,7 +525,7 @@ void song::processNextBuffer() // then start from beginning and keep // offset ticks = ticks % ( max_tact * - midiTime::ticksPerTact() ); + MidiTime::ticksPerTact() ); #ifdef VST_SNC_LATENCY m_SncVSTplug->ppqPos = ( ( ticks + 0 ) / (float)48 ) diff --git a/src/core/timeline.cpp b/src/core/timeline.cpp index 74d754eba..3c0aa6f11 100644 --- a/src/core/timeline.cpp +++ b/src/core/timeline.cpp @@ -47,7 +47,7 @@ QPixmap * timeLine::s_loopPointPixmap = NULL; timeLine::timeLine( const int _xoff, const int _yoff, const float _ppt, - song::playPos & _pos, const midiTime & _begin, + song::playPos & _pos, const MidiTime & _begin, QWidget * _parent ) : QWidget( _parent ), m_autoScroll( AutoScrollEnabled ), @@ -175,7 +175,7 @@ void timeLine::loadSettings( const QDomElement & _this ) -void timeLine::updatePosition( const midiTime & ) +void timeLine::updatePosition( const MidiTime & ) { const int new_x = markerX( m_pos ); @@ -238,7 +238,7 @@ void timeLine::paintEvent( QPaintEvent * ) tact_t tact_num = m_begin.getTact(); int x = m_xOffset + s_posMarkerPixmap->width() / 2 - - ( ( static_cast( m_begin * m_ppt ) / midiTime::ticksPerTact() ) % static_cast( m_ppt ) ); + ( ( static_cast( m_begin * m_ppt ) / MidiTime::ticksPerTact() ) % static_cast( m_ppt ) ); p.setPen( QColor( 192, 192, 192 ) ); for( int i = 0; x + i * m_ppt < width(); ++i ) @@ -248,7 +248,7 @@ void timeLine::paintEvent( QPaintEvent * ) ++tact_num; if( ( tact_num - 1 ) % qMax( 1, qRound( 1.0f / 3.0f * - midiTime::ticksPerTact() / m_ppt ) ) == 0 ) + MidiTime::ticksPerTact() / m_ppt ) ) == 0 ) { const QString s = QString::number( tact_num ); p.drawText( cx + qRound( ( m_ppt - p.fontMetrics(). @@ -285,7 +285,7 @@ void timeLine::mousePressEvent( QMouseEvent* event ) } else if( event->button() == Qt::RightButton ) { - const midiTime t = m_begin + static_cast( event->x() * midiTime::ticksPerTact() / m_ppt ); + const MidiTime t = m_begin + static_cast( event->x() * MidiTime::ticksPerTact() / m_ppt ); if( m_loopPos[0] > m_loopPos[1] ) { qSwap( m_loopPos[0], m_loopPos[1] ); @@ -324,7 +324,7 @@ void timeLine::mousePressEvent( QMouseEvent* event ) void timeLine::mouseMoveEvent( QMouseEvent* event ) { - const midiTime t = m_begin + static_cast( qMax( event->x() - m_xOffset - m_moveXOff, 0 ) * midiTime::ticksPerTact() / m_ppt ); + const MidiTime t = m_begin + static_cast( qMax( event->x() - m_xOffset - m_moveXOff, 0 ) * MidiTime::ticksPerTact() / m_ppt ); switch( m_action ) { @@ -356,9 +356,9 @@ void timeLine::mouseMoveEvent( QMouseEvent* event ) // Note, swap 1 and 0 below and the behavior "skips" the other // marking instead of pushing it. if( m_action == MoveLoopBegin ) - m_loopPos[0] -= midiTime::ticksPerTact(); + m_loopPos[0] -= MidiTime::ticksPerTact(); else - m_loopPos[1] += midiTime::ticksPerTact(); + m_loopPos[1] += MidiTime::ticksPerTact(); } update(); break; diff --git a/src/core/track.cpp b/src/core/track.cpp index 10a4ed80f..f11210e27 100644 --- a/src/core/track.cpp +++ b/src/core/track.cpp @@ -145,7 +145,7 @@ trackContentObject::~trackContentObject() * * \param _pos The new position of the track content object. */ -void trackContentObject::movePosition( const midiTime & _pos ) +void trackContentObject::movePosition( const MidiTime & _pos ) { if( m_startPosition != _pos ) { @@ -166,7 +166,7 @@ void trackContentObject::movePosition( const midiTime & _pos ) * * \param _length The new length of the track content object. */ -void trackContentObject::changeLength( const midiTime & _length ) +void trackContentObject::changeLength( const MidiTime & _length ) { if( m_length != _length ) { @@ -243,7 +243,7 @@ void trackContentObject::paste() { if( Clipboard::getContent( nodeName() ) != NULL ) { - const midiTime pos = startPosition(); + const MidiTime pos = startPosition(); restoreState( *( Clipboard::getContent( nodeName() ) ) ); movePosition( pos ); } @@ -422,7 +422,7 @@ void trackContentObjectView::updateLength() { setFixedWidth( static_cast( m_tco->length() * pixelsPerTact() / - midiTime::ticksPerTact() ) + + MidiTime::ticksPerTact() ) + TCO_BORDER_WIDTH * 2-1 ); } m_trackView->trackContainerView()->update(); @@ -485,7 +485,7 @@ void trackContentObjectView::dropEvent( QDropEvent * _de ) multimediaProject mmp( value.toUtf8() ); // at least save position before getting to moved to somewhere // the user doesn't expect... - midiTime pos = m_tco->startPosition(); + MidiTime pos = m_tco->startPosition(); m_tco->restoreState( mmp.content().firstChild().toElement() ); m_tco->movePosition( pos ); AutomationPattern::resolveAllIDs(); @@ -654,9 +654,9 @@ void trackContentObjectView::mouseMoveEvent( QMouseEvent * _me ) if( m_action == Move ) { const int x = mapToParent( _me->pos() ).x() - m_initialMouseX; - midiTime t = qMax( 0, (int) + MidiTime t = qMax( 0, (int) m_trackView->trackContainerView()->currentPosition()+ - static_cast( x * midiTime::ticksPerTact() / + static_cast( x * MidiTime::ticksPerTact() / ppt ) ); if( ! ( _me->modifiers() & Qt::ControlModifier ) && _me->button() == Qt::NoButton ) @@ -668,7 +668,7 @@ void trackContentObjectView::mouseMoveEvent( QMouseEvent * _me ) s_textFloat->setText( QString( "%1:%2" ). arg( m_tco->startPosition().getTact() + 1 ). arg( m_tco->startPosition().getTicks() % - midiTime::ticksPerTact() ) ); + MidiTime::ticksPerTact() ) ); s_textFloat->moveGlobal( this, QPoint( width() + 2, height() + 2 ) ); } @@ -678,7 +678,7 @@ void trackContentObjectView::mouseMoveEvent( QMouseEvent * _me ) QVector so = m_trackView->trackContainerView()->selectedObjects(); QVector tcos; - midiTime smallest_pos, t; + MidiTime smallest_pos, t; // find out smallest position of all selected objects for not // moving an object before zero for( QVector::iterator it = so.begin(); @@ -695,13 +695,13 @@ void trackContentObjectView::mouseMoveEvent( QMouseEvent * _me ) smallest_pos = qMin( smallest_pos, (int)tco->startPosition() + static_cast( dx * - midiTime::ticksPerTact() / ppt ) ); + MidiTime::ticksPerTact() / ppt ) ); } for( QVector::iterator it = tcos.begin(); it != tcos.end(); ++it ) { t = ( *it )->startPosition() + - static_cast( dx *midiTime::ticksPerTact() / + static_cast( dx *MidiTime::ticksPerTact() / ppt )-smallest_pos; if( ! ( _me->modifiers() & Qt::AltModifier ) && _me->button() == Qt::NoButton ) @@ -713,22 +713,22 @@ void trackContentObjectView::mouseMoveEvent( QMouseEvent * _me ) } else if( m_action == Resize ) { - midiTime t = qMax( midiTime::ticksPerTact() / 16, static_cast( _me->x() * midiTime::ticksPerTact() / ppt ) ); + MidiTime t = qMax( MidiTime::ticksPerTact() / 16, static_cast( _me->x() * MidiTime::ticksPerTact() / ppt ) ); if( ! ( _me->modifiers() & Qt::ControlModifier ) && _me->button() == Qt::NoButton ) { - t = qMax( midiTime::ticksPerTact(), t.toNearestTact() ); + t = qMax( MidiTime::ticksPerTact(), t.toNearestTact() ); } m_tco->changeLength( t ); s_textFloat->setText( tr( "%1:%2 (%3:%4 to %5:%6)" ). arg( m_tco->length().getTact() ). arg( m_tco->length().getTicks() % - midiTime::ticksPerTact() ). + MidiTime::ticksPerTact() ). arg( m_tco->startPosition().getTact() + 1 ). arg( m_tco->startPosition().getTicks() % - midiTime::ticksPerTact() ). + MidiTime::ticksPerTact() ). arg( m_tco->endPosition().getTact() + 1 ). arg( m_tco->endPosition().getTicks() % - midiTime::ticksPerTact() ) ); + MidiTime::ticksPerTact() ) ); s_textFloat->moveGlobal( this, QPoint( width() + 2, height() + 2) ); } @@ -864,8 +864,8 @@ trackContentWidget::trackContentWidget( trackView * _parent ) : setAcceptDrops( true ); connect( _parent->trackContainerView(), - SIGNAL( positionChanged( const midiTime & ) ), - this, SLOT( changePosition( const midiTime & ) ) ); + SIGNAL( positionChanged( const MidiTime & ) ), + this, SLOT( changePosition( const MidiTime & ) ) ); updateBackground(); } @@ -1014,7 +1014,7 @@ void trackContentWidget::update() * * \param _new_pos The MIDI time to move to. */ -void trackContentWidget::changePosition( const midiTime & _new_pos ) +void trackContentWidget::changePosition( const MidiTime & _new_pos ) { if( m_trackView->trackContainerView() == engine::getBBEditor() ) { @@ -1051,7 +1051,7 @@ void trackContentWidget::changePosition( const midiTime & _new_pos ) return; } - midiTime pos = _new_pos; + MidiTime pos = _new_pos; if( pos < 0 ) { pos = m_trackView->trackContainerView()->currentPosition(); @@ -1077,7 +1077,7 @@ void trackContentWidget::changePosition( const midiTime & _new_pos ) ( ts <= begin && te >= end ) ) { tcov->move( static_cast( ( ts - begin ) * ppt / - midiTime::ticksPerTact() ), + MidiTime::ticksPerTact() ), tcov->y() ); if( !tcov->isVisible() ) { @@ -1122,7 +1122,7 @@ void trackContentWidget::dropEvent( QDropEvent * _de ) if( type == ( "tco_" + QString::number( getTrack()->type() ) ) && m_trackView->trackContainerView()->fixedTCOs() == false ) { - const midiTime pos = getPosition( _de->pos().x() + const MidiTime pos = getPosition( _de->pos().x() ).toNearestTact(); trackContentObject * tco = getTrack()->createTCO( pos ); @@ -1162,8 +1162,8 @@ void trackContentWidget::mousePressEvent( QMouseEvent * _me ) else if( _me->button() == Qt::LeftButton && !m_trackView->trackContainerView()->fixedTCOs() ) { - const midiTime pos = getPosition( _me->x() ).getTact() * - midiTime::ticksPerTact(); + const MidiTime pos = getPosition( _me->x() ).getTact() * + MidiTime::ticksPerTact(); trackContentObject * tco = getTrack()->createTCO( pos ); tco->saveJournallingState( false ); @@ -1237,7 +1237,7 @@ void trackContentWidget::undoStep( JournalEntry & _je ) case RemoveTrackContentObject: { - trackContentObject * tco = getTrack()->createTCO( midiTime( 0 ) ); + trackContentObject * tco = getTrack()->createTCO( MidiTime( 0 ) ); multimediaProject mmp( _je.data().toMap()["state"]. toString().toUtf8() ); @@ -1292,11 +1292,11 @@ track * trackContentWidget::getTrack() * * \param _mouse_x the mouse's current X position in pixels. */ -midiTime trackContentWidget::getPosition( int _mouse_x ) +MidiTime trackContentWidget::getPosition( int _mouse_x ) { - return midiTime( m_trackView->trackContainerView()-> + return MidiTime( m_trackView->trackContainerView()-> currentPosition() + _mouse_x * - midiTime::ticksPerTact() / + MidiTime::ticksPerTact() / static_cast( m_trackView-> trackContainerView()->pixelsPerTact() ) ); } @@ -1307,11 +1307,11 @@ midiTime trackContentWidget::getPosition( int _mouse_x ) * * \param _pos_start the starting position of the Widget (from getPosition()) */ -midiTime trackContentWidget::endPosition( const midiTime & _pos_start ) +MidiTime trackContentWidget::endPosition( const MidiTime & _pos_start ) { const float ppt = m_trackView->trackContainerView()->pixelsPerTact(); const int w = width(); - return _pos_start + static_cast( w * midiTime::ticksPerTact() / ppt ); + return _pos_start + static_cast( w * MidiTime::ticksPerTact() / ppt ); } @@ -1762,7 +1762,7 @@ void track::loadSettings( const QDomElement & _this ) !node.toElement().attribute( "metadata" ).toInt() ) { trackContentObject * tco = createTCO( - midiTime( 0 ) ); + MidiTime( 0 ) ); tco->restoreState( node.toElement() ); saveJournallingState( false ); restoreJournallingState(); @@ -1852,7 +1852,7 @@ trackContentObject * track::getTCO( int _tco_num ) } printf( "called track::getTCO( %d ), " "but TCO %d doesn't exist\n", _tco_num, _tco_num ); - return createTCO( _tco_num * midiTime::ticksPerTact() ); + return createTCO( _tco_num * MidiTime::ticksPerTact() ); } @@ -1898,8 +1898,8 @@ int track::getTCONum( trackContentObject * _tco ) * \param _start The MIDI start time of the range. * \param _end The MIDI endi time of the range. */ -void track::getTCOsInRange( tcoVector & _tco_v, const midiTime & _start, - const midiTime & _end ) +void track::getTCOsInRange( tcoVector & _tco_v, const MidiTime & _start, + const MidiTime & _end ) { for( tcoVector::iterator it_o = m_trackContentObjects.begin(); it_o != m_trackContentObjects.end(); ++it_o ) @@ -1948,7 +1948,7 @@ void track::swapPositionOfTCOs( int _tco_num1, int _tco_num2 ) qSwap( m_trackContentObjects[_tco_num1], m_trackContentObjects[_tco_num2] ); - const midiTime pos = m_trackContentObjects[_tco_num1]->startPosition(); + const MidiTime pos = m_trackContentObjects[_tco_num1]->startPosition(); m_trackContentObjects[_tco_num1]->movePosition( m_trackContentObjects[_tco_num2]->startPosition() ); @@ -1965,7 +1965,7 @@ void track::swapPositionOfTCOs( int _tco_num1, int _tco_num2 ) * in ascending order by TCO time, once we hit a TCO that was earlier * than the insert time, we could fall out of the loop early. */ -void track::insertTact( const midiTime & _pos ) +void track::insertTact( const MidiTime & _pos ) { // we'll increase the position of every TCO, positioned behind _pos, by // one tact @@ -1975,7 +1975,7 @@ void track::insertTact( const midiTime & _pos ) if( ( *it )->startPosition() >= _pos ) { ( *it )->movePosition( (*it)->startPosition() + - midiTime::ticksPerTact() ); + MidiTime::ticksPerTact() ); } } } @@ -1987,7 +1987,7 @@ void track::insertTact( const midiTime & _pos ) * * \param _pos The time at which we want to remove the bar. */ -void track::removeTact( const midiTime & _pos ) +void track::removeTact( const MidiTime & _pos ) { // we'll decrease the position of every TCO, positioned behind _pos, by // one tact @@ -1997,7 +1997,7 @@ void track::removeTact( const midiTime & _pos ) if( ( *it )->startPosition() >= _pos ) { ( *it )->movePosition( qMax( ( *it )->startPosition() - - midiTime::ticksPerTact(), 0 ) ); + MidiTime::ticksPerTact(), 0 ) ); } } } @@ -2025,7 +2025,7 @@ tact_t track::length() const } } - return last / midiTime::ticksPerTact(); + return last / MidiTime::ticksPerTact(); } diff --git a/src/gui/AutomationEditor.cpp b/src/gui/AutomationEditor.cpp index ce3847f0e..0c498ba79 100644 --- a/src/gui/AutomationEditor.cpp +++ b/src/gui/AutomationEditor.cpp @@ -57,7 +57,6 @@ #include "gui_templates.h" #include "timeline.h" #include "tooltip.h" -#include "midi.h" #include "tool_button.h" #include "text_float.h" #include "combobox.h" @@ -131,10 +130,10 @@ AutomationEditor::AutomationEditor() : engine::getSong()->getPlayPos( song::Mode_PlayAutomationPattern ), m_currentPosition, this ); - connect( this, SIGNAL( positionChanged( const midiTime & ) ), - m_timeLine, SLOT( updatePosition( const midiTime & ) ) ); - connect( m_timeLine, SIGNAL( positionChanged( const midiTime & ) ), - this, SLOT( updatePosition( const midiTime & ) ) ); + connect( this, SIGNAL( positionChanged( const MidiTime & ) ), + m_timeLine, SLOT( updatePosition( const MidiTime & ) ) ); + connect( m_timeLine, SIGNAL( positionChanged( const MidiTime & ) ), + this, SLOT( updatePosition( const MidiTime & ) ) ); m_toolBar = new QWidget( this ); @@ -789,8 +788,8 @@ void AutomationEditor::drawLine( int _x0, float _y0, int _x1, float _y1 ) x += xstep; i += 1; - m_pattern->removeValue( midiTime( x ) ); - m_pattern->putValue( midiTime( x ), y ); + m_pattern->removeValue( MidiTime( x ) ); + m_pattern->putValue( MidiTime( x ), y ); } } @@ -843,7 +842,7 @@ void AutomationEditor::mousePressEvent( QMouseEvent * _me ) // loop through whole time-map... while( it != time_map.end() ) { - midiTime len = 4; + MidiTime len = 4; // and check whether the user clicked on an // existing value @@ -878,9 +877,9 @@ void AutomationEditor::mousePressEvent( QMouseEvent * _me ) if( it == time_map.end() ) { // then set new value - midiTime value_pos( pos_ticks ); + MidiTime value_pos( pos_ticks ); - midiTime new_time = + MidiTime new_time = m_pattern->putValue( value_pos, level ); @@ -1020,8 +1019,8 @@ void AutomationEditor::mouseMoveEvent( QMouseEvent * _me ) // moved properly according to new starting- // time in the time map of pattern m_pattern->removeValue( - midiTime( pos_ticks ) ); - m_pattern->putValue( midiTime( pos_ticks ), + MidiTime( pos_ticks ) ); + m_pattern->putValue( MidiTime( pos_ticks ), level ); } @@ -1033,7 +1032,7 @@ void AutomationEditor::mouseMoveEvent( QMouseEvent * _me ) ( _me->buttons() & Qt::LeftButton && m_editMode == ERASE ) ) { - m_pattern->removeValue( midiTime( pos_ticks ) ); + m_pattern->removeValue( MidiTime( pos_ticks ) ); } else if( _me->buttons() & Qt::NoButton && m_editMode == DRAW ) { @@ -1216,7 +1215,7 @@ void AutomationEditor::mouseMoveEvent( QMouseEvent * _me ) for( timeMap::iterator it = m_selValuesForMove.begin(); it != m_selValuesForMove.end(); ++it ) { - midiTime new_value_pos; + MidiTime new_value_pos; if( it.key() ) { int value_tact = @@ -1236,7 +1235,7 @@ void AutomationEditor::mouseMoveEvent( QMouseEvent * _me ) DefaultTicksPerTact; } m_pattern->removeValue( it.key() ); - new_value_pos = midiTime( value_tact, + new_value_pos = MidiTime( value_tact, value_ticks ); } new_selValuesForMove[ @@ -2242,7 +2241,7 @@ void AutomationEditor::deleteSelectedValues() -void AutomationEditor::updatePosition( const midiTime & _t ) +void AutomationEditor::updatePosition( const MidiTime & _t ) { if( ( engine::getSong()->isPlaying() && engine::getSong()->playMode() == @@ -2257,7 +2256,7 @@ void AutomationEditor::updatePosition( const midiTime & _t ) } else if( _t < m_currentPosition ) { - midiTime t = qMax( _t - w * DefaultTicksPerTact * + MidiTime t = qMax( _t - w * DefaultTicksPerTact * DefaultTicksPerTact / m_ppt, 0 ); m_leftRightScroll->setValue( t.getTact() * DefaultTicksPerTact ); diff --git a/src/gui/AutomationPatternView.cpp b/src/gui/AutomationPatternView.cpp index cd0127b36..e66c728b4 100644 --- a/src/gui/AutomationPatternView.cpp +++ b/src/gui/AutomationPatternView.cpp @@ -250,7 +250,7 @@ void AutomationPatternView::paintEvent( QPaintEvent * ) if( it+1 == m_pat->getTimeMap().end() ) { const float x1 = x_base + it.key() * ppt / - midiTime::ticksPerTact(); + MidiTime::ticksPerTact(); const float x2 = (float)( width() - TCO_BORDER_WIDTH ); p.fillRect( QRectF( x1, 0.0f, x2-x1, it.value() ), lin2grad ); @@ -262,9 +262,9 @@ void AutomationPatternView::paintEvent( QPaintEvent * ) { float value = values[i - it.key()]; const float x1 = x_base + i * ppt / - midiTime::ticksPerTact(); + MidiTime::ticksPerTact(); const float x2 = x_base + (i+1) * ppt / - midiTime::ticksPerTact(); + MidiTime::ticksPerTact(); p.fillRect( QRectF( x1, 0.0f, x2-x1, value ), lin2grad ); diff --git a/src/gui/ControllerConnectionDialog.cpp b/src/gui/ControllerConnectionDialog.cpp index 5e2903f68..66fed87d3 100644 --- a/src/gui/ControllerConnectionDialog.cpp +++ b/src/gui/ControllerConnectionDialog.cpp @@ -63,13 +63,13 @@ public: } - virtual void processInEvent( const midiEvent& event, const midiTime& time ) + virtual void processInEvent( const MidiEvent& event, const MidiTime& time ) { - if( event.m_type == MidiControlChange && - ( m_midiPort.inputChannel() == event.m_channel + 1 || m_midiPort.inputChannel() == 0 ) ) + if( event.type() == MidiControlChange && + ( m_midiPort.inputChannel() == 0 || m_midiPort.inputChannel() == event.channel() + 1 ) ) { - m_detectedMidiChannel = event.m_channel + 1; - m_detectedMidiController = ( event.m_data.m_bytes[0] & 0x7F ) + 1; + m_detectedMidiChannel = event.channel() + 1; + m_detectedMidiController = event.controllerNumber() + 1; m_detectedMidiPort = engine::mixer()->midiClient()->sourcePortName( event ); emit valueChanged(); diff --git a/src/gui/PianoView.cpp b/src/gui/PianoView.cpp index 18a916a1e..771793247 100644 --- a/src/gui/PianoView.cpp +++ b/src/gui/PianoView.cpp @@ -53,7 +53,7 @@ #include "knob.h" #include "string_pair_drag.h" #include "MainWindow.h" -#include "midi.h" +#include "MidiEvent.h" #include "templates.h" #include "update_event.h" @@ -465,7 +465,7 @@ void PianoView::mousePressEvent( QMouseEvent * _me ) velocity = MidiMaxVelocity; } // set note on - m_piano->midiEventProcessor()->processInEvent( midiEvent( MidiNoteOn, 0, key_num, velocity ), midiTime() ); + m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiNoteOn, 0, key_num, velocity ), MidiTime() ); m_piano->setKeyState( key_num, true ); m_lastKey = key_num; @@ -510,7 +510,7 @@ void PianoView::mouseReleaseEvent( QMouseEvent * ) { if( m_piano != NULL ) { - m_piano->midiEventProcessor()->processInEvent( midiEvent( MidiNoteOff, 0, m_lastKey, 0 ), midiTime() ); + m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiNoteOff, 0, m_lastKey, 0 ), MidiTime() ); m_piano->setKeyState( m_lastKey, false ); } @@ -571,7 +571,7 @@ void PianoView::mouseMoveEvent( QMouseEvent * _me ) { if( m_lastKey != -1 ) { - m_piano->midiEventProcessor()->processInEvent( midiEvent( MidiNoteOff, 0, m_lastKey, 0 ), midiTime() ); + m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiNoteOff, 0, m_lastKey, 0 ), MidiTime() ); m_piano->setKeyState( m_lastKey, false ); m_lastKey = -1; } @@ -579,7 +579,7 @@ void PianoView::mouseMoveEvent( QMouseEvent * _me ) { if( _me->pos().y() > PIANO_BASE ) { - m_piano->midiEventProcessor()->processInEvent( midiEvent( MidiNoteOn, 0, key_num, velocity ), midiTime() ); + m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiNoteOn, 0, key_num, velocity ), MidiTime() ); m_piano->setKeyState( key_num, true ); m_lastKey = key_num; } @@ -593,7 +593,7 @@ void PianoView::mouseMoveEvent( QMouseEvent * _me ) } else if( m_piano->isKeyPressed( key_num ) ) { - m_piano->midiEventProcessor()->processInEvent( midiEvent( MidiKeyPressure, 0, key_num, velocity ), midiTime() ); + m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiKeyPressure, 0, key_num, velocity ), MidiTime() ); } } @@ -690,7 +690,7 @@ void PianoView::focusOutEvent( QFocusEvent * ) // hang otherwise for( int i = 0; i < NumKeys; ++i ) { - m_piano->midiEventProcessor()->processInEvent( midiEvent( MidiNoteOff, 0, i, 0 ), midiTime() ); + m_piano->midiEventProcessor()->processInEvent( MidiEvent( MidiNoteOff, 0, i, 0 ), MidiTime() ); m_piano->setKeyState( i, false ); } update(); diff --git a/src/gui/TrackContainerView.cpp b/src/gui/TrackContainerView.cpp index 214d802a1..11a91727d 100644 --- a/src/gui/TrackContainerView.cpp +++ b/src/gui/TrackContainerView.cpp @@ -127,9 +127,9 @@ trackView * TrackContainerView::addTrackView( trackView * _tv ) m_trackViews.push_back( _tv ); m_scrollLayout->addWidget( _tv ); - connect( this, SIGNAL( positionChanged( const midiTime & ) ), + connect( this, SIGNAL( positionChanged( const MidiTime & ) ), _tv->getTrackContentWidget(), - SLOT( changePosition( const midiTime & ) ) ); + SLOT( changePosition( const MidiTime & ) ) ); realignTracks(); return( _tv ); } diff --git a/src/gui/piano_roll.cpp b/src/gui/piano_roll.cpp index 0c854808d..bf27071fc 100644 --- a/src/gui/piano_roll.cpp +++ b/src/gui/piano_roll.cpp @@ -56,7 +56,7 @@ #include "gui_templates.h" #include "InstrumentTrack.h" #include "MainWindow.h" -#include "midi.h" +#include "MidiEvent.h" #include "mmp.h" #include "pattern.h" #include "Piano.h" @@ -162,7 +162,7 @@ pianoRoll::pianoRoll() : m_oldNotesEditHeight( 100 ), m_notesEditHeight( 100 ), m_ppt( DEFAULT_PR_PPT ), - m_lenOfNewNotes( midiTime( 0, DefaultTicksPerTact/4 ) ), + m_lenOfNewNotes( MidiTime( 0, DefaultTicksPerTact/4 ) ), m_lastNoteVolume( DefaultVolume ), m_lastNotePanning( DefaultPanning ), m_startKey( INITIAL_START_KEY ), @@ -283,21 +283,21 @@ pianoRoll::pianoRoll() : engine::getSong()->getPlayPos( song::Mode_PlayPattern ), m_currentPosition, this ); - connect( this, SIGNAL( positionChanged( const midiTime & ) ), - m_timeLine, SLOT( updatePosition( const midiTime & ) ) ); - connect( m_timeLine, SIGNAL( positionChanged( const midiTime & ) ), - this, SLOT( updatePosition( const midiTime & ) ) ); + connect( this, SIGNAL( positionChanged( const MidiTime & ) ), + m_timeLine, SLOT( updatePosition( const MidiTime & ) ) ); + connect( m_timeLine, SIGNAL( positionChanged( const MidiTime & ) ), + this, SLOT( updatePosition( const MidiTime & ) ) ); // update timeline when in record-accompany mode connect( engine::getSong()->getPlayPos( song::Mode_PlaySong ).m_timeLine, - SIGNAL( positionChanged( const midiTime & ) ), + SIGNAL( positionChanged( const MidiTime & ) ), this, - SLOT( updatePositionAccompany( const midiTime & ) ) ); + SLOT( updatePositionAccompany( const MidiTime & ) ) ); // TODO /* connect( engine::getSong()->getPlayPos( song::Mode_PlayBB ).m_timeLine, - SIGNAL( positionChanged( const midiTime & ) ), + SIGNAL( positionChanged( const MidiTime & ) ), this, - SLOT( updatePositionAccompany( const midiTime & ) ) );*/ + SLOT( updatePositionAccompany( const MidiTime & ) ) );*/ m_toolBar = new QWidget( this ); @@ -927,7 +927,7 @@ inline void pianoRoll::drawDetuningInfo( QPainter & _p, note * _n, int _x, { break; } - int pos_x = _x + pos_ticks * m_ppt / midiTime::ticksPerTact(); + int pos_x = _x + pos_ticks * m_ppt / MidiTime::ticksPerTact(); const float level = it.value(); @@ -1522,7 +1522,7 @@ void pianoRoll::mousePressEvent( QMouseEvent * _me ) x -= WHITE_KEY_WIDTH; // get tick in which the user clicked - int pos_ticks = x * midiTime::ticksPerTact() / m_ppt + + int pos_ticks = x * MidiTime::ticksPerTact() / m_ppt + m_currentPosition; @@ -1535,7 +1535,7 @@ void pianoRoll::mousePressEvent( QMouseEvent * _me ) // loop through whole note-vector... for( int i = 0; i < notes.size(); ++i ) { - midiTime len = ( *it )->length(); + MidiTime len = ( *it )->length(); if( len < 0 ) { len = 4; @@ -1552,7 +1552,7 @@ void pianoRoll::mousePressEvent( QMouseEvent * _me ) ( edit_note == true && pos_ticks <= ( *it )->pos() + NE_LINE_WIDTH * - midiTime::ticksPerTact() / + MidiTime::ticksPerTact() / m_ppt ) ) ) @@ -1593,8 +1593,8 @@ void pianoRoll::mousePressEvent( QMouseEvent * _me ) // +32 to quanitize the note correctly when placing notes with // the mouse. We do this here instead of in note.quantized // because live notes should still be quantized at the half. - midiTime note_pos( pos_ticks - ( quantization() / 2 ) ); - midiTime note_len( newNoteLen() ); + MidiTime note_pos( pos_ticks - ( quantization() / 2 ) ); + MidiTime note_len( newNoteLen() ); note new_note( note_len, note_pos, key_num ); new_note.setSelected( true ); @@ -1701,8 +1701,8 @@ void pianoRoll::mousePressEvent( QMouseEvent * _me ) // clicked at the "tail" of the note? - if( pos_ticks*m_ppt/midiTime::ticksPerTact() > - ( m_currentNote->pos() + m_currentNote->length() )*m_ppt/ midiTime::ticksPerTact() - RESIZE_AREA_WIDTH && + if( pos_ticks*m_ppt/MidiTime::ticksPerTact() > + ( m_currentNote->pos() + m_currentNote->length() )*m_ppt/ MidiTime::ticksPerTact() - RESIZE_AREA_WIDTH && m_currentNote->length() > 0 ) { // then resize the note @@ -1865,16 +1865,16 @@ void pianoRoll::testPlayNote( note * n ) { m_lastKey = n->key(); - if( ! n->isPlaying() && ! m_recording && - ! engine::getSong()->isPlaying() ) + if( ! n->isPlaying() && ! m_recording && ! engine::getSong()->isPlaying() ) { n->setIsPlaying( true ); m_pattern->instrumentTrack()->pianoModel()->handleKeyPress( n->key(), volumeToMidi( n->getVolume() ) ); - midiEvent evt( MidiMetaEvent, 0, n->key(), panningToMidi( n->getPanning() ) ); - - evt.m_metaEvent = MidiNotePanning; - m_pattern->instrumentTrack()->processInEvent( evt, midiTime() ); + MidiEvent event( MidiMetaEvent, 0, n->key(), panningToMidi( n->getPanning() ) ); + + event.setMetaEvent( MidiNotePanning ); + + m_pattern->instrumentTrack()->processInEvent( event, 0 ); } } @@ -1919,10 +1919,6 @@ void pianoRoll::testPlayKey( int key, int velocity, int pan ) // play new key m_pattern->instrumentTrack()->pianoModel()->handleKeyPress( key, velocity ); - - // set panning of newly played key - midiEvent evt( MidiMetaEvent, 0, key, pan ); - evt.m_metaEvent = MidiNotePanning; } @@ -2183,9 +2179,9 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me ) // convert to ticks so that we can check which notes // are in the range int ticks_start = (x-pixel_range/2) * - midiTime::ticksPerTact() / m_ppt + m_currentPosition; + MidiTime::ticksPerTact() / m_ppt + m_currentPosition; int ticks_end = (x+pixel_range/2) * - midiTime::ticksPerTact() / m_ppt + m_currentPosition; + MidiTime::ticksPerTact() / m_ppt + m_currentPosition; // get note-vector of current pattern const NoteVector & notes = m_pattern->notes(); @@ -2234,14 +2230,14 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me ) { n->setVolume( vol ); m_pattern->instrumentTrack()->processInEvent( - midiEvent( MidiKeyPressure, 0, n->key(), volumeToMidi( vol ) ), midiTime() ); + MidiEvent( MidiKeyPressure, 0, n->key(), volumeToMidi( vol ) ), MidiTime() ); } else if( m_noteEditMode == NoteEditPanning ) { n->setPanning( pan ); - midiEvent evt( MidiMetaEvent, 0, n->key(), panningToMidi( pan ) ); - evt.m_metaEvent = MidiNotePanning; - m_pattern->instrumentTrack()->processInEvent( evt, midiTime() ); + MidiEvent evt( MidiMetaEvent, 0, n->key(), panningToMidi( pan ) ); + evt.setMetaEvent( MidiNotePanning ); + m_pattern->instrumentTrack()->processInEvent( evt, MidiTime() ); } } else @@ -2264,7 +2260,7 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me ) // set move- or resize-cursor // get tick in which the cursor is posated - int pos_ticks = ( x * midiTime::ticksPerTact() ) / + int pos_ticks = ( x * MidiTime::ticksPerTact() ) / m_ppt + m_currentPosition; // get note-vector of current pattern @@ -2296,10 +2292,10 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me ) // cursor at the "tail" of the note? if( ( *it )->length() > 0 && pos_ticks*m_ppt / - midiTime::ticksPerTact() > + MidiTime::ticksPerTact() > ( ( *it )->pos() + ( *it )->length() )*m_ppt/ - midiTime::ticksPerTact()- + MidiTime::ticksPerTact()- RESIZE_AREA_WIDTH ) { if( QApplication::overrideCursor() ) @@ -2363,7 +2359,7 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me ) // change size of selection // get tick in which the cursor is posated - int pos_ticks = x * midiTime::ticksPerTact() / m_ppt + + int pos_ticks = x * MidiTime::ticksPerTact() / m_ppt + m_currentPosition; m_selectedTick = pos_ticks - m_selectStartTick; @@ -2383,7 +2379,7 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me ) // holding down right-click to delete notes // get tick in which the user clicked - int pos_ticks = x * midiTime::ticksPerTact() / m_ppt + + int pos_ticks = x * MidiTime::ticksPerTact() / m_ppt + m_currentPosition; @@ -2396,7 +2392,7 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me ) // loop through whole note-vector... while( it != notes.end() ) { - midiTime len = ( *it )->length(); + MidiTime len = ( *it )->length(); if( len < 0 ) { len = 4; @@ -2413,7 +2409,7 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me ) ( edit_note == true && pos_ticks <= ( *it )->pos() + NE_LINE_WIDTH * - midiTime::ticksPerTact() / + MidiTime::ticksPerTact() / m_ppt ) ) ) @@ -2474,7 +2470,7 @@ void pianoRoll::mouseMoveEvent( QMouseEvent * _me ) } // get tick in which the cursor is posated - int pos_ticks = x * midiTime::ticksPerTact()/ m_ppt + + int pos_ticks = x * MidiTime::ticksPerTact()/ m_ppt + m_currentPosition; m_selectedTick = pos_ticks - @@ -2535,7 +2531,7 @@ void pianoRoll::dragNotes( int x, int y, bool alt, bool shift ) // convert pixels to ticks and keys int off_x = x - m_moveStartX; - int off_ticks = off_x * midiTime::ticksPerTact() / m_ppt; + int off_ticks = off_x * MidiTime::ticksPerTact() / m_ppt; int off_key = getKey( y ) - getKey( m_moveStartY ); // handle scroll changes while dragging @@ -2587,7 +2583,7 @@ void pianoRoll::dragNotes( int x, int y, bool alt, bool shift ) { shifted_pos -= off_ticks; } - ( *it )->setPos( midiTime( shifted_pos ) ); + ( *it )->setPos( MidiTime( shifted_pos ) ); } if( ( *it )->selected() ) @@ -2614,7 +2610,7 @@ void pianoRoll::dragNotes( int x, int y, bool alt, bool shift ) key_num = NumKeys; } - ( *it )->setPos( midiTime( pos_ticks ) ); + ( *it )->setPos( MidiTime( pos_ticks ) ); ( *it )->setKey( key_num ); } else if( m_action == ActionResizeNote ) @@ -2636,7 +2632,7 @@ void pianoRoll::dragNotes( int x, int y, bool alt, bool shift ) shift_ref_pos = pos; } } - ( *it )->setLength( midiTime( ticks_new ) ); + ( *it )->setLength( MidiTime( ticks_new ) ); m_lenOfNewNotes = ( *it )->length(); } @@ -2941,7 +2937,7 @@ void pianoRoll::paintEvent( QPaintEvent * _pe ) // triplet mode occurs if the note duration isn't a multiple of 3 bool triplets = ( quantization() % 3 != 0 ); - int spt = midiTime::stepsPerTact(); + int spt = MidiTime::stepsPerTact(); float pp16th = (float)m_ppt / spt; int bpt = DefaultBeatsPerTact; if ( triplets ) { @@ -2953,7 +2949,7 @@ void pianoRoll::paintEvent( QPaintEvent * _pe ) int tact_16th = m_currentPosition / bpt; const int offset = ( m_currentPosition % bpt ) * - m_ppt / midiTime::ticksPerTact(); + m_ppt / MidiTime::ticksPerTact(); bool show32nds = ( m_zoomingModel.value() > 3 ); @@ -3047,9 +3043,9 @@ void pianoRoll::paintEvent( QPaintEvent * _pe ) int pos_ticks = ( *it )->pos(); int note_width = len_ticks * m_ppt / - midiTime::ticksPerTact(); + MidiTime::ticksPerTact(); const int x = ( pos_ticks - m_currentPosition ) * - m_ppt / midiTime::ticksPerTact(); + m_ppt / MidiTime::ticksPerTact(); // skip this note if not in visible area at all if( !( x + note_width >= 0 && x <= width() - WHITE_KEY_WIDTH ) ) @@ -3141,9 +3137,9 @@ void pianoRoll::paintEvent( QPaintEvent * _pe ) // now draw selection-frame int x = ( ( sel_pos_start - m_currentPosition ) * m_ppt ) / - midiTime::ticksPerTact(); + MidiTime::ticksPerTact(); int w = ( ( ( sel_pos_end - m_currentPosition ) * m_ppt ) / - midiTime::ticksPerTact() ) - x; + MidiTime::ticksPerTact() ) - x; int y = (int) y_base - sel_key_start * KEY_LINE_HEIGHT; int h = (int) y_base - sel_key_end * KEY_LINE_HEIGHT - y; p.setPen( QColor( 0, 64, 192 ) ); @@ -3407,7 +3403,7 @@ void pianoRoll::startRecordNote( const note & _n ) engine::getSong()->playMode() == song::Mode_PlayPattern ) ) { - midiTime sub; + MidiTime sub; if( engine::getSong()->playMode() == song::Mode_PlaySong ) { sub = m_pattern->startPosition(); @@ -3596,7 +3592,7 @@ void pianoRoll::copy_to_clipboard( const NoteVector & _notes ) const QDomElement note_list = mmp.createElement( "note-list" ); mmp.content().appendChild( note_list ); - midiTime start_pos( _notes.front()->pos().getTact(), 0 ); + MidiTime start_pos( _notes.front()->pos().getTact(), 0 ); for( NoteVector::ConstIterator it = _notes.begin(); it != _notes.end(); ++it ) { @@ -3752,20 +3748,20 @@ void pianoRoll::deleteSelectedNotes() -void pianoRoll::autoScroll( const midiTime & _t ) +void pianoRoll::autoScroll( const MidiTime & _t ) { const int w = width() - WHITE_KEY_WIDTH; - if( _t > m_currentPosition + w * midiTime::ticksPerTact() / m_ppt ) + if( _t > m_currentPosition + w * MidiTime::ticksPerTact() / m_ppt ) { m_leftRightScroll->setValue( _t.getTact() * - midiTime::ticksPerTact() ); + MidiTime::ticksPerTact() ); } else if( _t < m_currentPosition ) { - midiTime t = qMax( _t - w * midiTime::ticksPerTact() * - midiTime::ticksPerTact() / m_ppt, 0 ); + MidiTime t = qMax( _t - w * MidiTime::ticksPerTact() * + MidiTime::ticksPerTact() / m_ppt, 0 ); m_leftRightScroll->setValue( t.getTact() * - midiTime::ticksPerTact() ); + MidiTime::ticksPerTact() ); } m_scrollBack = false; } @@ -3773,7 +3769,7 @@ void pianoRoll::autoScroll( const midiTime & _t ) -void pianoRoll::updatePosition( const midiTime & _t ) +void pianoRoll::updatePosition( const MidiTime & _t ) { if( ( engine::getSong()->isPlaying() && engine::getSong()->playMode() == @@ -3788,14 +3784,14 @@ void pianoRoll::updatePosition( const midiTime & _t ) -void pianoRoll::updatePositionAccompany( const midiTime & _t ) +void pianoRoll::updatePositionAccompany( const MidiTime & _t ) { song * s = engine::getSong(); if( m_recording && validPattern() && s->playMode() != song::Mode_PlayPattern ) { - midiTime pos = _t; + MidiTime pos = _t; if( s->playMode() != song::Mode_PlayBB ) { pos -= m_pattern->startPosition(); @@ -3868,7 +3864,7 @@ void pianoRoll::updateSemiToneMarkerMenu() -midiTime pianoRoll::newNoteLen() const +MidiTime pianoRoll::newNoteLen() const { if( m_noteLenModel.value() == 0 ) { @@ -3906,7 +3902,7 @@ note * pianoRoll::noteUnderMouse() int key_num = getKey( pos.y() ); int pos_ticks = ( pos.x() - WHITE_KEY_WIDTH ) * - midiTime::ticksPerTact() / m_ppt + m_currentPosition; + MidiTime::ticksPerTact() / m_ppt + m_currentPosition; // will be our iterator in the following loop NoteVector::ConstIterator it = notes.begin()+notes.size()-1; diff --git a/src/gui/song_editor.cpp b/src/gui/song_editor.cpp index 60d7ed256..4a2205fbd 100644 --- a/src/gui/song_editor.cpp +++ b/src/gui/song_editor.cpp @@ -99,11 +99,11 @@ songEditor::songEditor( song * _song, songEditor * & _engine_ptr ) : pixelsPerTact(), m_s->m_playPos[song::Mode_PlaySong], m_currentPosition, this ); - connect( this, SIGNAL( positionChanged( const midiTime & ) ), + connect( this, SIGNAL( positionChanged( const MidiTime & ) ), m_s->m_playPos[song::Mode_PlaySong].m_timeLine, - SLOT( updatePosition( const midiTime & ) ) ); - connect( m_timeLine, SIGNAL( positionChanged( const midiTime & ) ), - this, SLOT( updatePosition( const midiTime & ) ) ); + SLOT( updatePosition( const MidiTime & ) ) ); + connect( m_timeLine, SIGNAL( positionChanged( const MidiTime & ) ), + this, SLOT( updatePosition( const MidiTime & ) ) ); m_positionLine = new positionLine( this ); @@ -419,7 +419,7 @@ void songEditor::setHighQuality( bool _hq ) void songEditor::scrolled( int _new_pos ) { update(); - emit positionChanged( m_currentPosition = midiTime( _new_pos, 0 ) ); + emit positionChanged( m_currentPosition = MidiTime( _new_pos, 0 ) ); } @@ -503,7 +503,7 @@ void songEditor::keyPressEvent( QKeyEvent * _ke ) } else if( _ke->key() == Qt::Key_Left ) { - tick_t t = m_s->currentTick() - midiTime::ticksPerTact(); + tick_t t = m_s->currentTick() - MidiTime::ticksPerTact(); if( t >= 0 ) { m_s->setPlayPos( t, song::Mode_PlaySong ); @@ -511,7 +511,7 @@ void songEditor::keyPressEvent( QKeyEvent * _ke ) } else if( _ke->key() == Qt::Key_Right ) { - tick_t t = m_s->currentTick() + midiTime::ticksPerTact(); + tick_t t = m_s->currentTick() + MidiTime::ticksPerTact(); if( t < MaxSongLength ) { m_s->setPlayPos( t, song::Mode_PlaySong ); @@ -706,7 +706,7 @@ static inline void animateScroll( QScrollBar *scrollBar, int newVal, bool smooth } -void songEditor::updatePosition( const midiTime & _t ) +void songEditor::updatePosition( const MidiTime & _t ) { int widgetWidth, trackOpWidth; if( configManager::inst()->value( "ui", "compacttrackbuttons" ).toInt() ) @@ -727,15 +727,15 @@ void songEditor::updatePosition( const midiTime & _t ) const int w = width() - widgetWidth - trackOpWidth - 32; // rough estimation for width of right scrollbar - if( _t > m_currentPosition + w * midiTime::ticksPerTact() / + if( _t > m_currentPosition + w * MidiTime::ticksPerTact() / pixelsPerTact() ) { animateScroll( m_leftRightScroll, _t.getTact(), m_smoothScroll ); } else if( _t < m_currentPosition ) { - midiTime t = qMax( - (int)( _t - w * midiTime::ticksPerTact() / + MidiTime t = qMax( + (int)( _t - w * MidiTime::ticksPerTact() / pixelsPerTact() ), 0 ); animateScroll( m_leftRightScroll, t.getTact(), m_smoothScroll ); diff --git a/src/tracks/AutomationTrack.cpp b/src/tracks/AutomationTrack.cpp index 5988ba3c5..3353ae3eb 100644 --- a/src/tracks/AutomationTrack.cpp +++ b/src/tracks/AutomationTrack.cpp @@ -50,7 +50,7 @@ AutomationTrack::~AutomationTrack() -bool AutomationTrack::play( const midiTime & _start, const fpp_t _frames, +bool AutomationTrack::play( const MidiTime & _start, const fpp_t _frames, const f_cnt_t _frame_base, int _tco_num ) { if( isMuted() ) @@ -77,7 +77,7 @@ bool AutomationTrack::play( const midiTime & _start, const fpp_t _frames, { continue; } - midiTime cur_start = _start; + MidiTime cur_start = _start; if( _tco_num < 0 ) { cur_start -= p->startPosition(); @@ -98,7 +98,7 @@ trackView * AutomationTrack::createView( TrackContainerView* tcv ) -trackContentObject * AutomationTrack::createTCO( const midiTime & ) +trackContentObject * AutomationTrack::createTCO( const MidiTime & ) { return new AutomationPattern( this ); } @@ -168,11 +168,11 @@ void AutomationTrackView::dropEvent( QDropEvent * _de ) journallingObject( val.toInt() ) ); if( mod != NULL ) { - midiTime pos = midiTime( trackContainerView()-> + MidiTime pos = MidiTime( trackContainerView()-> currentPosition() + ( _de->pos().x() - getTrackContentWidget()->x() ) * - midiTime::ticksPerTact() / + MidiTime::ticksPerTact() / static_cast( trackContainerView()->pixelsPerTact() ) ) .toNearestTact(); diff --git a/src/tracks/InstrumentTrack.cpp b/src/tracks/InstrumentTrack.cpp index a88f07fcb..8aaab7b9b 100644 --- a/src/tracks/InstrumentTrack.cpp +++ b/src/tracks/InstrumentTrack.cpp @@ -202,15 +202,15 @@ void InstrumentTrack::processAudioBuffer( sampleFrame * _buf, -midiEvent InstrumentTrack::applyMasterKey( const midiEvent & _me ) +MidiEvent InstrumentTrack::applyMasterKey( const MidiEvent& event ) { - midiEvent copy( _me ); - switch( _me.m_type ) + MidiEvent copy( event ); + switch( event.type() ) { case MidiNoteOn: case MidiNoteOff: case MidiKeyPressure: - copy.key() = masterKey( _me.key() ); + copy.setKey( masterKey( event.key() ) ); break; default: break; @@ -221,109 +221,92 @@ midiEvent InstrumentTrack::applyMasterKey( const midiEvent & _me ) -void InstrumentTrack::processInEvent( const midiEvent & _me, - const midiTime & _time ) +void InstrumentTrack::processInEvent( const MidiEvent& event, const MidiTime& time ) { engine::mixer()->lock(); - // in the special case this event comes from a MIDI port, the instrument - // is MIDI based (VST plugin, Sf2Player etc.) and the user did not set - // a dedicated MIDI output channel, directly pass the MIDI event to the - // instrument plugin - if( _me.isFromMidiPort() && m_instrument->isMidiBased()/* && - midiPort()->realOutputChannel() < 0 */ ) - { - m_instrument->handleMidiEvent( _me, _time ); - engine::mixer()->unlock(); - return; - } + bool eventHandled = false; - switch( _me.m_type ) + switch( event.type() ) { // we don't send MidiNoteOn, MidiNoteOff and MidiKeyPressure // events to instrument as notePlayHandle will send them on its // own - case MidiNoteOn: - if( _me.velocity() > 0 ) + case MidiNoteOn: + if( event.velocity() > 0 ) { - if( m_notes[_me.key()] == NULL ) + if( m_notes[event.key()] == NULL ) { - if( !configManager::inst()->value( "ui", - "manualchannelpiano" ).toInt() ) + if( !configManager::inst()->value( "ui", "manualchannelpiano" ).toInt() ) { - m_piano.setKeyState( - _me.key(), true ); + m_piano.setKeyState( event.key(), true ); } // create temporary note note n; - n.setKey( _me.key() ); - n.setVolume( _me.getVolume() ); + n.setKey( event.key() ); + n.setVolume( event.volume() ); // create (timed) note-play-handle - notePlayHandle * nph = new - notePlayHandle( this, - _time.frames( - engine::framesPerTick() ), - typeInfo::max() / 2, - n ); - if( engine::mixer()->addPlayHandle( - nph ) ) + notePlayHandle* nph = new notePlayHandle( this, time.frames( engine::framesPerTick() ), typeInfo::max() / 2, + n, NULL, false, event.channel() ); + if( engine::mixer()->addPlayHandle( nph ) ) { - m_notes[_me.key()] = nph; + m_notes[event.key()] = nph; } emit noteOn( n ); + + eventHandled = true; + } break; } case MidiNoteOff: { - notePlayHandle * n = m_notes[_me.key()]; - if( n != NULL ) + notePlayHandle* nph = m_notes[event.key()]; + if( nph != NULL ) { // create dummy-note which has the same length // as the played note for sending it later // to all slots connected to signal noteOff() // this is for example needed by piano-roll for // recording notes into a pattern - note done_note( - midiTime( static_cast( - n->totalFramesPlayed() / - engine::framesPerTick() ) ), - 0, - n->key(), - n->getVolume(), - n->getPanning() ); + note n( MidiTime( static_cast( nph->totalFramesPlayed() / engine::framesPerTick() ) ), + 0, nph->key(), nph->getVolume(), nph->getPanning() ); - n->noteOff(); - m_notes[_me.key()] = NULL; + emit noteOff( n ); - emit noteOff( done_note ); + // now do actual note off and remove internal reference to NotePlayHandle (which itself will + // be deleted later automatically) + nph->noteOff(); + m_notes[event.key()] = NULL; + + eventHandled = true; } break; } case MidiKeyPressure: - if( m_notes[_me.key()] != NULL ) + if( m_notes[event.key()] != NULL ) { - m_notes[_me.key()]->setVolume( _me.getVolume() ); + eventHandled = true; + // setVolume() calls processOutEvent() with MidiKeyPressure so the + // attached instrument will receive the event as well + m_notes[event.key()]->setVolume( event.volume() ); } break; case MidiPitchBend: - // updatePitch() is connected to - // m_pitchModel::dataChanged() which will send out + // updatePitch() is connected to m_pitchModel::dataChanged() which will send out // MidiPitchBend events - m_pitchModel.setValue( m_pitchModel.minValue() + - _me.m_data.m_param[0] * - m_pitchModel.range() / 16384 ); + m_pitchModel.setValue( m_pitchModel.minValue() + event.pitchBend() * m_pitchModel.range() / 16384 ); break; case MidiControlChange: - if( _me.controllerNumber() == MidiControllerSustain ) + if( event.controllerNumber() == MidiControllerSustain ) { - if( _me.controllerValue() > MidiMaxControllerValue/2 ) + if( event.controllerValue() > MidiMaxControllerValue/2 ) { m_sustainPedalPressed = true; } @@ -332,120 +315,99 @@ void InstrumentTrack::processInEvent( const midiEvent & _me, m_sustainPedalPressed = false; } } - if( _me.controllerNumber() == MidiControllerAllSoundOff || - _me.controllerNumber() == MidiControllerAllNotesOff || - _me.controllerNumber() == MidiControllerOmniOn || - _me.controllerNumber() == MidiControllerOmniOff || - _me.controllerNumber() == MidiControllerMonoOn || - _me.controllerNumber() == MidiControllerPolyOn ) + if( event.controllerNumber() == MidiControllerAllSoundOff || + event.controllerNumber() == MidiControllerAllNotesOff || + event.controllerNumber() == MidiControllerOmniOn || + event.controllerNumber() == MidiControllerOmniOff || + event.controllerNumber() == MidiControllerMonoOn || + event.controllerNumber() == MidiControllerPolyOn ) { silenceAllNotes(); } - m_instrument->handleMidiEvent( _me, _time ); break; - case MidiProgramChange: - m_instrument->handleMidiEvent( _me, _time ); - break; - case MidiMetaEvent: // handle special cases such as note panning - switch( _me.m_metaEvent ) + switch( event.metaEvent() ) { case MidiNotePanning: - if( m_notes[_me.key()] != NULL ) + if( m_notes[event.key()] != NULL ) { - m_notes[_me.key()]->setPanning( _me.getPanning() ); + eventHandled = true; + m_notes[event.key()]->setPanning( event.panning() ); } break; default: - printf( "instrument-track: unhandled " - "MIDI meta event: %i\n", - _me.m_metaEvent ); + qWarning( "InstrumentTrack: unhandled MIDI meta event: %i", event.metaEvent() ); break; } break; default: - if( !m_instrument->handleMidiEvent( _me, _time ) ) - { - printf( "instrument-track: unhandled " - "MIDI event %d\n", _me.m_type ); - } break; } + + if( eventHandled == false && instrument()->handleMidiEvent( event, time ) == false ) + { + qWarning( "InstrumentTrack: unhandled MIDI event %d", event.type() ); + } + engine::mixer()->unlock(); } -void InstrumentTrack::processOutEvent( const midiEvent & _me, - const midiTime & _time ) +void InstrumentTrack::processOutEvent( const MidiEvent& event, const MidiTime& time ) { int k; - switch( _me.m_type ) + switch( event.type() ) { case MidiNoteOn: - if( !configManager::inst()->value( "ui", - "manualchannelpiano" ).toInt() ) + if( !configManager::inst()->value( "ui", "manualchannelpiano" ).toInt() ) { - m_piano.setKeyState( _me.key(), true ); + m_piano.setKeyState( event.key(), true ); } - if( !configManager::inst()->value( "ui", - "disablechannelactivityindicators" ).toInt() ) + if( !configManager::inst()->value( "ui", "disablechannelactivityindicators" ).toInt() ) { - if( m_notes[_me.key()] == NULL ) + if( m_notes[event.key()] == NULL ) { emit newNote(); } } - k = masterKey( _me.key() ); + k = masterKey( event.key() ); if( k >= 0 && k < NumKeys ) { if( m_runningMidiNotes[k] > 0 ) { - m_instrument->handleMidiEvent( - midiEvent( MidiNoteOff, midiPort()->realOutputChannel(), k, 0 ), - _time ); + m_instrument->handleMidiEvent( MidiEvent( MidiNoteOff, midiPort()->realOutputChannel(), k, 0 ), time ); } ++m_runningMidiNotes[k]; - m_instrument->handleMidiEvent( - midiEvent( MidiNoteOn, midiPort()->realOutputChannel(), k, - _me.velocity() ), _time ); + m_instrument->handleMidiEvent( MidiEvent( MidiNoteOn, midiPort()->realOutputChannel(), k, event.velocity() ), time ); } break; case MidiNoteOff: - if( !configManager::inst()->value( "ui", - "manualchannelpiano" ).toInt() ) + if( !configManager::inst()->value( "ui", "manualchannelpiano" ).toInt() ) { - m_piano.setKeyState( _me.key(), false ); + m_piano.setKeyState( event.key(), false ); } - k = masterKey( _me.key() ); - if( k >= 0 && k < NumKeys && - --m_runningMidiNotes[k] <= 0 ) + k = masterKey( event.key() ); + if( k >= 0 && k < NumKeys && --m_runningMidiNotes[k] <= 0 ) { m_runningMidiNotes[k] = qMax( 0, m_runningMidiNotes[k] ); - m_instrument->handleMidiEvent( - midiEvent( MidiNoteOff, midiPort()->realOutputChannel(), k, 0 ), - _time ); + m_instrument->handleMidiEvent( MidiEvent( MidiNoteOff, midiPort()->realOutputChannel(), k, 0 ), time ); } break; default: - if( m_instrument != NULL ) - { - m_instrument->handleMidiEvent( - applyMasterKey( _me ), - _time ); - } + m_instrument->handleMidiEvent( applyMasterKey( event ), time ); break; } // if appropriate, midi-port does futher routing - m_midiPort.processOutEvent( _me, _time ); + m_midiPort.processOutEvent( event, time ); } @@ -525,7 +487,7 @@ void InstrumentTrack::deleteNotePluginData( notePlayHandle * _n ) // Notes deleted when keys still pressed if( m_notes[_n->key()] == _n ) { - note done_note( midiTime( static_cast( + note done_note( MidiTime( static_cast( _n->totalFramesPlayed() / engine::framesPerTick() ) ), 0, _n->key(), @@ -581,9 +543,7 @@ void InstrumentTrack::updateBaseNote() void InstrumentTrack::updatePitch() { updateBaseNote(); - processOutEvent( midiEvent( MidiPitchBend, - midiPort()->realOutputChannel(), - midiPitch() ), 0 ); + processOutEvent( MidiEvent( MidiPitchBend, midiPort()->realOutputChannel(), midiPitch() ), 0 ); } @@ -616,7 +576,7 @@ void InstrumentTrack::removeMidiPortNode( multimediaProject & _mmp ) -bool InstrumentTrack::play( const midiTime & _start, const fpp_t _frames, +bool InstrumentTrack::play( const MidiTime & _start, const fpp_t _frames, const f_cnt_t _offset, int _tco_num ) { const float frames_per_tick = engine::framesPerTick(); @@ -657,7 +617,7 @@ bool InstrumentTrack::play( const midiTime & _start, const fpp_t _frames, { continue; } - midiTime cur_start = _start; + MidiTime cur_start = _start; if( _tco_num < 0 ) { cur_start -= p->startPosition(); @@ -747,7 +707,7 @@ bool InstrumentTrack::play( const midiTime & _start, const fpp_t _frames, -trackContentObject * InstrumentTrack::createTCO( const midiTime & ) +trackContentObject * InstrumentTrack::createTCO( const MidiTime & ) { return new pattern( this ); } @@ -1182,8 +1142,8 @@ void InstrumentTrackView::toggleInstrumentWindow( bool _on ) void InstrumentTrackView::activityIndicatorPressed() { model()->processInEvent( - midiEvent( MidiNoteOn, 0, DefaultKey, MidiMaxVelocity ), - midiTime() ); + MidiEvent( MidiNoteOn, 0, DefaultKey, MidiMaxVelocity ), + MidiTime() ); } @@ -1191,8 +1151,8 @@ void InstrumentTrackView::activityIndicatorPressed() void InstrumentTrackView::activityIndicatorReleased() { - model()->processInEvent( midiEvent( MidiNoteOff, 0, DefaultKey, 0 ), - midiTime() ); + model()->processInEvent( MidiEvent( MidiNoteOff, 0, DefaultKey, 0 ), + MidiTime() ); } diff --git a/src/tracks/SampleTrack.cpp b/src/tracks/SampleTrack.cpp index 9b7e55eed..25f6eee3b 100644 --- a/src/tracks/SampleTrack.cpp +++ b/src/tracks/SampleTrack.cpp @@ -74,7 +74,7 @@ SampleTCO::~SampleTCO() -void SampleTCO::changeLength( const midiTime & _length ) +void SampleTCO::changeLength( const MidiTime & _length ) { trackContentObject::changeLength( qMax( static_cast( _length ), DefaultTicksPerTact ) ); } @@ -128,7 +128,7 @@ void SampleTCO::updateLength( bpm_t ) -midiTime SampleTCO::sampleLength() const +MidiTime SampleTCO::sampleLength() const { return (int)( m_sampleBuffer->frames() / engine::framesPerTick() ); } @@ -406,7 +406,7 @@ SampleTrack::~SampleTrack() -bool SampleTrack::play( const midiTime & _start, const fpp_t _frames, +bool SampleTrack::play( const MidiTime & _start, const fpp_t _frames, const f_cnt_t _offset, int /*_tco_num*/ ) { m_audioPort.effects()->startRunning(); @@ -461,7 +461,7 @@ trackView * SampleTrack::createView( TrackContainerView* tcv ) -trackContentObject * SampleTrack::createTCO( const midiTime & ) +trackContentObject * SampleTrack::createTCO( const MidiTime & ) { return new SampleTCO( this ); } diff --git a/src/tracks/bb_track.cpp b/src/tracks/bb_track.cpp index 67b2c2b59..a2c041e57 100644 --- a/src/tracks/bb_track.cpp +++ b/src/tracks/bb_track.cpp @@ -55,7 +55,7 @@ bbTCO::bbTCO( track * _track, unsigned int _color ) : if( t > 0 ) { saveJournallingState( false ); - changeLength( midiTime( t, 0 ) ); + changeLength( MidiTime( t, 0 ) ); restoreJournallingState(); } } @@ -192,7 +192,7 @@ void bbTCOView::paintEvent( QPaintEvent * ) tact_t t = engine::getBBTrackContainer()->lengthOfBB( bbTrack::numOfBBTrack( m_bbTCO->getTrack() ) ); - if( m_bbTCO->length() > midiTime::ticksPerTact() && t > 0 ) + if( m_bbTCO->length() > MidiTime::ticksPerTact() && t > 0 ) { for( int x = static_cast( t * pixelsPerTact() ); x < width()-2; @@ -341,7 +341,7 @@ bbTrack::~bbTrack() // play _frames frames of given TCO within starting with _start -bool bbTrack::play( const midiTime & _start, const fpp_t _frames, +bool bbTrack::play( const MidiTime & _start, const fpp_t _frames, const f_cnt_t _offset, int _tco_num ) { if( isMuted() ) @@ -362,8 +362,8 @@ bool bbTrack::play( const midiTime & _start, const fpp_t _frames, return false; } - midiTime lastPosition; - midiTime lastLen; + MidiTime lastPosition; + MidiTime lastLen; for( tcoVector::iterator it = tcos.begin(); it != tcos.end(); ++it ) { if( !( *it )->isMuted() && @@ -392,7 +392,7 @@ trackView * bbTrack::createView( TrackContainerView* tcv ) -trackContentObject * bbTrack::createTCO( const midiTime & _pos ) +trackContentObject * bbTrack::createTCO( const MidiTime & _pos ) { // if we're creating a new bbTCO, we colorize it according to the // previous bbTCO, so we have to get all TCOs from 0 to _pos and diff --git a/src/tracks/pattern.cpp b/src/tracks/pattern.cpp index 611f18adc..95ab237aa 100644 --- a/src/tracks/pattern.cpp +++ b/src/tracks/pattern.cpp @@ -63,7 +63,7 @@ pattern::pattern( InstrumentTrack * _instrument_track ) : trackContentObject( _instrument_track ), m_instrumentTrack( _instrument_track ), m_patternType( BeatPattern ), - m_steps( midiTime::stepsPerTact() ), + m_steps( MidiTime::stepsPerTact() ), m_frozenPattern( NULL ), m_freezing( false ), m_freezeAborted( false ) @@ -127,14 +127,14 @@ void pattern::init() -midiTime pattern::length() const +MidiTime pattern::length() const { if( m_patternType == BeatPattern ) { return beatPatternLength(); } - tick_t max_length = midiTime::ticksPerTact(); + tick_t max_length = MidiTime::ticksPerTact(); for( NoteVector::ConstIterator it = m_notes.begin(); it != m_notes.end(); ++it ) @@ -145,16 +145,16 @@ midiTime pattern::length() const ( *it )->endPos() ); } } - return midiTime( max_length ).nextFullTact() * - midiTime::ticksPerTact(); + return MidiTime( max_length ).nextFullTact() * + MidiTime::ticksPerTact(); } -midiTime pattern::beatPatternLength() const +MidiTime pattern::beatPatternLength() const { - tick_t max_length = midiTime::ticksPerTact(); + tick_t max_length = MidiTime::ticksPerTact(); for( NoteVector::ConstIterator it = m_notes.begin(); it != m_notes.end(); ++it ) @@ -163,18 +163,18 @@ midiTime pattern::beatPatternLength() const { max_length = qMax( max_length, ( *it )->pos() + - midiTime::ticksPerTact() / - midiTime::stepsPerTact() ); + MidiTime::ticksPerTact() / + MidiTime::stepsPerTact() ); } } - if( m_steps != midiTime::stepsPerTact() ) + if( m_steps != MidiTime::stepsPerTact() ) { - max_length = m_steps * midiTime::ticksPerTact() / - midiTime::stepsPerTact() ; + max_length = m_steps * MidiTime::ticksPerTact() / + MidiTime::stepsPerTact() ; } - return midiTime( max_length ).nextFullTact() * midiTime::ticksPerTact(); + return MidiTime( max_length ).nextFullTact() * MidiTime::ticksPerTact(); } @@ -385,7 +385,7 @@ void pattern::loadSettings( const QDomElement & _this ) { movePosition( _this.attribute( "pos" ).toInt() ); } - changeLength( midiTime( _this.attribute( "len" ).toInt() ) ); + changeLength( MidiTime( _this.attribute( "len" ).toInt() ) ); if( _this.attribute( "muted" ).toInt() != isMuted() ) { toggleMute(); @@ -409,7 +409,7 @@ void pattern::loadSettings( const QDomElement & _this ) m_steps = _this.attribute( "steps" ).toInt(); if( m_steps == 0 ) { - m_steps = midiTime::stepsPerTact(); + m_steps = MidiTime::stepsPerTact(); } ensureBeatNotes(); @@ -487,7 +487,7 @@ void pattern::abortFreeze() void pattern::addSteps() { - m_steps += midiTime::stepsPerTact(); + m_steps += MidiTime::stepsPerTact(); ensureBeatNotes(); emit dataChanged(); } @@ -497,7 +497,7 @@ void pattern::addSteps() void pattern::removeSteps() { - int _n = midiTime::stepsPerTact(); + int _n = MidiTime::stepsPerTact(); if( _n < m_steps ) { for( int i = m_steps - _n; i < m_steps; ++i ) @@ -506,8 +506,8 @@ void pattern::removeSteps() it != m_notes.end(); ++it ) { if( ( *it )->pos() == - i * midiTime::ticksPerTact() / - midiTime::stepsPerTact() && + i * MidiTime::ticksPerTact() / + MidiTime::stepsPerTact() && ( *it )->length() <= 0 ) { removeNote( *it ); @@ -542,8 +542,8 @@ void pattern::ensureBeatNotes() it != m_notes.end(); ++it ) { if( ( *it )->pos() == - i * midiTime::ticksPerTact() / - midiTime::stepsPerTact() && + i * MidiTime::ticksPerTact() / + MidiTime::stepsPerTact() && ( *it )->length() <= 0 ) { found = true; @@ -552,9 +552,9 @@ void pattern::ensureBeatNotes() } if( found == false ) { - addNote( note( midiTime( 0 ), midiTime( i * - midiTime::ticksPerTact() / - midiTime::stepsPerTact() ) ), false ); + addNote( note( MidiTime( 0 ), MidiTime( i * + MidiTime::ticksPerTact() / + MidiTime::stepsPerTact() ) ), false ); } } } @@ -591,17 +591,17 @@ bool pattern::empty() void pattern::changeTimeSignature() { - midiTime last_pos = midiTime::ticksPerTact(); + MidiTime last_pos = MidiTime::ticksPerTact(); for( NoteVector::ConstIterator cit = m_notes.begin(); cit != m_notes.end(); ++cit ) { if( ( *cit )->length() < 0 && ( *cit )->pos() > last_pos ) { - last_pos = ( *cit )->pos()+midiTime::ticksPerTact() / - midiTime::stepsPerTact(); + last_pos = ( *cit )->pos()+MidiTime::ticksPerTact() / + MidiTime::stepsPerTact(); } } - last_pos = last_pos.nextFullTact() * midiTime::ticksPerTact(); + last_pos = last_pos.nextFullTact() * MidiTime::ticksPerTact(); for( NoteVector::Iterator it = m_notes.begin(); it != m_notes.end(); ) { if( ( *it )->length() == 0 && ( *it )->pos() >= last_pos ) @@ -616,8 +616,8 @@ void pattern::changeTimeSignature() } } m_steps = qMax( - qMax( m_steps, midiTime::stepsPerTact() ), - last_pos.getTact() * midiTime::stepsPerTact() ); + qMax( m_steps, MidiTime::stepsPerTact() ), + last_pos.getTact() * MidiTime::stepsPerTact() ); ensureBeatNotes(); } @@ -970,7 +970,7 @@ void patternView::mouseDoubleClickEvent( QMouseEvent * _me ) if( m_pat->type() == pattern::MelodyPattern || !( m_pat->type() == pattern::BeatPattern && ( pixelsPerTact() >= 192 || - m_pat->m_steps != midiTime::stepsPerTact() ) && + m_pat->m_steps != MidiTime::stepsPerTact() ) && _me->y() > height() - s_stepBtnOff->height() ) ) { openInPianoRoll(); @@ -985,7 +985,7 @@ void patternView::mousePressEvent( QMouseEvent * _me ) if( _me->button() == Qt::LeftButton && m_pat->m_patternType == pattern::BeatPattern && ( fixedTCOs() || pixelsPerTact() >= 96 || - m_pat->m_steps != midiTime::stepsPerTact() ) && + m_pat->m_steps != MidiTime::stepsPerTact() ) && _me->y() > height() - s_stepBtnOff->height() ) { int step = ( _me->x() - TCO_BORDER_WIDTH ) * @@ -1033,7 +1033,7 @@ void patternView::wheelEvent( QWheelEvent * _we ) { if( m_pat->m_patternType == pattern::BeatPattern && ( fixedTCOs() || pixelsPerTact() >= 96 || - m_pat->m_steps != midiTime::stepsPerTact() ) && + m_pat->m_steps != MidiTime::stepsPerTact() ) && _we->y() > height() - s_stepBtnOff->height() ) { int step = ( _we->x() - TCO_BORDER_WIDTH ) * @@ -1192,9 +1192,9 @@ void patternView::paintEvent( QPaintEvent * ) { const int x1 = 2 * x_base + static_cast( ( *it )->pos() * ppt / - midiTime::ticksPerTact() ); + MidiTime::ticksPerTact() ); const int x2 = - static_cast( ( ( *it )->pos() + ( *it )->length() ) * ppt / midiTime::ticksPerTact() ); + static_cast( ( ( *it )->pos() + ( *it )->length() ) * ppt / MidiTime::ticksPerTact() ); p.drawLine( x1, y_base + y_pos, x2, y_base + y_pos ); @@ -1205,7 +1205,7 @@ void patternView::paintEvent( QPaintEvent * ) } else if( m_pat->m_patternType == pattern::BeatPattern && ( fixedTCOs() || ppt >= 96 - || m_pat->m_steps != midiTime::stepsPerTact() ) ) + || m_pat->m_steps != MidiTime::stepsPerTact() ) ) { QPixmap stepon; QPixmap stepoverlay;