1922 |
if (bShouldRelease) { |
if (bShouldRelease) { |
1923 |
itNoteOffEventOnKeyList->Type = Event::type_release_key; // transform event type |
itNoteOffEventOnKeyList->Type = Event::type_release_key; // transform event type |
1924 |
// spawn release triggered voice(s) if needed |
// spawn release triggered voice(s) if needed |
1925 |
ProcessReleaseTrigger(pChannel, itNoteOffEventOnKeyList, pKey); |
if (pKey->ReleaseTrigger & release_trigger_noteoff) |
1926 |
|
ProcessReleaseTrigger(pChannel, itNoteOffEventOnKeyList, pKey); |
1927 |
} |
} |
1928 |
} else if (itNoteOffEventOnKeyList->Type == Event::type_stop_note) { |
} else if (itNoteOffEventOnKeyList->Type == Event::type_stop_note) { |
1929 |
// This programmatically caused event is caused by a call to |
// This programmatically caused event is caused by a call to |
1954 |
* @param pEngineChannel - engine channel on which this event occurred on |
* @param pEngineChannel - engine channel on which this event occurred on |
1955 |
* @param itEvent - release trigger event (contains note number) |
* @param itEvent - release trigger event (contains note number) |
1956 |
*/ |
*/ |
1957 |
virtual void ProcessReleaseTrigger(EngineChannel* pEngineChannel, RTList<Event>::Iterator& itEvent) OVERRIDE { |
virtual void ProcessReleaseTriggerBySustain(EngineChannel* pEngineChannel, RTList<Event>::Iterator& itEvent) OVERRIDE { |
1958 |
EngineChannelBase<V, R, I>* pChannel = static_cast<EngineChannelBase<V, R, I>*>(pEngineChannel); |
EngineChannelBase<V, R, I>* pChannel = static_cast<EngineChannelBase<V, R, I>*>(pEngineChannel); |
1959 |
|
|
1960 |
const int iKey = itEvent->Param.Note.Key; |
const int iKey = itEvent->Param.Note.Key; |
1982 |
// allocate and trigger new release voice(s) |
// allocate and trigger new release voice(s) |
1983 |
TriggerReleaseVoices(pChannel, itEvent); |
TriggerReleaseVoices(pChannel, itEvent); |
1984 |
} |
} |
1985 |
pKey->ReleaseTrigger = false; |
pKey->ReleaseTrigger = release_trigger_none; |
1986 |
} |
} |
1987 |
} |
} |
1988 |
|
|
2258 |
// already done in LaunchNewNote() |
// already done in LaunchNewNote() |
2259 |
pChannel->markKeyAsActive(pKey); |
pChannel->markKeyAsActive(pKey); |
2260 |
|
|
2261 |
if (itNewVoice->Type & Voice::type_release_trigger_required) pKey->ReleaseTrigger = true; // mark key for the need of release triggered voice(s) |
if (itNewVoice->Type & Voice::type_release_trigger_required) |
2262 |
|
pKey->ReleaseTrigger |= itNewVoice->GetReleaseTriggerFlags(); // mark key for the need of release triggered voice(s) |
2263 |
return 0; // success |
return 0; // success |
2264 |
} |
} |
2265 |
} |
} |