119 |
|
|
120 |
|
|
121 |
EGv2Unit::EGv2Unit(SfzSignalUnitRack* rack) |
EGv2Unit::EGv2Unit(SfzSignalUnitRack* rack) |
122 |
: EGUnit< ::LinuxSampler::sfz::EG>(rack), |
: EGUnit< ::LinuxSampler::sfz::EG>(rack), suAmpOnCC(rack), suVolOnCC(rack), |
123 |
suAmpOnCC(rack), suVolOnCC(rack), suPitchOnCC(rack), suCutoffOnCC(rack), suResOnCC(rack) |
suPitchOnCC(rack), suCutoffOnCC(rack), suResOnCC(rack), suPanOnCC(rack) |
124 |
{ } |
{ } |
125 |
|
|
126 |
void EGv2Unit::Trigger() { |
void EGv2Unit::Trigger() { |
385 |
} |
} |
386 |
|
|
387 |
|
|
388 |
EndpointUnit::EndpointUnit(SfzSignalUnitRack* rack): EndpointSignalUnit(rack), suXFInCC(rack), suXFOutCC(rack) { |
EndpointUnit::EndpointUnit(SfzSignalUnitRack* rack) |
389 |
|
: EndpointSignalUnit(rack), suXFInCC(rack), suXFOutCC(rack), suPanOnCC(rack), pitchVeltrackRatio(0) |
390 |
|
{ |
391 |
|
|
392 |
} |
} |
393 |
|
|
460 |
|
|
461 |
suXFInCC.SetCrossFadeCCs(pVoice->pRegion->xfin_locc, pVoice->pRegion->xfin_hicc); |
suXFInCC.SetCrossFadeCCs(pVoice->pRegion->xfin_locc, pVoice->pRegion->xfin_hicc); |
462 |
suXFOutCC.SetCrossFadeCCs(pVoice->pRegion->xfout_locc, pVoice->pRegion->xfout_hicc); |
suXFOutCC.SetCrossFadeCCs(pVoice->pRegion->xfout_locc, pVoice->pRegion->xfout_hicc); |
463 |
|
|
464 |
|
suPanOnCC.SetCCs(pVoice->pRegion->pan_oncc); |
465 |
|
|
466 |
|
pitchVeltrackRatio = RTMath::CentsToFreqRatioUnlimited((pVoice->MIDIVelocity / 127.0f) * pVoice->pRegion->pitch_veltrack); |
467 |
} |
} |
468 |
|
|
469 |
bool EndpointUnit::Active() { |
bool EndpointUnit::Active() { |
583 |
p *= RTMath::CentsToFreqRatioUnlimited(lfo->GetLevel() * (lfo->pLfoInfo->pitch + f)); |
p *= RTMath::CentsToFreqRatioUnlimited(lfo->GetLevel() * (lfo->pLfoInfo->pitch + f)); |
584 |
} |
} |
585 |
|
|
586 |
return p; |
return p * pitchVeltrackRatio; |
587 |
} |
} |
588 |
|
|
589 |
float EndpointUnit::GetResonance() { |
float EndpointUnit::GetResonance() { |
609 |
} |
} |
610 |
|
|
611 |
float EndpointUnit::GetPan() { |
float EndpointUnit::GetPan() { |
612 |
float pan = 0; |
float pan = suPanOnCC.Active() ? suPanOnCC.GetLevel() : 0; |
613 |
|
|
614 |
|
for (int i = 0; i < GetRack()->panEGs.size(); i++) { |
615 |
|
EGv2Unit* eg = GetRack()->panEGs[i]; |
616 |
|
if (!eg->Active()) continue; |
617 |
|
|
618 |
|
float f = eg->suPanOnCC.Active() ? eg->suPanOnCC.GetLevel() : 0; |
619 |
|
|
620 |
|
if (eg->pEGInfo->pan_curve >= 0 && eg->pEGInfo->pan_curve < suPanOnCC.GetCurveCount()) { |
621 |
|
uint8_t val = eg->GetLevel() * 127; |
622 |
|
if (val > 127) val = 127; |
623 |
|
pan += eg->pEGInfo->pan * suPanOnCC.GetCurve(eg->pEGInfo->pan_curve)->v[val] + eg->GetLevel() * f; |
624 |
|
} else { |
625 |
|
pan += eg->GetLevel() * (eg->pEGInfo->pan + f); |
626 |
|
} |
627 |
|
} |
628 |
|
|
629 |
for (int i = 0; i < GetRack()->panLFOs.size(); i++) { |
for (int i = 0; i < GetRack()->panLFOs.size(); i++) { |
630 |
LFOv2Unit* lfo = GetRack()->panLFOs[i]; |
LFOv2Unit* lfo = GetRack()->panLFOs[i]; |
643 |
|
|
644 |
SfzSignalUnitRack::SfzSignalUnitRack(Voice* voice) |
SfzSignalUnitRack::SfzSignalUnitRack(Voice* voice) |
645 |
: SignalUnitRack(MaxUnitCount), pVoice(voice), suEndpoint(this), suVolEG(this), suFilEG(this), suPitchEG(this), |
: SignalUnitRack(MaxUnitCount), pVoice(voice), suEndpoint(this), suVolEG(this), suFilEG(this), suPitchEG(this), |
646 |
EGs(maxEgCount), volEGs(maxEgCount), pitchEGs(maxEgCount), filEGs(maxEgCount), resEGs(maxEgCount), suVolOnCC(this), |
EGs(maxEgCount), volEGs(maxEgCount), pitchEGs(maxEgCount), filEGs(maxEgCount), resEGs(maxEgCount), panEGs(maxEgCount), suVolOnCC(this), |
647 |
suAmpLFO(this), suPitchLFO(this), suFilLFO(this), |
suAmpLFO(this), suPitchLFO(this), suFilLFO(this), |
648 |
LFOs(maxLfoCount), volLFOs(maxLfoCount), pitchLFOs(maxLfoCount), |
LFOs(maxLfoCount), volLFOs(maxLfoCount), pitchLFOs(maxLfoCount), |
649 |
filLFOs(maxLfoCount), resLFOs(maxLfoCount), panLFOs(maxLfoCount) |
filLFOs(maxLfoCount), resLFOs(maxLfoCount), panLFOs(maxLfoCount) |
650 |
{ |
{ |
651 |
suEndpoint.pVoice = suEndpoint.suXFInCC.pVoice = suEndpoint.suXFOutCC.pVoice = voice; |
suEndpoint.pVoice = suEndpoint.suXFInCC.pVoice = suEndpoint.suXFOutCC.pVoice = suEndpoint.suPanOnCC.pVoice = voice; |
652 |
suVolEG.pVoice = suFilEG.pVoice = suPitchEG.pVoice = voice; |
suVolEG.pVoice = suFilEG.pVoice = suPitchEG.pVoice = voice; |
653 |
suAmpLFO.pVoice = suPitchLFO.pVoice = suFilLFO.pVoice = suVolOnCC.pVoice = voice; |
suAmpLFO.pVoice = suPitchLFO.pVoice = suFilLFO.pVoice = suVolOnCC.pVoice = voice; |
654 |
suPitchLFO.suDepthOnCC.pVoice = suPitchLFO.suFadeEG.pVoice = suPitchLFO.suFreqOnCC.pVoice = voice; |
suPitchLFO.suDepthOnCC.pVoice = suPitchLFO.suFadeEG.pVoice = suPitchLFO.suFreqOnCC.pVoice = voice; |
663 |
EGs[i]->suPitchOnCC.pVoice = voice; |
EGs[i]->suPitchOnCC.pVoice = voice; |
664 |
EGs[i]->suCutoffOnCC.pVoice = voice; |
EGs[i]->suCutoffOnCC.pVoice = voice; |
665 |
EGs[i]->suResOnCC.pVoice = voice; |
EGs[i]->suResOnCC.pVoice = voice; |
666 |
|
EGs[i]->suPanOnCC.pVoice = voice; |
667 |
} |
} |
668 |
|
|
669 |
for (int i = 0; i < LFOs.capacity(); i++) { |
for (int i = 0; i < LFOs.capacity(); i++) { |
695 |
pitchEGs.clear(); |
pitchEGs.clear(); |
696 |
filEGs.clear(); |
filEGs.clear(); |
697 |
resEGs.clear(); |
resEGs.clear(); |
698 |
|
panEGs.clear(); |
699 |
|
|
700 |
LFOs.clear(); |
LFOs.clear(); |
701 |
volLFOs.clear(); |
volLFOs.clear(); |
720 |
EGs[EGs.size() - 1]->suPitchOnCC.SetCCs(pRegion->eg[i].pitch_oncc); |
EGs[EGs.size() - 1]->suPitchOnCC.SetCCs(pRegion->eg[i].pitch_oncc); |
721 |
EGs[EGs.size() - 1]->suCutoffOnCC.SetCCs(pRegion->eg[i].cutoff_oncc); |
EGs[EGs.size() - 1]->suCutoffOnCC.SetCCs(pRegion->eg[i].cutoff_oncc); |
722 |
EGs[EGs.size() - 1]->suResOnCC.SetCCs(pRegion->eg[i].resonance_oncc); |
EGs[EGs.size() - 1]->suResOnCC.SetCCs(pRegion->eg[i].resonance_oncc); |
723 |
|
EGs[EGs.size() - 1]->suPanOnCC.SetCCs(pRegion->eg[i].pan_oncc); |
724 |
} else { std::cerr << "Maximum number of EGs reached!" << std::endl; break; } |
} else { std::cerr << "Maximum number of EGs reached!" << std::endl; break; } |
725 |
|
|
726 |
if ( pRegion->eg[i].amplitude > 0 || !pRegion->eg[i].amplitude_oncc.empty() || |
if ( pRegion->eg[i].amplitude > 0 || !pRegion->eg[i].amplitude_oncc.empty() || |
744 |
if(pitchEGs.size() < pitchEGs.capacity()) pitchEGs.add(EGs[EGs.size() - 1]); |
if(pitchEGs.size() < pitchEGs.capacity()) pitchEGs.add(EGs[EGs.size() - 1]); |
745 |
else std::cerr << "Maximum number of EGs reached!" << std::endl; |
else std::cerr << "Maximum number of EGs reached!" << std::endl; |
746 |
} |
} |
747 |
|
|
748 |
|
if (pRegion->eg[i].pan != 0 || !pRegion->eg[i].pan_oncc.empty()) { |
749 |
|
if(panEGs.size() < panEGs.capacity()) panEGs.add(EGs[EGs.size() - 1]); |
750 |
|
else std::cerr << "Maximum number of EGs reached!" << std::endl; |
751 |
|
} |
752 |
} |
} |
753 |
|
|
754 |
if (pRegion->ampeg_sustain == -1) { |
if (pRegion->ampeg_sustain == -1) { |
837 |
Units.add(&(EGs[i]->suPitchOnCC)); |
Units.add(&(EGs[i]->suPitchOnCC)); |
838 |
Units.add(&(EGs[i]->suCutoffOnCC)); |
Units.add(&(EGs[i]->suCutoffOnCC)); |
839 |
Units.add(&(EGs[i]->suResOnCC)); |
Units.add(&(EGs[i]->suResOnCC)); |
840 |
|
Units.add(&(EGs[i]->suPanOnCC)); |
841 |
} |
} |
842 |
|
|
843 |
for (int i = 0; i < LFOs.size(); i++) { |
for (int i = 0; i < LFOs.size(); i++) { |
854 |
Units.add(&suEndpoint); |
Units.add(&suEndpoint); |
855 |
Units.add(&suEndpoint.suXFInCC); |
Units.add(&suEndpoint.suXFInCC); |
856 |
Units.add(&suEndpoint.suXFOutCC); |
Units.add(&suEndpoint.suXFOutCC); |
857 |
|
Units.add(&suEndpoint.suPanOnCC); |
858 |
|
|
859 |
SignalUnitRack::Trigger(); |
SignalUnitRack::Trigger(); |
860 |
} |
} |