43 |
return f; |
return f; |
44 |
} |
} |
45 |
|
|
46 |
|
void XFInCCUnit::SetCrossFadeCCs(::sfz::Array<int>& loCCs, ::sfz::Array<int>& hiCCs) { |
47 |
|
RemoveAllCCs(); |
48 |
|
|
49 |
|
for (int cc = 0; cc < 128; cc++) { |
50 |
|
if (loCCs[cc] == 0 && hiCCs[cc] == 0) continue; |
51 |
|
int i = loCCs[cc]; |
52 |
|
int j = hiCCs[cc]; |
53 |
|
if (j == 0) j = 127; |
54 |
|
i += j << 8; // workaround to keep both values in the Influence parameter |
55 |
|
AddCC(cc, i); |
56 |
|
} |
57 |
|
} |
58 |
|
|
59 |
|
void XFInCCUnit::Calculate() { |
60 |
|
float l = 1; |
61 |
|
|
62 |
|
for (int i = 0; i < Ctrls.size(); i++) { |
63 |
|
float c = 1; |
64 |
|
int influence = Ctrls[i].Influence; |
65 |
|
int lo = influence & 0xff; |
66 |
|
int hi = influence >> 8; |
67 |
|
if (Ctrls[i].Value <= lo) { |
68 |
|
c = 0; |
69 |
|
} else if (Ctrls[i].Value >= hi) { |
70 |
|
c = 1; |
71 |
|
} else { |
72 |
|
float xfVelSize = hi - lo; |
73 |
|
float velPos = Ctrls[i].Value - lo; |
74 |
|
c = velPos / xfVelSize; |
75 |
|
if (pVoice->pRegion->xf_cccurve == ::sfz::POWER) { |
76 |
|
c = sin(c * M_PI / 2.0); |
77 |
|
} |
78 |
|
} |
79 |
|
|
80 |
|
l *= c; |
81 |
|
} |
82 |
|
|
83 |
|
if (Level != l) { |
84 |
|
Level = l; |
85 |
|
if (pListener != NULL) pListener->ValueChanged(this); |
86 |
|
} |
87 |
|
} |
88 |
|
|
89 |
|
|
90 |
|
void XFOutCCUnit::Calculate() { |
91 |
|
float l = 1; |
92 |
|
|
93 |
|
for (int i = 0; i < Ctrls.size(); i++) { |
94 |
|
float c = 1; |
95 |
|
int influence = Ctrls[i].Influence; |
96 |
|
int lo = influence & 0xff; |
97 |
|
int hi = influence >> 8; |
98 |
|
if (Ctrls[i].Value >= hi) { |
99 |
|
c = 0; |
100 |
|
} else if (Ctrls[i].Value <= lo) { |
101 |
|
c = 1; |
102 |
|
} else { |
103 |
|
float xfVelSize = hi - lo; |
104 |
|
float velPos = Ctrls[i].Value - lo; |
105 |
|
c = 1.0f - velPos / xfVelSize; |
106 |
|
if (pVoice->pRegion->xf_cccurve == ::sfz::POWER) { |
107 |
|
c = sin(c * M_PI / 2.0); |
108 |
|
} |
109 |
|
} |
110 |
|
|
111 |
|
l *= c; |
112 |
|
} |
113 |
|
|
114 |
|
if (Level != l) { |
115 |
|
Level = l; |
116 |
|
if (pListener != NULL) pListener->ValueChanged(this); |
117 |
|
} |
118 |
|
} |
119 |
|
|
120 |
|
|
121 |
EGv2Unit::EGv2Unit(SfzSignalUnitRack* rack) |
EGv2Unit::EGv2Unit(SfzSignalUnitRack* rack) |
122 |
: EGUnit< ::LinuxSampler::sfz::EG>(rack), |
: EGUnit< ::LinuxSampler::sfz::EG>(rack), |
385 |
} |
} |
386 |
|
|
387 |
|
|
388 |
EndpointUnit::EndpointUnit(SfzSignalUnitRack* rack): EndpointSignalUnit(rack) { |
EndpointUnit::EndpointUnit(SfzSignalUnitRack* rack): EndpointSignalUnit(rack), suXFInCC(rack), suXFOutCC(rack) { |
389 |
|
|
390 |
} |
} |
391 |
|
|
394 |
} |
} |
395 |
|
|
396 |
void EndpointUnit::Trigger() { |
void EndpointUnit::Trigger() { |
397 |
|
float xfInVelCoeff = 1; |
398 |
|
|
399 |
|
if (pVoice->MIDIVelocity <= pVoice->pRegion->xfin_lovel) { |
400 |
|
xfInVelCoeff = 0; |
401 |
|
} else if (pVoice->MIDIVelocity >= pVoice->pRegion->xfin_hivel) { |
402 |
|
xfInVelCoeff = 1; |
403 |
|
} else { |
404 |
|
float xfVelSize = pVoice->pRegion->xfin_hivel - pVoice->pRegion->xfin_lovel; |
405 |
|
float velPos = pVoice->MIDIVelocity - pVoice->pRegion->xfin_lovel; |
406 |
|
xfInVelCoeff = velPos / xfVelSize; |
407 |
|
if (pVoice->pRegion->xf_velcurve == ::sfz::POWER) { |
408 |
|
xfInVelCoeff = sin(xfInVelCoeff * M_PI / 2.0); |
409 |
|
} |
410 |
|
} |
411 |
|
|
412 |
|
float xfOutVelCoeff = 1; |
413 |
|
|
414 |
|
if (pVoice->MIDIVelocity >= pVoice->pRegion->xfout_hivel) { |
415 |
|
if (pVoice->pRegion->xfout_lovel < 127 /* is set */) xfOutVelCoeff = 0; |
416 |
|
} else if (pVoice->MIDIVelocity <= pVoice->pRegion->xfout_lovel) { |
417 |
|
xfOutVelCoeff = 1; |
418 |
|
} else { |
419 |
|
float xfVelSize = pVoice->pRegion->xfout_hivel - pVoice->pRegion->xfout_lovel; |
420 |
|
float velPos = pVoice->MIDIVelocity - pVoice->pRegion->xfout_lovel; |
421 |
|
xfOutVelCoeff = 1.0f - velPos / xfVelSize; |
422 |
|
if (pVoice->pRegion->xf_velcurve == ::sfz::POWER) { |
423 |
|
xfOutVelCoeff = sin(xfOutVelCoeff * M_PI / 2.0); |
424 |
|
} |
425 |
|
} |
426 |
|
|
427 |
|
float xfInKeyCoeff = 1; |
428 |
|
|
429 |
|
if (pVoice->MIDIKey <= pVoice->pRegion->xfin_lokey) { |
430 |
|
if (pVoice->pRegion->xfin_hikey > 0 /* is set */) xfInKeyCoeff = 0; |
431 |
|
} else if (pVoice->MIDIKey >= pVoice->pRegion->xfin_hikey) { |
432 |
|
xfInKeyCoeff = 1; |
433 |
|
} else { |
434 |
|
float xfKeySize = pVoice->pRegion->xfin_hikey - pVoice->pRegion->xfin_lokey; |
435 |
|
float keyPos = pVoice->MIDIKey - pVoice->pRegion->xfin_lokey; |
436 |
|
xfInKeyCoeff = keyPos / xfKeySize; |
437 |
|
if (pVoice->pRegion->xf_keycurve == ::sfz::POWER) { |
438 |
|
xfInKeyCoeff = sin(xfInKeyCoeff * M_PI / 2.0); |
439 |
|
} |
440 |
|
} |
441 |
|
|
442 |
|
float xfOutKeyCoeff = 1; |
443 |
|
|
444 |
|
if (pVoice->MIDIKey >= pVoice->pRegion->xfout_hikey) { |
445 |
|
if (pVoice->pRegion->xfout_lokey < 127 /* is set */) xfOutKeyCoeff = 0; |
446 |
|
} else if (pVoice->MIDIKey <= pVoice->pRegion->xfout_lokey) { |
447 |
|
xfOutKeyCoeff = 1; |
448 |
|
} else { |
449 |
|
float xfKeySize = pVoice->pRegion->xfout_hikey - pVoice->pRegion->xfout_lokey; |
450 |
|
float keyPos = pVoice->MIDIKey - pVoice->pRegion->xfout_lokey; |
451 |
|
xfOutKeyCoeff = 1.0f - keyPos / xfKeySize; |
452 |
|
if (pVoice->pRegion->xf_keycurve == ::sfz::POWER) { |
453 |
|
xfOutKeyCoeff = sin(xfOutKeyCoeff * M_PI / 2.0); |
454 |
|
} |
455 |
|
} |
456 |
|
|
457 |
|
xfCoeff = xfInVelCoeff * xfOutVelCoeff * xfInKeyCoeff * xfOutKeyCoeff; |
458 |
|
|
459 |
|
suXFInCC.SetCrossFadeCCs(pVoice->pRegion->xfin_locc, pVoice->pRegion->xfin_hicc); |
460 |
|
suXFOutCC.SetCrossFadeCCs(pVoice->pRegion->xfout_locc, pVoice->pRegion->xfout_hicc); |
461 |
} |
} |
462 |
|
|
463 |
bool EndpointUnit::Active() { |
bool EndpointUnit::Active() { |
508 |
vol *= ::sf2::ToRatio(lfo->GetLevel() * (lfo->pLfoInfo->volume + f) * 10.0); |
vol *= ::sf2::ToRatio(lfo->GetLevel() * (lfo->pLfoInfo->volume + f) * 10.0); |
509 |
} |
} |
510 |
|
|
511 |
return vol; |
if (suXFInCC.Active()) vol *= suXFInCC.GetLevel(); |
512 |
|
if (suXFOutCC.Active()) vol *= suXFOutCC.GetLevel(); |
513 |
|
return vol * xfCoeff; |
514 |
} |
} |
515 |
|
|
516 |
float EndpointUnit::GetFilterCutoff() { |
float EndpointUnit::GetFilterCutoff() { |
627 |
LFOs(maxLfoCount), volLFOs(maxLfoCount), pitchLFOs(maxLfoCount), |
LFOs(maxLfoCount), volLFOs(maxLfoCount), pitchLFOs(maxLfoCount), |
628 |
filLFOs(maxLfoCount), resLFOs(maxLfoCount), panLFOs(maxLfoCount) |
filLFOs(maxLfoCount), resLFOs(maxLfoCount), panLFOs(maxLfoCount) |
629 |
{ |
{ |
630 |
suEndpoint.pVoice = suVolEG.pVoice = suFilEG.pVoice = suPitchEG.pVoice = voice; |
suEndpoint.pVoice = suEndpoint.suXFInCC.pVoice = suEndpoint.suXFOutCC.pVoice = voice; |
631 |
|
suVolEG.pVoice = suFilEG.pVoice = suPitchEG.pVoice = voice; |
632 |
suAmpLFO.pVoice = suPitchLFO.pVoice = suFilLFO.pVoice = suVolOnCC.pVoice = voice; |
suAmpLFO.pVoice = suPitchLFO.pVoice = suFilLFO.pVoice = suVolOnCC.pVoice = voice; |
633 |
suPitchLFO.suDepthOnCC.pVoice = suPitchLFO.suFadeEG.pVoice = suPitchLFO.suFreqOnCC.pVoice = voice; |
suPitchLFO.suDepthOnCC.pVoice = suPitchLFO.suFadeEG.pVoice = suPitchLFO.suFreqOnCC.pVoice = voice; |
634 |
suFilLFO.suFadeEG.pVoice = suFilLFO.suDepthOnCC.pVoice = suFilLFO.suFreqOnCC.pVoice = voice; |
suFilLFO.suFadeEG.pVoice = suFilLFO.suDepthOnCC.pVoice = suFilLFO.suFreqOnCC.pVoice = voice; |
822 |
} |
} |
823 |
|
|
824 |
Units.add(&suEndpoint); |
Units.add(&suEndpoint); |
825 |
|
Units.add(&suEndpoint.suXFInCC); |
826 |
|
Units.add(&suEndpoint.suXFOutCC); |
827 |
|
|
828 |
SignalUnitRack::Trigger(); |
SignalUnitRack::Trigger(); |
829 |
} |
} |