183 |
// calculate influence of EG1 controller on EG1's parameters |
// calculate influence of EG1 controller on EG1's parameters |
184 |
EGInfo egInfo = CalculateEG1ControllerInfluence(eg1controllervalue); |
EGInfo egInfo = CalculateEG1ControllerInfluence(eg1controllervalue); |
185 |
|
|
186 |
EG1.trigger ( |
TriggerEG1(egInfo, velrelease, velocityAttenuation, GetEngine()->SampleRate, itNoteOnEvent->Param.Note.Velocity); |
|
uint(RgnInfo.EG1PreAttack), |
|
|
RgnInfo.EG1Attack * egInfo.Attack, |
|
|
RgnInfo.EG1Hold, |
|
|
RgnInfo.EG1Decay1 * egInfo.Decay * velrelease, |
|
|
RgnInfo.EG1Decay2 * egInfo.Decay * velrelease, |
|
|
RgnInfo.EG1InfiniteSustain, |
|
|
uint(RgnInfo.EG1Sustain), |
|
|
RgnInfo.EG1Release * egInfo.Release * velrelease, |
|
|
velocityAttenuation, |
|
|
GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE |
|
|
); |
|
187 |
} |
} |
188 |
|
|
189 |
#ifdef CONFIG_INTERPOLATE_VOLUME |
#ifdef CONFIG_INTERPOLATE_VOLUME |
196 |
else |
else |
197 |
#else |
#else |
198 |
{ |
{ |
199 |
float finalVolume = pEngineChannel->MidiVolume * crossfadeVolume * EG1.getLevel(); |
float finalVolume = pEngineChannel->MidiVolume * crossfadeVolume * pEG1->getLevel(); |
200 |
|
|
201 |
finalSynthesisParameters.fFinalVolumeLeft = finalVolume * VolumeLeft * pEngineChannel->GlobalPanLeft; |
finalSynthesisParameters.fFinalVolumeLeft = finalVolume * VolumeLeft * pEngineChannel->GlobalPanLeft; |
202 |
finalSynthesisParameters.fFinalVolumeRight = finalVolume * VolumeRight * pEngineChannel->GlobalPanRight; |
finalSynthesisParameters.fFinalVolumeRight = finalVolume * VolumeRight * pEngineChannel->GlobalPanRight; |
336 |
// drivers that use Samples < MaxSamplesPerCycle). |
// drivers that use Samples < MaxSamplesPerCycle). |
337 |
// End the EG1 here, at pos 0, with a shorter max fade |
// End the EG1 here, at pos 0, with a shorter max fade |
338 |
// out time. |
// out time. |
339 |
EG1.enterFadeOutStage(Samples / CONFIG_DEFAULT_SUBFRAGMENT_SIZE); |
pEG1->enterFadeOutStage(Samples / CONFIG_DEFAULT_SUBFRAGMENT_SIZE); |
340 |
itKillEvent = Pool<Event>::Iterator(); |
itKillEvent = Pool<Event>::Iterator(); |
341 |
} else { |
} else { |
342 |
killPos = RTMath::Min(itKillEvent->FragmentPos(), maxFadeOutPos); |
killPos = RTMath::Min(itKillEvent->FragmentPos(), maxFadeOutPos); |
368 |
if ((itKillEvent && killPos <= iSubFragmentEnd) || |
if ((itKillEvent && killPos <= iSubFragmentEnd) || |
369 |
(SYNTHESIS_MODE_GET_FILTER(SynthesisMode) && |
(SYNTHESIS_MODE_GET_FILTER(SynthesisMode) && |
370 |
EG2.getSegmentType() == gig::EGADSR::segment_end)) { |
EG2.getSegmentType() == gig::EGADSR::segment_end)) { |
371 |
EG1.enterFadeOutStage(); |
pEG1->enterFadeOutStage(); |
372 |
itKillEvent = Pool<Event>::Iterator(); |
itKillEvent = Pool<Event>::Iterator(); |
373 |
} |
} |
374 |
|
|
375 |
// process envelope generators |
// process envelope generators |
376 |
switch (EG1.getSegmentType()) { |
switch (pEG1->getSegmentType()) { |
377 |
case gig::EGADSR::segment_lin: |
case EG::segment_lin: |
378 |
fFinalVolume *= EG1.processLin(); |
fFinalVolume *= pEG1->processLin(); |
379 |
break; |
break; |
380 |
case gig::EGADSR::segment_exp: |
case EG::segment_exp: |
381 |
fFinalVolume *= EG1.processExp(); |
fFinalVolume *= pEG1->processExp(); |
382 |
break; |
break; |
383 |
case gig::EGADSR::segment_end: |
case EG::segment_end: |
384 |
fFinalVolume *= EG1.getLevel(); |
fFinalVolume *= pEG1->getLevel(); |
385 |
break; // noop |
break; // noop |
386 |
|
case EG::segment_pow: |
387 |
|
fFinalVolume *= pEG1->processPow(); |
388 |
|
break; |
389 |
} |
} |
390 |
switch (EG2.getSegmentType()) { |
switch (EG2.getSegmentType()) { |
391 |
case gig::EGADSR::segment_lin: |
case gig::EGADSR::segment_lin: |
440 |
RunSynthesisFunction(SynthesisMode, &finalSynthesisParameters, &loop); |
RunSynthesisFunction(SynthesisMode, &finalSynthesisParameters, &loop); |
441 |
|
|
442 |
// stop the rendering if volume EG is finished |
// stop the rendering if volume EG is finished |
443 |
if (EG1.getSegmentType() == gig::EGADSR::segment_end) break; |
if (pEG1->getSegmentType() == EG::segment_end) break; |
444 |
|
|
445 |
const double newPos = Pos + (iSubFragmentEnd - i) * finalSynthesisParameters.fFinalPitch; |
const double newPos = Pos + (iSubFragmentEnd - i) * finalSynthesisParameters.fFinalPitch; |
446 |
|
|
447 |
// increment envelopes' positions |
// increment envelopes' positions |
448 |
if (EG1.active()) { |
if (pEG1->active()) { |
449 |
|
|
450 |
// if sample has a loop and loop start has been reached in this subfragment, send a special event to EG1 to let it finish the attack hold stage |
// if sample has a loop and loop start has been reached in this subfragment, send a special event to EG1 to let it finish the attack hold stage |
451 |
if (SmplInfo.HasLoops && Pos <= SmplInfo.LoopStart && SmplInfo.LoopStart < newPos) { |
if (SmplInfo.HasLoops && Pos <= SmplInfo.LoopStart && SmplInfo.LoopStart < newPos) { |
452 |
EG1.update(gig::EGADSR::event_hold_end, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE); |
pEG1->update(EG::event_hold_end, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE); |
453 |
} |
} |
454 |
|
|
455 |
EG1.increment(1); |
pEG1->increment(1); |
456 |
if (!EG1.toStageEndLeft()) EG1.update(gig::EGADSR::event_stage_end, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE); |
if (!pEG1->toStageEndLeft()) pEG1->update(EG::event_stage_end, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE); |
457 |
} |
} |
458 |
if (EG2.active()) { |
if (EG2.active()) { |
459 |
EG2.increment(1); |
EG2.increment(1); |
530 |
void AbstractVoice::processTransitionEvents(RTList<Event>::Iterator& itEvent, uint End) { |
void AbstractVoice::processTransitionEvents(RTList<Event>::Iterator& itEvent, uint End) { |
531 |
for (; itEvent && itEvent->FragmentPos() <= End; ++itEvent) { |
for (; itEvent && itEvent->FragmentPos() <= End; ++itEvent) { |
532 |
if (itEvent->Type == Event::type_release) { |
if (itEvent->Type == Event::type_release) { |
533 |
EG1.update(gig::EGADSR::event_release, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE); |
pEG1->update(EG::event_release, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE); |
534 |
EG2.update(gig::EGADSR::event_release, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE); |
EG2.update(gig::EGADSR::event_release, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE); |
535 |
} else if (itEvent->Type == Event::type_cancel_release) { |
} else if (itEvent->Type == Event::type_cancel_release) { |
536 |
EG1.update(gig::EGADSR::event_cancel_release, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE); |
pEG1->update(EG::event_cancel_release, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE); |
537 |
EG2.update(gig::EGADSR::event_cancel_release, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE); |
EG2.update(gig::EGADSR::event_cancel_release, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE); |
538 |
} |
} |
539 |
} |
} |