Hi,

I improved this patch to allow also map Program Change messages - so now user 
can change songs using Program Change messages ;-)

It is still possible to use PC messages as in previous version (for select next 
pattern) if user map appropriate action.

Please append it to official repo.

BTW. my first question from previous mail is still valid.

Pawel

Dnia PoniedziaƂek, 10 Czerwca 2013 22:54 Pawel <[email protected]> napisaƂ(a) 
> Hi,
> 
> I've done simple patch for handling playlist via MIDI. For my purpose I use 
> it for precisely select song to play live (via CC). In my M-Audio Axiom I can 
> set fixed MIDI CC value to buttons. 
> 
> Meantime I have two question:
> 1) I want to add support for playlist in h2cli. Please tell me it is enough 
> to just call
> LocalFileMng::loadPlayList
> 
> ?
> 
> 2) Currently Program Change messages are restricted to pattern switching , 
> will be OK for you to add support for mapping this messages ? I imagine 
> scenario where I could load playlist in h2cli and change songs via Program 
> Change messages - this is actually my long term goal ;-)
> 
> Best Regards
> Xj

diff --git a/src/core/include/hydrogen/IO/MidiInput.h b/src/core/include/hydrogen/IO/MidiInput.h
index 85cd1c7..0f33ba0 100644
--- a/src/core/include/hydrogen/IO/MidiInput.h
+++ b/src/core/include/hydrogen/IO/MidiInput.h
@@ -50,6 +50,7 @@ public:
 	void handleMidiMessage( const MidiMessage& msg );
 	void handleSysexMessage( const MidiMessage& msg );
 	void handleControlChangeMessage( const MidiMessage& msg );
+	void handleProgramChangeMessage( const MidiMessage& msg );
 
 protected:
 	bool m_bActive;
diff --git a/src/core/include/hydrogen/midi_action.h b/src/core/include/hydrogen/midi_action.h
index 44718ab..472e0bc 100644
--- a/src/core/include/hydrogen/midi_action.h
+++ b/src/core/include/hydrogen/midi_action.h
@@ -54,17 +54,14 @@ class MidiAction : public H2Core::Object {
 			return type;
 		}
 
-
 	private:
 		QString type;
 		QString parameter1;
 		QString parameter2;
 };
 
-
 bool setAbsoluteFXLevel( int nLine, int fx_channel , int fx_param);
 
-
 class MidiActionManager : public H2Core::Object
 {
 	H2_OBJECT
diff --git a/src/core/include/hydrogen/midi_map.h b/src/core/include/hydrogen/midi_map.h
index 9cf5c2e..91f506e 100644
--- a/src/core/include/hydrogen/midi_map.h
+++ b/src/core/include/hydrogen/midi_map.h
@@ -47,21 +47,23 @@ class MidiMap : public H2Core::Object
 
 		void registerMMCEvent( QString, MidiAction* );
 		void registerNoteEvent( int , MidiAction* );
-		void registerCCEvent( int , MidiAction * );
+		void registerCCEvent( int , MidiAction* );
+		void registerPCEvent( MidiAction* );
 
 		map_t getMMCMap();
 
 		MidiAction* getMMCAction( QString );
 		MidiAction* getNoteAction( int note );
-		MidiAction * getCCAction( int parameter );
+		MidiAction* getCCAction( int parameter );
+		MidiAction* getPCAction();
 
 		void setupNoteArray();
-
 	private:
 		MidiMap();
 
 		MidiAction* __note_array[ 128 ];
 		MidiAction* __cc_array[ 128 ];
+		MidiAction* __pc_action;
 
 		map_t mmcMap;
 		QMutex __mutex;
diff --git a/src/core/src/IO/midi_input.cpp b/src/core/src/IO/midi_input.cpp
index 4623f57..2f837b9 100644
--- a/src/core/src/IO/midi_input.cpp
+++ b/src/core/src/IO/midi_input.cpp
@@ -102,7 +102,8 @@ void MidiInput::handleMidiMessage( const MidiMessage& msg )
 
 		case MidiMessage::PROGRAM_CHANGE:
 				INFOLOG( QString( "[handleMidiMessage] PROGRAM_CHANGE event, seting next pattern to %1" ).arg( msg.m_nData1 ) );
-				Hydrogen::get_instance()->sequencer_setNextPattern(msg.m_nData1, false, false);
+//				Hydrogen::get_instance()->sequencer_setNextPattern(msg.m_nData1, false, false);
+				handleProgramChangeMessage( msg );
 				break;
 
 		case MidiMessage::CHANNEL_PRESSURE:
@@ -154,23 +155,34 @@ void MidiInput::handleMidiMessage( const MidiMessage& msg )
 
 void MidiInput::handleControlChangeMessage( const MidiMessage& msg )
 {
-		//INFOLOG( QString( "[handleMidiMessage] CONTROL_CHANGE Parameter: %1, Value: %2" ).arg( msg.m_nData1 ).arg( msg.m_nData2 ) );
-
+	//INFOLOG( QString( "[handleMidiMessage] CONTROL_CHANGE Parameter: %1, Value: %2" ).arg( msg.m_nData1 ).arg( msg.m_nData2 ) );
 	Hydrogen *pEngine = Hydrogen::get_instance();
-		MidiActionManager * aH = MidiActionManager::get_instance();
-	MidiMap * mM = MidiMap::get_instance();
-
-		MidiAction * pAction;
+	MidiActionManager *aH = MidiActionManager::get_instance();
+	MidiMap *mM = MidiMap::get_instance();
 
-	pAction = mM->getCCAction( msg.m_nData1 );
+	MidiAction *pAction = mM->getCCAction( msg.m_nData1 );
 	pAction->setParameter2( QString::number( msg.m_nData2 ) );
 
 	aH->handleAction( pAction );
 
 	pEngine->lastMidiEvent = "CC";
 	pEngine->lastMidiEventParameter = msg.m_nData1;
+}
+
+void MidiInput::handleProgramChangeMessage( const MidiMessage& msg )
+{
+	INFOLOG( QString( "[handleMidiMessage] PROGRAM_CHANGE Value: %1" ).arg( msg.m_nData1 ) );
+	Hydrogen *pEngine = Hydrogen::get_instance();
+	MidiActionManager *aH = MidiActionManager::get_instance();
+	MidiMap *mM = MidiMap::get_instance();
+
+	MidiAction *pAction = mM->getPCAction();
+	pAction->setParameter2( QString::number( msg.m_nData1 ) );
 
+	aH->handleAction( pAction );
 
+	pEngine->lastMidiEvent = "PROGRAM_CHANGE";
+	pEngine->lastMidiEventParameter = msg.m_nData1;
 }
 
 void MidiInput::handleNoteOnMessage( const MidiMessage& msg )
@@ -365,9 +377,8 @@ if ( msg.m_sysexData.size() == 6 ) {
 			}
 
 			case 4:	// FAST FWD
-								pEngine->lastMidiEvent = "MMC_FAST_FORWARD";
-								aH->handleAction(mM->getMMCAction("MMC_FAST_FORWARD"));
-
+				pEngine->lastMidiEvent = "MMC_FAST_FORWARD";
+				aH->handleAction(mM->getMMCAction("MMC_FAST_FORWARD"));
 				break;
 
 			case 5:	// REWIND
@@ -385,10 +396,10 @@ if ( msg.m_sysexData.size() == 6 ) {
 				aH->handleAction(mM->getMMCAction("MMC_RECORD_EXIT"));
 				break;
 
-						case 8:	// RECORD READY
-								pEngine->lastMidiEvent = "MMC_RECORD_READY";
-								aH->handleAction(mM->getMMCAction("MMC_RECORD_READY"));
-								break;
+			case 8:	// RECORD READY
+				pEngine->lastMidiEvent = "MMC_RECORD_READY";
+				aH->handleAction(mM->getMMCAction("MMC_RECORD_READY"));
+				break;
 
 			case 9:	//PAUSE
 				pEngine->lastMidiEvent = "MMC_PAUSE";
diff --git a/src/core/src/midi_action.cpp b/src/core/src/midi_action.cpp
index d1cca6b..769c298 100644
--- a/src/core/src/midi_action.cpp
+++ b/src/core/src/midi_action.cpp
@@ -37,8 +37,7 @@
 
 using namespace H2Core;
 
-
-/* Helperfunction */
+/* Helperfunctions */
 
 bool setAbsoluteFXLevel( int nLine, int fx_channel , int fx_param)
 {
@@ -61,7 +60,16 @@ bool setAbsoluteFXLevel( int nLine, int fx_channel , int fx_param)
 	Hydrogen::get_instance()->setSelectedInstrumentNumber(nLine);
 
 	return true;
+}
 
+bool setSong( int songnumber ) {
+	Hydrogen *pEngine = Hydrogen::get_instance();
+
+	int asn = Playlist::get_instance()->getActiveSongNumber();
+	if(asn != songnumber && songnumber >= 0 && songnumber <= pEngine->m_PlayList.size()-1){
+		Playlist::get_instance()->setNextSongByNumber( songnumber );
+	}
+	return true;
 }
 
 /**
@@ -95,8 +103,6 @@ MidiAction::MidiAction( QString typeString ) : Object( __class_name ) {
 	QString parameter2 = "0" ;
 }
 
-
-
 /**
 * @class MidiActionManager
 *
@@ -162,6 +168,7 @@ MidiActionManager::MidiActionManager() : Object( __class_name )
 			  << "PAN_ABSOLUTE"
 			  << "BEATCOUNTER"
 			  << "TAP_TEMPO"
+			  << "PLAYLIST_SONG"
 			  << "PLAYLIST_NEXT_SONG"
 			  << "PLAYLIST_PREV_SONG"
 			  << "TOGGLE_METRONOME"
@@ -180,7 +187,8 @@ MidiActionManager::MidiActionManager() : Object( __class_name )
 			  << "MMC_RECORD_READY"
 			  << "MMC_PAUSE"
 			  << "NOTE"
-			  << "CC";
+			  << "CC"
+			  << "PROGRAM_CHANGE";
 }
 
 
@@ -196,13 +204,10 @@ void MidiActionManager::create_instance()
 	}
 }
 
-
 /**
  * The handleAction method is the heard of the MidiActionManager class.
  * It executes the operations that are needed to carry the desired action.
  */
-
-
 bool MidiActionManager::handleAction( MidiAction * pAction ){
 
 	Hydrogen *pEngine = Hydrogen::get_instance();
@@ -247,7 +252,6 @@ bool MidiActionManager::handleAction( MidiAction * pAction ){
 		return true;
 	}
 
-
 	if( sActionString == "PAUSE" )
 	{
 		pEngine->sequencer_stop();
@@ -354,9 +358,6 @@ bool MidiActionManager::handleAction( MidiAction * pAction ){
 		return true;
 	}
 
-
-
-
 	if( sActionString == "EFFECT1_LEVEL_ABSOLUTE" ){
 		bool ok;
 		int nLine = pAction->getParameter1().toInt(&ok,10);
@@ -385,10 +386,6 @@ bool MidiActionManager::handleAction( MidiAction * pAction ){
 		setAbsoluteFXLevel( nLine, 3 , fx_param );
 	}
 
-
-
-
-
 	if( sActionString == "MASTER_VOLUME_RELATIVE" ){
 		//increments/decrements the volume of the whole song
 
@@ -414,8 +411,6 @@ bool MidiActionManager::handleAction( MidiAction * pAction ){
 
 	}
 
-
-
 	if( sActionString == "MASTER_VOLUME_ABSOLUTE" ){
 		//sets the volume of a master output to a given level (percentage)
 
@@ -435,8 +430,6 @@ bool MidiActionManager::handleAction( MidiAction * pAction ){
 
 	}
 
-
-
 	if( sActionString == "STRIP_VOLUME_RELATIVE" ){
 		//increments/decrements the volume of one mixer strip
 
@@ -495,12 +488,10 @@ bool MidiActionManager::handleAction( MidiAction * pAction ){
 		Hydrogen::get_instance()->setSelectedInstrumentNumber(nLine);
 	}
 
-
 	if( sActionString == "PAN_ABSOLUTE" ){
 
 		// sets the absolute panning of a given mixer channel
 
-
 		bool ok;
 		int nLine = pAction->getParameter1().toInt(&ok,10);
 		int pan_param = pAction->getParameter2().toInt(&ok,10);
@@ -558,12 +549,10 @@ bool MidiActionManager::handleAction( MidiAction * pAction ){
 		// changes the panning of a given mixer channel
 		// this is useful if the panning is set by a rotary control knob
 
-
 		bool ok;
 		int nLine = pAction->getParameter1().toInt(&ok,10);
 		int pan_param = pAction->getParameter2().toInt(&ok,10);
 
-
 		float pan_L;
 		float pan_R;
 
@@ -615,7 +604,6 @@ bool MidiActionManager::handleAction( MidiAction * pAction ){
 		return true;
 	}
 
-
 	if( sActionString == "BPM_CC_RELATIVE" ){
 		/*
 		 * increments/decrements the BPM
@@ -700,7 +688,6 @@ bool MidiActionManager::handleAction( MidiAction * pAction ){
 		return true;
 	}
 
-
 	if( sActionString == "BPM_INCR" ){
 		AudioEngine::get_instance()->lock( RIGHT_HERE );
 
@@ -748,20 +735,20 @@ bool MidiActionManager::handleAction( MidiAction * pAction ){
 		return true;
 	}
 
+	if( sActionString == "PLAYLIST_SONG"){
+		bool ok;
+		int songnumber = pAction->getParameter2().toInt(&ok,10);
+		return setSong( songnumber );
+	}
+
 	if( sActionString == "PLAYLIST_NEXT_SONG"){
 		int songnumber = Playlist::get_instance()->getActiveSongNumber();
-		if(songnumber+1 >= 0 && songnumber+1 <= pEngine->m_PlayList.size()-1){
-			Playlist::get_instance()->setNextSongByNumber( songnumber + 1 );
-		}
-		return true;
+		return setSong( ++songnumber );
 	}
 
 	if( sActionString == "PLAYLIST_PREV_SONG"){
 		int songnumber = Playlist::get_instance()->getActiveSongNumber();
-		if(songnumber-1 >= 0 && songnumber-1 <= pEngine->m_PlayList.size()-1){
-			Playlist::get_instance()->setNextSongByNumber( songnumber - 1 );
-		}
-		return true;
+		return setSong( --songnumber );
 	}
 
 	if( sActionString == "RECORD_READY"){
diff --git a/src/core/src/midi_map.cpp b/src/core/src/midi_map.cpp
index d17fbea..fad6122 100644
--- a/src/core/src/midi_map.cpp
+++ b/src/core/src/midi_map.cpp
@@ -25,7 +25,6 @@
 #include <map>
 #include <QMutexLocker>
 
-
 /**
 * @class MidiMap
 *
@@ -42,7 +41,6 @@
 *
 */
 
-
 MidiMap * MidiMap::__instance = 0;
 const char* MidiMap::__class_name = "MidiMap";
 
@@ -57,6 +55,7 @@ MidiMap::MidiMap()
 		__note_array[ note ] = new MidiAction("NOTHING");
 		__cc_array[ note ] = new MidiAction("NOTHING");
 	}
+	__pc_action = new MidiAction("NOTHING");
 }
 
 MidiMap::~MidiMap()
@@ -73,6 +72,7 @@ MidiMap::~MidiMap()
 		delete __note_array[ i ];
 		delete __cc_array[ i ];
 	}
+	delete __pc_action;
 
 	__instance = NULL;
 }
@@ -161,6 +161,14 @@ void MidiMap::registerCCEvent( int parameter , MidiAction * pAction ){
 	}
 }
 
+/**
+ * Sets up the relation between a program change and an action
+ */
+void MidiMap::registerPCEvent( MidiAction * pAction ){
+	QMutexLocker mx(&__mutex);
+	delete __pc_action;
+	__pc_action = pAction;
+}
 
 /**
  * Returns the mmc action which was linked to the given event.
@@ -194,3 +202,12 @@ MidiAction * MidiMap::getCCAction( int parameter )
 	return __cc_array[ parameter ];
 }
 
+/**
+ * Returns the pc action which was linked to the given event.
+ */
+MidiAction * MidiMap::getPCAction()
+{
+	QMutexLocker mx(&__mutex);
+	return __pc_action;
+}
+
diff --git a/src/core/src/preferences.cpp b/src/core/src/preferences.cpp
index 6b2cde5..678a690 100644
--- a/src/core/src/preferences.cpp
+++ b/src/core/src/preferences.cpp
@@ -662,7 +662,7 @@ void Preferences::loadPreferences( bool bGlobal )
 						QString s_action = pMidiEventNode.firstChildElement("action").text();
 						QString s_param = pMidiEventNode.firstChildElement("parameter").text();
 						QString s_eventParameter = pMidiEventNode.firstChildElement("eventParameter").text();
-												MidiAction* pAction = new MidiAction( s_action );
+						MidiAction* pAction = new MidiAction( s_action );
 						pAction->setParameter1( s_param );
 						mM->registerNoteEvent(s_eventParameter.toInt(), pAction);
 					}
@@ -672,21 +672,26 @@ void Preferences::loadPreferences( bool bGlobal )
 						QString s_action = pMidiEventNode.firstChildElement("action").text();
 						QString s_param = pMidiEventNode.firstChildElement("parameter").text();
 						QString s_eventParameter = pMidiEventNode.firstChildElement("eventParameter").text();
-												MidiAction * pAction = new MidiAction( s_action );
+						MidiAction * pAction = new MidiAction( s_action );
 						pAction->setParameter1( s_param );
 						mM->registerCCEvent( s_eventParameter.toInt(), pAction );
 					}
 
-					pMidiEventNode = pMidiEventNode.nextSiblingElement( "midiEvent" );
+					if( pMidiEventNode.firstChildElement().nodeName() == QString("pcEvent") ){
+						QString event = pMidiEventNode.firstChildElement("pcEvent").text();
+						QString s_action = pMidiEventNode.firstChildElement("action").text();
+						QString s_param = pMidiEventNode.firstChildElement("parameter").text();
+						MidiAction * pAction = new MidiAction( s_action );
+						pAction->setParameter1( s_param );
+						mM->registerPCEvent( pAction );
+					}
 
+					pMidiEventNode = pMidiEventNode.nextSiblingElement( "midiEvent" );
 				}
 
 			} else {
 				WARNINGLOG( "midiMap node not found" );
 			}
-
-
-
 		} // rootNode
 		else {
 			WARNINGLOG( "hydrogen_preferences node not found" );
@@ -994,7 +999,7 @@ void Preferences::savePreferences()
 		std::map< QString, MidiAction* >::iterator dIter( mmcMap.begin() );
 	for( dIter = mmcMap.begin(); dIter != mmcMap.end(); dIter++ ){
 		QString event = dIter->first;
-			MidiAction * pAction = dIter->second;
+		MidiAction * pAction = dIter->second;
 		if ( pAction->getType() != "NOTHING" ){
 			QDomNode midiEventNode = doc.createElement( "midiEvent" );
 
@@ -1007,38 +1012,42 @@ void Preferences::savePreferences()
 	}
 
 	for( int note=0; note < 128; note++ ){
-			MidiAction * pAction = mM->getNoteAction( note );
+		MidiAction * pAction = mM->getNoteAction( note );
 		if( pAction != NULL && pAction->getType() != "NOTHING") {
-		QDomNode midiEventNode = doc.createElement( "midiEvent" );
-
-		LocalFileMng::writeXmlString( midiEventNode, "noteEvent" , QString("NOTE") );
-		LocalFileMng::writeXmlString( midiEventNode, "eventParameter" , QString::number( note ) );
-		LocalFileMng::writeXmlString( midiEventNode, "action" , pAction->getType() );
-		LocalFileMng::writeXmlString( midiEventNode, "parameter" , pAction->getParameter1() );
-
+			QDomNode midiEventNode = doc.createElement( "midiEvent" );
 
-		midiEventMapNode.appendChild(midiEventNode);
+			LocalFileMng::writeXmlString( midiEventNode, "noteEvent" , QString("NOTE") );
+			LocalFileMng::writeXmlString( midiEventNode, "eventParameter" , QString::number( note ) );
+			LocalFileMng::writeXmlString( midiEventNode, "action" , pAction->getType() );
+			LocalFileMng::writeXmlString( midiEventNode, "parameter" , pAction->getParameter1() );
+			midiEventMapNode.appendChild( midiEventNode );
 		}
 	}
 
-		for( int parameter=0; parameter < 128; parameter++ ){
-						MidiAction * pAction = mM->getCCAction( parameter );
-			if( pAction != NULL && pAction->getType() != "NOTHING")
-			{
-				QDomNode midiEventNode = doc.createElement( "midiEvent" );
-
-				LocalFileMng::writeXmlString( midiEventNode, "ccEvent" , QString("CC") );
-				LocalFileMng::writeXmlString( midiEventNode, "eventParameter" , QString::number( parameter ) );
-
+	for( int parameter=0; parameter < 128; parameter++ ){
+		MidiAction * pAction = mM->getCCAction( parameter );
+		if( pAction != NULL && pAction->getType() != "NOTHING") {
+			QDomNode midiEventNode = doc.createElement( "midiEvent" );
 
-				LocalFileMng::writeXmlString( midiEventNode, "action" , pAction->getType() );
+			LocalFileMng::writeXmlString( midiEventNode, "ccEvent" , QString("CC") );
+			LocalFileMng::writeXmlString( midiEventNode, "eventParameter" , QString::number( parameter ) );
+			LocalFileMng::writeXmlString( midiEventNode, "action" , pAction->getType() );
+			LocalFileMng::writeXmlString( midiEventNode, "parameter" , pAction->getParameter1() );
+			midiEventMapNode.appendChild( midiEventNode );
+		}
+	}
 
-				LocalFileMng::writeXmlString( midiEventNode, "parameter" , pAction->getParameter1() );
+	{
+		MidiAction * pAction = mM->getPCAction();
+		if( pAction != NULL && pAction->getType() != "NOTHING") {
+			QDomNode midiEventNode = doc.createElement( "midiEvent" );
 
-				midiEventMapNode.appendChild( midiEventNode );
-			}
+			LocalFileMng::writeXmlString( midiEventNode, "pcEvent" , QString("PROGRAM_CHANGE") );
+			LocalFileMng::writeXmlString( midiEventNode, "action" , pAction->getType() );
+			LocalFileMng::writeXmlString( midiEventNode, "parameter" , pAction->getParameter1() );
+			midiEventMapNode.appendChild( midiEventNode );
 		}
-
+	}
 
 	rootNode.appendChild( midiEventMapNode );
 
diff --git a/src/gui/src/widgets/midiTable.cpp b/src/gui/src/widgets/midiTable.cpp
index 08893cc..45cf129 100644
--- a/src/gui/src/widgets/midiTable.cpp
+++ b/src/gui/src/widgets/midiTable.cpp
@@ -155,7 +155,6 @@ void MidiTable::setupMidiTable()
 
 	setHorizontalHeaderLabels( items );
 	
-	
 	setFixedWidth( 500 );
 
 	setColumnWidth( 0 , 25 );
@@ -164,11 +163,9 @@ void MidiTable::setupMidiTable()
 	setColumnWidth( 3, 175 );
 	setColumnWidth( 4 , 73 );
 
-
 	bool ok;
 	std::map< QString , MidiAction* > mmcMap = mM->getMMCMap();
 	std::map< QString , MidiAction* >::iterator dIter( mmcMap.begin() );
-
 	
 	for( dIter = mmcMap.begin(); dIter != mmcMap.end(); dIter++ ) {
 		MidiAction * pAction = dIter->second;
@@ -207,6 +204,15 @@ void MidiTable::setupMidiTable()
 
 		insertNewRow(pAction->getType() , "CC" , parameter , actionParameterInteger );
 	}
+
+	{
+		MidiAction * pAction = mM->getPCAction();
+		if ( pAction->getType() != "NOTHING" ) {
+			QString actionParameter = pAction->getParameter1();
+			int actionParameterInteger = actionParameter.toInt(&ok,10);
+			insertNewRow( pAction->getType() , "PROGRAM_CHANGE" , 0 , actionParameterInteger );
+		}
+	}
 	
 	insertNewRow( "", "", 0, 0 );
 }
@@ -236,17 +242,15 @@ void MidiTable::saveMidiTable()
 			if( actionSpinner->cleanText() != ""){
 				pAction->setParameter1( actionSpinner->cleanText() );
 			}
-	
+
 			if( eventString.left(2) == "CC" ){
 				mM->registerCCEvent( eventSpinner->cleanText().toInt() , pAction );
-			}
-
-			if( eventString.left(3) == "MMC" ){
+			} else if( eventString.left(3) == "MMC" ){
 				mM->registerMMCEvent( eventString , pAction );
-			}
-			
-			if( eventString.left(4) == "NOTE" ){
+			} else if( eventString.left(4) == "NOTE" ){
 				mM->registerNoteEvent( eventSpinner->cleanText().toInt() , pAction );
+			} else if( eventString.left(14) == "PROGRAM_CHANGE" ){
+				mM->registerPCEvent( pAction );
 			}
 		}
 	}
------------------------------------------------------------------------------
This SF.net email is sponsored by Windows:

Build for Windows Store.

http://p.sf.net/sfu/windows-dev2dev
_______________________________________________
Hydrogen-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/hydrogen-devel

Reply via email to