| 382 | |
| 383 | |
| 384 | void InstrumentTrack::processOutEvent( const MidiEvent& event, const MidiTime& time, f_cnt_t offset ) |
| 385 | { |
| 386 | // do nothing if we do not have an instrument instance (e.g. when loading settings) |
| 387 | if( m_instrument == NULL ) |
| 388 | { |
| 389 | return; |
| 390 | } |
| 391 | |
| 392 | const MidiEvent transposedEvent = applyMasterKey( event ); |
| 393 | const int key = transposedEvent.key(); |
| 394 | |
| 395 | switch( event.type() ) |
| 396 | { |
| 397 | case MidiNoteOn: |
| 398 | m_midiNotesMutex.lock(); |
| 399 | m_piano.setKeyState( event.key(), true ); // event.key() = original key |
| 400 | |
| 401 | if( key >= 0 && key < NumKeys ) |
| 402 | { |
| 403 | if( m_runningMidiNotes[key] > 0 ) |
| 404 | { |
| 405 | m_instrument->handleMidiEvent( MidiEvent( MidiNoteOff, midiPort()->realOutputChannel(), key, 0 ), time, offset ); |
| 406 | } |
| 407 | ++m_runningMidiNotes[key]; |
| 408 | m_instrument->handleMidiEvent( MidiEvent( MidiNoteOn, midiPort()->realOutputChannel(), key, event.velocity() ), time, offset ); |
| 409 | |
| 410 | } |
| 411 | m_midiNotesMutex.unlock(); |
| 412 | emit newNote(); |
| 413 | break; |
| 414 | |
| 415 | case MidiNoteOff: |
| 416 | m_midiNotesMutex.lock(); |
| 417 | m_piano.setKeyState( event.key(), false ); // event.key() = original key |
| 418 | |
| 419 | if( key >= 0 && key < NumKeys && --m_runningMidiNotes[key] <= 0 ) |
| 420 | { |
| 421 | m_instrument->handleMidiEvent( MidiEvent( MidiNoteOff, midiPort()->realOutputChannel(), key, 0 ), time, offset ); |
| 422 | } |
| 423 | m_midiNotesMutex.unlock(); |
| 424 | break; |
| 425 | |
| 426 | default: |
| 427 | m_instrument->handleMidiEvent( transposedEvent, time, offset ); |
| 428 | break; |
| 429 | } |
| 430 | |
| 431 | // if appropriate, midi-port does futher routing |
| 432 | m_midiPort.processOutEvent( event, time ); |
| 433 | } |
| 434 | |
| 435 | |
| 436 |
nothing calls this directly
no test coverage detected