32 |
pLFO2 = new LFOUnsigned(1.0f); // filter EG (0..1 range) |
pLFO2 = new LFOUnsigned(1.0f); // filter EG (0..1 range) |
33 |
pLFO3 = new LFOSigned(1200.0f); // pitch EG (-1200..+1200 range) |
pLFO3 = new LFOSigned(1200.0f); // pitch EG (-1200..+1200 range) |
34 |
PlaybackState = playback_state_end; |
PlaybackState = playback_state_end; |
|
KeyGroup = 0; |
|
35 |
SynthesisMode = 0; // set all mode bits to 0 first |
SynthesisMode = 0; // set all mode bits to 0 first |
36 |
// select synthesis implementation (asm core is not supported ATM) |
// select synthesis implementation (asm core is not supported ATM) |
37 |
#if 0 // CONFIG_ASM && ARCH_X86 |
#if 0 // CONFIG_ASM && ARCH_X86 |
103 |
Delay = itNoteOnEvent->FragmentPos(); |
Delay = itNoteOnEvent->FragmentPos(); |
104 |
itTriggerEvent = itNoteOnEvent; |
itTriggerEvent = itNoteOnEvent; |
105 |
itKillEvent = Pool<Event>::Iterator(); |
itKillEvent = Pool<Event>::Iterator(); |
106 |
KeyGroup = iKeyGroup; |
|
107 |
|
pGroupEvents = iKeyGroup ? pEngineChannel->ActiveKeyGroups[iKeyGroup] : 0; |
108 |
|
|
109 |
SmplInfo = GetSampleInfo(); |
SmplInfo = GetSampleInfo(); |
110 |
RgnInfo = GetRegionInfo(); |
RgnInfo = GetRegionInfo(); |
314 |
RTList<Event>::Iterator itNoteEvent; |
RTList<Event>::Iterator itNoteEvent; |
315 |
GetFirstEventOnKey(MIDIKey, itNoteEvent); |
GetFirstEventOnKey(MIDIKey, itNoteEvent); |
316 |
|
|
317 |
|
RTList<Event>::Iterator itGroupEvent; |
318 |
|
if (pGroupEvents) itGroupEvent = pGroupEvents->first(); |
319 |
|
|
320 |
if (itTriggerEvent) { // skip events that happened before this voice was triggered |
if (itTriggerEvent) { // skip events that happened before this voice was triggered |
321 |
while (itCCEvent && itCCEvent->FragmentPos() <= Skip) ++itCCEvent; |
while (itCCEvent && itCCEvent->FragmentPos() <= Skip) ++itCCEvent; |
322 |
|
while (itGroupEvent && itGroupEvent->FragmentPos() <= Skip) ++itGroupEvent; |
323 |
|
|
324 |
// we can't simply compare the timestamp here, because note events |
// we can't simply compare the timestamp here, because note events |
325 |
// might happen on the same time stamp, so we have to deal on the |
// might happen on the same time stamp, so we have to deal on the |
326 |
// actual sequence the note events arrived instead (see bug #112) |
// actual sequence the note events arrived instead (see bug #112) |
367 |
|
|
368 |
// process transition events (note on, note off & sustain pedal) |
// process transition events (note on, note off & sustain pedal) |
369 |
processTransitionEvents(itNoteEvent, iSubFragmentEnd); |
processTransitionEvents(itNoteEvent, iSubFragmentEnd); |
370 |
|
processGroupEvents(itGroupEvent, iSubFragmentEnd); |
371 |
|
|
372 |
// if the voice was killed in this subfragment, or if the |
// if the voice was killed in this subfragment, or if the |
373 |
// filter EG is finished, switch EG1 to fade out stage |
// filter EG is finished, switch EG1 to fade out stage |
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 (itEvent->Type == Event::type_release) { |
if (Type != Voice::type_release_trigger) { |
539 |
pEG1->update(EG::event_release, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE); |
|
540 |
EG2.update(gig::EGADSR::event_release, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE); |
if (itEvent->Type == Event::type_release) { |
541 |
} else if (itEvent->Type == Event::type_cancel_release) { |
EnterReleaseStage(); |
542 |
pEG1->update(EG::event_cancel_release, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE); |
} else if (itEvent->Type == Event::type_cancel_release) { |
543 |
EG2.update(gig::EGADSR::event_cancel_release, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE); |
pEG1->update(EG::event_cancel_release, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE); |
544 |
|
EG2.update(gig::EGADSR::event_cancel_release, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE); |
545 |
|
} |
546 |
} |
} |
547 |
} |
} |
548 |
} |
} |
549 |
|
|
550 |
|
/** |
551 |
|
* Process given list of events aimed at all voices in a key group. |
552 |
|
* |
553 |
|
* @param itEvent - iterator pointing to the next event to be processed |
554 |
|
* @param End - youngest time stamp where processing should be stopped |
555 |
|
*/ |
556 |
|
void AbstractVoice::processGroupEvents(RTList<Event>::Iterator& itEvent, uint End) { |
557 |
|
for (; itEvent && itEvent->FragmentPos() <= End; ++itEvent) { |
558 |
|
ProcessGroupEvent(itEvent); |
559 |
|
} |
560 |
|
} |
561 |
|
|
562 |
/** @brief Update current portamento position. |
/** @brief Update current portamento position. |
563 |
* |
* |
564 |
* Will be called when portamento mode is enabled to get the final |
* Will be called when portamento mode is enabled to get the final |
629 |
float AbstractVoice::GetReleaseTriggerAttenuation(float noteLength) { |
float AbstractVoice::GetReleaseTriggerAttenuation(float noteLength) { |
630 |
return 1 - RgnInfo.ReleaseTriggerDecay * noteLength; |
return 1 - RgnInfo.ReleaseTriggerDecay * noteLength; |
631 |
} |
} |
632 |
|
|
633 |
|
void AbstractVoice::EnterReleaseStage() { |
634 |
|
pEG1->update(EG::event_release, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE); |
635 |
|
EG2.update(gig::EGADSR::event_release, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE); |
636 |
|
} |
637 |
|
|
638 |
} // namespace LinuxSampler |
} // namespace LinuxSampler |