Changeset 774
- Timestamp:
- 02/07/09 18:36:38 (4 years ago)
- Location:
- branches/midi_out/libs/hydrogen/src/IO
- Files:
-
- 2 modified
-
PortMidiDriver.h (modified) (3 diffs)
-
portmidi_driver.cpp (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
branches/midi_out/libs/hydrogen/src/IO/PortMidiDriver.h
r733 r774 27 27 28 28 #include <hydrogen/IO/MidiInput.h> 29 #include <hydrogen/IO/MidiOutput.h> 29 30 #include <portmidi.h> 30 31 … … 36 37 public: 37 38 PmStream *m_pMidiIn; 39 PmStream *m_pMidiOut; 38 40 bool m_bRunning; 39 41 … … 45 47 virtual std::vector<QString> getOutputPortList(); 46 48 47 virtual void handleQueueNote(Note* pNote) {}48 virtual void handleQueueAllNoteOff() {}49 virtual void handleQueueNote(Note* pNote); 50 virtual void handleQueueAllNoteOff(); 49 51 50 52 private: -
branches/midi_out/libs/hydrogen/src/IO/portmidi_driver.cpp
r298 r774 24 24 25 25 #include <hydrogen/Preferences.h> 26 #include <hydrogen/note.h> 27 #include <hydrogen/instrument.h> 28 #include <hydrogen/hydrogen.h> 29 #include <hydrogen/globals.h> 26 30 27 31 #ifdef WIN32 … … 114 118 115 119 PortMidiDriver::PortMidiDriver() 116 : MidiInput( "PortMidiDriver" ) 120 : MidiInput( "PortMidiDriver" ), MidiOutput( "PortMidiDriver" ), Object( "PortMidiDriver" ) 117 121 , m_bRunning( false ) 118 122 { … … 136 140 137 141 int nDeviceId = -1; 142 int nOutDeviceId = -1; 138 143 QString sMidiPortName = Preferences::getInstance()->m_sMidiPortName; 139 144 int nDevices = Pm_CountDevices(); … … 149 154 } 150 155 } 156 157 if ( info->output == TRUE ) { 158 if ( info->name == sMidiPortName.toStdString() ) { 159 nOutDeviceId = i; 160 } 161 } 151 162 } 152 163 153 164 if ( nDeviceId == -1 ) { 154 165 INFOLOG( "Midi input device not found." ); 166 return; 167 } 168 169 if ( nOutDeviceId == -1 ) { 170 INFOLOG( "Midi output device not found." ); 155 171 return; 156 172 } … … 176 192 ERRORLOG( "Error in Pm_OpenInput" ); 177 193 } 194 195 err = Pm_OpenOutput( 196 &m_pMidiOut, 197 nOutDeviceId, 198 NULL, 199 nInputBufferSize, 200 TIME_PROC, 201 NULL, 202 0 203 ); 204 205 if ( err != pmNoError ) { 206 ERRORLOG( "Error in Pm_OpenInput" ); 207 } 178 208 179 209 m_bRunning = true; … … 220 250 } 221 251 252 void PortMidiDriver::handleQueueNote(Note* pNote) 253 { 254 if ( m_pMidiOut == NULL ) { 255 ERRORLOG( "m_pMidiOut = NULL " ); 256 return; 257 } 258 259 int channel = pNote->get_instrument()->get_midi_out_channel(); 260 if (channel < 0) { 261 return; 262 } 263 264 int key = pNote->get_instrument()->get_midi_out_note(); 265 int velocity = pNote->get_velocity() * 127; 266 267 PmEvent event; 268 event.timestamp = 0; 269 270 //Note off 271 event.message = Pm_Message(0x80 | channel, key, velocity); 272 Pm_Write(m_pMidiOut, &event, 1); 273 274 //Note on 275 event.message = Pm_Message(0x90 | channel, key, velocity); 276 Pm_Write(m_pMidiOut, &event, 1); 277 } 278 279 void PortMidiDriver::handleQueueAllNoteOff() 280 { 281 if ( m_pMidiOut == NULL ) { 282 ERRORLOG( "m_pMidiOut = NULL " ); 283 return; 284 } 285 286 InstrumentList *instList = Hydrogen::get_instance()->getSong()->get_instrument_list(); 287 288 unsigned int numInstruments = instList->get_size(); 289 for (int index = 0; index < numInstruments; ++index) { 290 Instrument *curInst = instList->get(index); 291 292 int channel = curInst->get_midi_out_channel(); 293 if (channel < 0) { 294 continue; 295 } 296 int key = curInst->get_midi_out_note(); 297 298 PmEvent event; 299 event.timestamp = 0; 300 301 //Note off 302 event.message = Pm_Message(0x80 | channel, key, 0); 303 Pm_Write(m_pMidiOut, &event, 1); 304 } 305 } 306 222 307 }; 223 308