Index: /branches/midi_out/libs/hydrogen/src/IO/portmidi_driver.cpp
===================================================================
--- /branches/midi_out/libs/hydrogen/src/IO/portmidi_driver.cpp	(revision 298)
+++ /branches/midi_out/libs/hydrogen/src/IO/portmidi_driver.cpp	(revision 774)
@@ -24,4 +24,8 @@
 
 #include <hydrogen/Preferences.h>
+#include <hydrogen/note.h>
+#include <hydrogen/instrument.h>
+#include <hydrogen/hydrogen.h>
+#include <hydrogen/globals.h>
 
 #ifdef WIN32
@@ -114,5 +118,5 @@
 
 PortMidiDriver::PortMidiDriver()
-		: MidiInput( "PortMidiDriver" )
+		: MidiInput( "PortMidiDriver" ), MidiOutput( "PortMidiDriver" ), Object( "PortMidiDriver" )
 		, m_bRunning( false )
 {
@@ -136,4 +140,5 @@
 
 	int nDeviceId = -1;
+	int nOutDeviceId = -1;
 	QString sMidiPortName = Preferences::getInstance()->m_sMidiPortName;
 	int nDevices = Pm_CountDevices();
@@ -149,8 +154,19 @@
 			}
 		}
+		
+		if ( info->output == TRUE ) {
+			if ( info->name == sMidiPortName.toStdString() ) {
+				nOutDeviceId = i;
+			}
+		}
 	}
 
 	if ( nDeviceId == -1 ) {
 		INFOLOG( "Midi input device not found." );
+		return;
+	}
+	
+	if ( nOutDeviceId == -1 ) {
+		INFOLOG( "Midi output device not found." );
 		return;
 	}
@@ -176,4 +192,18 @@
 		ERRORLOG( "Error in Pm_OpenInput" );
 	}
+	
+	err = Pm_OpenOutput(
+	                  &m_pMidiOut,
+	                  nOutDeviceId,
+	                  NULL,
+	                  nInputBufferSize,
+	                  TIME_PROC,
+	                  NULL,
+			  0
+	              );
+
+	if ( err != pmNoError ) {
+		ERRORLOG( "Error in Pm_OpenInput" );
+	}
 
 	m_bRunning = true;
@@ -220,4 +250,59 @@
 }
 
+void PortMidiDriver::handleQueueNote(Note* pNote)
+{	
+	if ( m_pMidiOut == NULL ) {
+		ERRORLOG( "m_pMidiOut = NULL " );
+		return;
+	}
+
+	int channel = pNote->get_instrument()->get_midi_out_channel();
+	if (channel < 0) {
+		return;
+	}
+		
+	int key = pNote->get_instrument()->get_midi_out_note();
+	int velocity = pNote->get_velocity() * 127;
+	
+	PmEvent event;
+	event.timestamp = 0;
+	
+	//Note off
+	event.message = Pm_Message(0x80 | channel, key, velocity);
+	Pm_Write(m_pMidiOut, &event, 1);
+	
+	//Note on
+	event.message = Pm_Message(0x90 | channel, key, velocity);
+	Pm_Write(m_pMidiOut, &event, 1);
+}
+
+void PortMidiDriver::handleQueueAllNoteOff()
+{
+	if ( m_pMidiOut == NULL ) {
+		ERRORLOG( "m_pMidiOut = NULL " );
+		return;
+	}
+	
+	InstrumentList *instList = Hydrogen::get_instance()->getSong()->get_instrument_list();
+		
+	unsigned int numInstruments = instList->get_size();
+	for (int index = 0; index < numInstruments; ++index) {
+		Instrument *curInst = instList->get(index);
+	
+		int channel = curInst->get_midi_out_channel();
+		if (channel < 0) {
+			continue;
+		}
+		int key = curInst->get_midi_out_note();
+		
+		PmEvent event;
+		event.timestamp = 0;
+	
+		//Note off
+		event.message = Pm_Message(0x80 | channel, key, 0);
+		Pm_Write(m_pMidiOut, &event, 1);
+	}
+}
+
 };
 
Index: /branches/midi_out/libs/hydrogen/src/IO/PortMidiDriver.h
===================================================================
--- /branches/midi_out/libs/hydrogen/src/IO/PortMidiDriver.h	(revision 733)
+++ /branches/midi_out/libs/hydrogen/src/IO/PortMidiDriver.h	(revision 774)
@@ -27,4 +27,5 @@
 
 #include <hydrogen/IO/MidiInput.h>
+#include <hydrogen/IO/MidiOutput.h>
 #include <portmidi.h>
 
@@ -36,4 +37,5 @@
 public:
 	PmStream *m_pMidiIn;
+	PmStream *m_pMidiOut;
 	bool m_bRunning;
 
@@ -45,6 +47,6 @@
 	virtual std::vector<QString> getOutputPortList();
 	
-	virtual void handleQueueNote(Note* pNote) {}
-	virtual void handleQueueAllNoteOff() {}
+	virtual void handleQueueNote(Note* pNote);
+	virtual void handleQueueAllNoteOff();
 
 private:
