535 |
*/ |
*/ |
536 |
void AbstractVoice::processTransitionEvents(RTList<Event>::Iterator& itEvent, uint End) { |
void AbstractVoice::processTransitionEvents(RTList<Event>::Iterator& itEvent, uint End) { |
537 |
for (; itEvent && itEvent->FragmentPos() <= End; ++itEvent) { |
for (; itEvent && itEvent->FragmentPos() <= End; ++itEvent) { |
538 |
if (Type != Voice::type_release_trigger) { |
// some voice types ignore note off |
539 |
|
if (!(Type & (Voice::type_one_shot | Voice::type_release_trigger | Voice::type_controller_triggered))) { |
540 |
if (itEvent->Type == Event::type_release) { |
if (itEvent->Type == Event::type_release) { |
541 |
EnterReleaseStage(); |
EnterReleaseStage(); |
542 |
} else if (itEvent->Type == Event::type_cancel_release) { |
} else if (itEvent->Type == Event::type_cancel_release) { |
616 |
volume *= GetSampleAttenuation() * pEngineChannel->GlobalVolume * GLOBAL_VOLUME; |
volume *= GetSampleAttenuation() * pEngineChannel->GlobalVolume * GLOBAL_VOLUME; |
617 |
|
|
618 |
// the volume of release triggered samples depends on note length |
// the volume of release triggered samples depends on note length |
619 |
if (Type == Voice::type_release_trigger) { |
if (Type & Voice::type_release_trigger) { |
620 |
float noteLength = float(GetEngine()->FrameTime + Delay - |
float noteLength = float(GetEngine()->FrameTime + Delay - |
621 |
GetNoteOnTime(MIDIKey) ) / GetEngine()->SampleRate; |
GetNoteOnTime(MIDIKey) ) / GetEngine()->SampleRate; |
622 |
|
|