44 |
} |
} |
45 |
|
|
46 |
|
|
47 |
|
EGv2Unit::EGv2Unit(SfzSignalUnitRack* rack) |
48 |
|
: EGUnit< ::LinuxSampler::sfz::EG>(rack), |
49 |
|
suAmpOnCC(rack), suVolOnCC(rack), suPitchOnCC(rack), suCutoffOnCC(rack), suResOnCC(rack) |
50 |
|
{ } |
51 |
|
|
52 |
void EGv2Unit::Trigger() { |
void EGv2Unit::Trigger() { |
53 |
egInfo = *pEGInfo; |
egInfo = *pEGInfo; |
54 |
for (int i = 0; i < egInfo.node.size(); i++) { |
for (int i = 0; i < egInfo.node.size(); i++) { |
340 |
for (int i = 0; i < GetRack()->volEGs.size(); i++) { |
for (int i = 0; i < GetRack()->volEGs.size(); i++) { |
341 |
EGv2Unit* eg = GetRack()->volEGs[i]; |
EGv2Unit* eg = GetRack()->volEGs[i]; |
342 |
if (!eg->Active()) continue; |
if (!eg->Active()) continue; |
|
vol += eg->GetLevel() * (eg->pEGInfo->amplitude / 100.0f); |
|
343 |
|
|
344 |
|
float dB = eg->suVolOnCC.Active() ? eg->suVolOnCC.GetLevel() : -200; |
345 |
|
if (dB < -144) dB = eg->pEGInfo->volume; |
346 |
|
else if (eg->pEGInfo->volume >= -144) dB += eg->pEGInfo->volume; |
347 |
|
|
348 |
|
float amp = eg->suAmpOnCC.Active() ? eg->suAmpOnCC.GetLevel() : 0; |
349 |
|
amp = (amp + eg->pEGInfo->amplitude) / 100.0f; |
350 |
|
|
351 |
|
if (dB >= -144) { |
352 |
|
if (amp == 0 && eg->suAmpOnCC.GetCCCount() == 0) amp = 1.0f; |
353 |
|
amp *= ::sf2::ToRatio(dB * 10.0); |
354 |
|
} |
355 |
|
|
356 |
|
vol += amp * eg->GetLevel(); |
357 |
} |
} |
358 |
|
|
359 |
AmpLFOUnit* u = &(GetRack()->suAmpLFO); |
AmpLFOUnit* u = &(GetRack()->suAmpLFO); |
385 |
FilEGUnit* u2 = &(GetRack()->suFilEG); |
FilEGUnit* u2 = &(GetRack()->suFilEG); |
386 |
val *= u2->Active() ? RTMath::CentsToFreqRatioUnlimited(u2->GetLevel() * u2->depth) : 1; |
val *= u2->Active() ? RTMath::CentsToFreqRatioUnlimited(u2->GetLevel() * u2->depth) : 1; |
387 |
|
|
388 |
|
for (int i = 0; i < GetRack()->filEGs.size(); i++) { |
389 |
|
EGv2Unit* eg = GetRack()->filEGs[i]; |
390 |
|
if (!eg->Active()) continue; |
391 |
|
|
392 |
|
float f = eg->suCutoffOnCC.Active() ? eg->suCutoffOnCC.GetLevel() : 0; |
393 |
|
f = eg->GetLevel() * (eg->pEGInfo->cutoff + f); |
394 |
|
val *= RTMath::CentsToFreqRatioUnlimited(f); |
395 |
|
} |
396 |
|
|
397 |
for (int i = 0; i < GetRack()->filLFOs.size(); i++) { |
for (int i = 0; i < GetRack()->filLFOs.size(); i++) { |
398 |
LFOv2Unit* lfo = GetRack()->filLFOs[i]; |
LFOv2Unit* lfo = GetRack()->filLFOs[i]; |
399 |
if (!lfo->Active()) continue; |
if (!lfo->Active()) continue; |
406 |
return val; |
return val; |
407 |
} |
} |
408 |
|
|
409 |
|
float EndpointUnit::CalculateFilterCutoff(float cutoff) { |
410 |
|
cutoff *= GetFilterCutoff(); |
411 |
|
float maxCutoff = 0.49 * pVoice->GetSampleRate(); |
412 |
|
return cutoff > maxCutoff ? maxCutoff : cutoff; |
413 |
|
} |
414 |
|
|
415 |
float EndpointUnit::GetPitch() { |
float EndpointUnit::GetPitch() { |
416 |
double p; |
double p; |
417 |
EGv1Unit* u = &(GetRack()->suPitchEG); |
EGv1Unit* u = &(GetRack()->suPitchEG); |
418 |
p = u->Active() ? RTMath::CentsToFreqRatioUnlimited(u->GetLevel() * u->depth) : 1; |
p = u->Active() ? RTMath::CentsToFreqRatioUnlimited(u->GetLevel() * u->depth) : 1; |
419 |
|
|
420 |
|
for (int i = 0; i < GetRack()->pitchEGs.size(); i++) { |
421 |
|
EGv2Unit* eg = GetRack()->pitchEGs[i]; |
422 |
|
if (!eg->Active()) continue; |
423 |
|
|
424 |
|
float f = eg->suPitchOnCC.Active() ? eg->suPitchOnCC.GetLevel() : 0; |
425 |
|
p *= RTMath::CentsToFreqRatioUnlimited(eg->GetLevel() * (eg->pEGInfo->pitch + f)); |
426 |
|
} |
427 |
|
|
428 |
PitchLFOUnit* u2 = &(GetRack()->suPitchLFO); |
PitchLFOUnit* u2 = &(GetRack()->suPitchLFO); |
429 |
CCSignalUnit* u3 = &(GetRack()->suPitchLFO.suDepthOnCC); |
CCSignalUnit* u3 = &(GetRack()->suPitchLFO.suDepthOnCC); |
430 |
float f = u3->Active() ? u3->GetLevel() : 0; |
float f = u3->Active() ? u3->GetLevel() : 0; |
444 |
float EndpointUnit::GetResonance() { |
float EndpointUnit::GetResonance() { |
445 |
float val = 0; |
float val = 0; |
446 |
|
|
447 |
|
for (int i = 0; i < GetRack()->resEGs.size(); i++) { |
448 |
|
EGv2Unit* eg = GetRack()->resEGs[i]; |
449 |
|
if (!eg->Active()) continue; |
450 |
|
|
451 |
|
float f = eg->suResOnCC.Active() ? eg->suResOnCC.GetLevel() : 0; |
452 |
|
val += eg->GetLevel() * (eg->pEGInfo->resonance + f); |
453 |
|
} |
454 |
|
|
455 |
for (int i = 0; i < GetRack()->resLFOs.size(); i++) { |
for (int i = 0; i < GetRack()->resLFOs.size(); i++) { |
456 |
LFOv2Unit* lfo = GetRack()->resLFOs[i]; |
LFOv2Unit* lfo = GetRack()->resLFOs[i]; |
457 |
if (!lfo->Active()) continue; |
if (!lfo->Active()) continue; |
483 |
|
|
484 |
SfzSignalUnitRack::SfzSignalUnitRack(Voice* voice) |
SfzSignalUnitRack::SfzSignalUnitRack(Voice* voice) |
485 |
: SignalUnitRack(MaxUnitCount), pVoice(voice), suEndpoint(this), suVolEG(this), suFilEG(this), suPitchEG(this), |
: SignalUnitRack(MaxUnitCount), pVoice(voice), suEndpoint(this), suVolEG(this), suFilEG(this), suPitchEG(this), |
486 |
EGs(maxEgCount), volEGs(maxEgCount), pitchEGs(maxEgCount), suVolOnCC(this), |
EGs(maxEgCount), volEGs(maxEgCount), pitchEGs(maxEgCount), filEGs(maxEgCount), resEGs(maxEgCount), suVolOnCC(this), |
487 |
suAmpLFO(this), suPitchLFO(this), suFilLFO(this), |
suAmpLFO(this), suPitchLFO(this), suFilLFO(this), |
488 |
LFOs(maxLfoCount), volLFOs(maxLfoCount), pitchLFOs(maxLfoCount), |
LFOs(maxLfoCount), volLFOs(maxLfoCount), pitchLFOs(maxLfoCount), |
489 |
filLFOs(maxLfoCount), resLFOs(maxLfoCount), panLFOs(maxLfoCount) |
filLFOs(maxLfoCount), resLFOs(maxLfoCount), panLFOs(maxLfoCount) |
497 |
for (int i = 0; i < EGs.capacity(); i++) { |
for (int i = 0; i < EGs.capacity(); i++) { |
498 |
EGs[i] = new EGv2Unit(this); |
EGs[i] = new EGv2Unit(this); |
499 |
EGs[i]->pVoice = voice; |
EGs[i]->pVoice = voice; |
500 |
|
EGs[i]->suAmpOnCC.pVoice = voice; |
501 |
|
EGs[i]->suVolOnCC.pVoice = voice; |
502 |
|
EGs[i]->suPitchOnCC.pVoice = voice; |
503 |
|
EGs[i]->suCutoffOnCC.pVoice = voice; |
504 |
|
EGs[i]->suResOnCC.pVoice = voice; |
505 |
} |
} |
506 |
|
|
507 |
for (int i = 0; i < LFOs.capacity(); i++) { |
for (int i = 0; i < LFOs.capacity(); i++) { |
531 |
EGs.clear(); |
EGs.clear(); |
532 |
volEGs.clear(); |
volEGs.clear(); |
533 |
pitchEGs.clear(); |
pitchEGs.clear(); |
534 |
|
filEGs.clear(); |
535 |
|
resEGs.clear(); |
536 |
|
|
537 |
LFOs.clear(); |
LFOs.clear(); |
538 |
volLFOs.clear(); |
volLFOs.clear(); |
552 |
EGv2Unit eg(this); |
EGv2Unit eg(this); |
553 |
eg.pEGInfo = &(pRegion->eg[i]); |
eg.pEGInfo = &(pRegion->eg[i]); |
554 |
EGs.increment()->Copy(eg); |
EGs.increment()->Copy(eg); |
555 |
|
EGs[EGs.size() - 1]->suAmpOnCC.SetCCs(pRegion->eg[i].amplitude_oncc); |
556 |
|
EGs[EGs.size() - 1]->suVolOnCC.SetCCs(pRegion->eg[i].volume_oncc); |
557 |
|
EGs[EGs.size() - 1]->suPitchOnCC.SetCCs(pRegion->eg[i].pitch_oncc); |
558 |
|
EGs[EGs.size() - 1]->suCutoffOnCC.SetCCs(pRegion->eg[i].cutoff_oncc); |
559 |
|
EGs[EGs.size() - 1]->suResOnCC.SetCCs(pRegion->eg[i].resonance_oncc); |
560 |
} else { std::cerr << "Maximum number of EGs reached!" << std::endl; break; } |
} else { std::cerr << "Maximum number of EGs reached!" << std::endl; break; } |
561 |
|
|
562 |
if (pRegion->eg[i].amplitude > 0) { |
if ( pRegion->eg[i].amplitude > 0 || !pRegion->eg[i].amplitude_oncc.empty() || |
563 |
|
pRegion->eg[i].volume > -145 || !pRegion->eg[i].volume_oncc.empty() |
564 |
|
) { |
565 |
if(volEGs.size() < volEGs.capacity()) volEGs.add(EGs[EGs.size() - 1]); |
if(volEGs.size() < volEGs.capacity()) volEGs.add(EGs[EGs.size() - 1]); |
566 |
else std::cerr << "Maximum number of EGs reached!" << std::endl; |
else std::cerr << "Maximum number of EGs reached!" << std::endl; |
567 |
} |
} |
568 |
|
|
569 |
|
if (pRegion->eg[i].cutoff != 0 || !pRegion->eg[i].cutoff_oncc.empty()) { |
570 |
|
if(filEGs.size() < filEGs.capacity()) filEGs.add(EGs[EGs.size() - 1]); |
571 |
|
else std::cerr << "Maximum number of EGs reached!" << std::endl; |
572 |
|
} |
573 |
|
|
574 |
|
if (pRegion->eg[i].resonance != 0 || !pRegion->eg[i].resonance_oncc.empty()) { |
575 |
|
if(resEGs.size() < resEGs.capacity()) resEGs.add(EGs[EGs.size() - 1]); |
576 |
|
else std::cerr << "Maximum number of EGs reached!" << std::endl; |
577 |
|
} |
578 |
|
|
579 |
|
if (pRegion->eg[i].pitch != 0 || !pRegion->eg[i].pitch_oncc.empty()) { |
580 |
|
if(pitchEGs.size() < pitchEGs.capacity()) pitchEGs.add(EGs[EGs.size() - 1]); |
581 |
|
else std::cerr << "Maximum number of EGs reached!" << std::endl; |
582 |
|
} |
583 |
} |
} |
584 |
|
|
585 |
if (pRegion->ampeg_sustain == -1) { |
if (pRegion->ampeg_sustain == -1) { |
663 |
|
|
664 |
for (int i = 0; i < EGs.size(); i++) { |
for (int i = 0; i < EGs.size(); i++) { |
665 |
Units.add(EGs[i]); |
Units.add(EGs[i]); |
666 |
|
Units.add(&(EGs[i]->suAmpOnCC)); |
667 |
|
Units.add(&(EGs[i]->suVolOnCC)); |
668 |
|
Units.add(&(EGs[i]->suPitchOnCC)); |
669 |
|
Units.add(&(EGs[i]->suCutoffOnCC)); |
670 |
|
Units.add(&(EGs[i]->suResOnCC)); |
671 |
} |
} |
672 |
|
|
673 |
for (int i = 0; i < LFOs.size(); i++) { |
for (int i = 0; i < LFOs.size(); i++) { |