InstrumentTrack: work with transposed MIDI event and key in processOutEvent()

In processOutEvent() initialize and use a MidiEvent object with transposed
key as well as the key variable.
This commit is contained in:
Tobias Doerffel
2014-01-26 00:35:36 +01:00
parent b6e4860fdb
commit d2aab11130

View File

@@ -356,38 +356,39 @@ void InstrumentTrack::processInEvent( const MidiEvent& event, const MidiTime& ti
void InstrumentTrack::processOutEvent( const MidiEvent& event, const MidiTime& time )
{
int k;
const MidiEvent transposedEvent = applyMasterKey( event );
const int key = transposedEvent.key();
switch( event.type() )
{
case MidiNoteOn:
m_piano.setKeyState( event.key(), true );
k = masterKey( event.key() );
if( k >= 0 && k < NumKeys )
m_piano.setKeyState( event.key(), true ); // event.key() = original key
if( key >= 0 && key < NumKeys )
{
if( m_runningMidiNotes[k] > 0 )
if( m_runningMidiNotes[key] > 0 )
{
m_instrument->handleMidiEvent( MidiEvent( MidiNoteOff, midiPort()->realOutputChannel(), k, 0 ), time );
m_instrument->handleMidiEvent( MidiEvent( MidiNoteOff, midiPort()->realOutputChannel(), key, 0 ), time );
}
++m_runningMidiNotes[k];
m_instrument->handleMidiEvent( MidiEvent( MidiNoteOn, midiPort()->realOutputChannel(), k, event.velocity() ), time );
++m_runningMidiNotes[key];
m_instrument->handleMidiEvent( MidiEvent( MidiNoteOn, midiPort()->realOutputChannel(), key, event.velocity() ), time );
emit newNote();
}
break;
case MidiNoteOff:
m_piano.setKeyState( event.key(), false );
k = masterKey( event.key() );
if( k >= 0 && k < NumKeys && --m_runningMidiNotes[k] <= 0 )
m_piano.setKeyState( event.key(), false ); // event.key() = original key
if( key >= 0 && key < NumKeys && --m_runningMidiNotes[key] <= 0 )
{
m_runningMidiNotes[k] = qMax( 0, m_runningMidiNotes[k] );
m_instrument->handleMidiEvent( MidiEvent( MidiNoteOff, midiPort()->realOutputChannel(), k, 0 ), time );
m_runningMidiNotes[key] = qMax( 0, m_runningMidiNotes[key] );
m_instrument->handleMidiEvent( MidiEvent( MidiNoteOff, midiPort()->realOutputChannel(), key, 0 ), time );
}
break;
default:
m_instrument->handleMidiEvent( applyMasterKey( event ), time );
m_instrument->handleMidiEvent( transposedEvent, time );
break;
}