694 |
RTList<uint>::Iterator iuiKey = pActiveKeys->first(); |
RTList<uint>::Iterator iuiKey = pActiveKeys->first(); |
695 |
for (; iuiKey; ++iuiKey) { |
for (; iuiKey; ++iuiKey) { |
696 |
MidiKey* pKey = &pMIDIKeyInfo[*iuiKey]; |
MidiKey* pKey = &pMIDIKeyInfo[*iuiKey]; |
697 |
if (!pKey->KeyPressed && |
if (!pKey->KeyPressed && ShouldReleaseVoice(*iuiKey)) { |
|
(pKey->ReleaseTrigger & release_trigger_sustain) && |
|
|
ShouldReleaseVoice(*iuiKey)) |
|
|
{ |
|
698 |
RTList<Event>::Iterator itNewEvent = pKey->pEvents->allocAppend(); |
RTList<Event>::Iterator itNewEvent = pKey->pEvents->allocAppend(); |
699 |
if (itNewEvent) { |
if (itNewEvent) { |
700 |
*itNewEvent = *itEvent; // copy event to the key's own event list |
*itNewEvent = *itEvent; // copy event to the key's own event list |
701 |
itNewEvent->Type = Event::type_release_key; // transform event type |
itNewEvent->Type = Event::type_release_key; // transform event type |
702 |
itNewEvent->Param.Note.Key = *iuiKey; |
itNewEvent->Param.Note.Key = *iuiKey; |
703 |
if (pKey->ReleaseTrigger & release_trigger_sustain_maxvelocity) |
itNewEvent->Param.Note.Velocity = 127; |
|
itNewEvent->Param.Note.Velocity = 127; |
|
|
else // release_trigger_sustain_keyvelocity ... |
|
|
itNewEvent->Param.Note.Velocity = pKey->Velocity; |
|
704 |
|
|
705 |
//HACK: set sustain CC (64) as "pressed down" for a short moment, so that release trigger voices can distinguish between note off and sustain pedal up cases |
// process release trigger (if requested) |
706 |
AbstractEngineChannel* pChannel = (AbstractEngineChannel*) itEvent->pEngineChannel; |
if (pKey->ReleaseTrigger & release_trigger_sustain) { |
707 |
const int8_t CC64Value = pChannel->ControllerTable[64]; |
if (pKey->ReleaseTrigger & release_trigger_sustain_keyvelocity) |
708 |
pChannel->ControllerTable[64] = 127; |
itNewEvent->Param.Note.Velocity = pKey->Velocity; |
709 |
|
|
710 |
// now spawn release trigger voices (if required) |
//HACK: set sustain CC (64) as "pressed down" for a short moment, so that release trigger voices can distinguish between note off and sustain pedal up cases |
711 |
ProcessReleaseTriggerBySustain(itNewEvent); |
AbstractEngineChannel* pChannel = (AbstractEngineChannel*) itEvent->pEngineChannel; |
712 |
|
const int8_t CC64Value = pChannel->ControllerTable[64]; |
713 |
|
pChannel->ControllerTable[64] = 127; |
714 |
|
|
715 |
//HACK: reset sustain pedal CC value to old one (see comment above) |
// now spawn release trigger voices (if required) |
716 |
pChannel->ControllerTable[64] = CC64Value; |
ProcessReleaseTriggerBySustain(itNewEvent); |
717 |
|
|
718 |
|
//HACK: reset sustain pedal CC value to old one (see comment above) |
719 |
|
pChannel->ControllerTable[64] = CC64Value; |
720 |
|
} |
721 |
} |
} |
722 |
else dmsg(1,("Event pool emtpy!\n")); |
else dmsg(1,("Event pool emtpy!\n")); |
723 |
} |
} |