36 |
|
|
37 |
void EGv1Unit::Trigger() { |
void EGv1Unit::Trigger() { |
38 |
::sfz::Region* const pRegion = pVoice->pRegion; |
::sfz::Region* const pRegion = pVoice->pRegion; |
39 |
|
|
40 |
// the length of the decay and release curves are dependent on the velocity |
// the length of the decay and release curves are dependent on the velocity |
41 |
const double velrelease = 1 / pVoice->GetVelocityRelease(pVoice->MIDIVelocity); |
const double velrelease = 1 / pVoice->GetVelocityRelease(pVoice->MIDIVelocity); |
42 |
|
|
43 |
|
// set the delay trigger |
44 |
|
uiDelayTrigger = (pRegion->ampeg_delay + pRegion->ampeg_vel2delay * velrelease) * GetSampleRate(); |
45 |
|
|
46 |
EG.trigger(uint(pRegion->ampeg_start * 10), |
EG.trigger(uint(pRegion->ampeg_start * 10), |
47 |
std::max(0.0, pRegion->ampeg_attack + pRegion->ampeg_vel2attack * velrelease), |
std::max(0.0, pRegion->ampeg_attack + pRegion->ampeg_vel2attack * velrelease), |
48 |
std::max(0.0, pRegion->ampeg_hold + pRegion->ampeg_vel2hold * velrelease), |
std::max(0.0, pRegion->ampeg_hold + pRegion->ampeg_vel2hold * velrelease), |
52 |
GetSampleRate()); |
GetSampleRate()); |
53 |
} |
} |
54 |
|
|
55 |
|
|
56 |
void EGv2Unit::Trigger() { |
void EGv2Unit::Trigger() { |
57 |
EG.trigger(*pEGInfo, GetSampleRate(), pVoice->MIDIVelocity); |
EG.trigger(*pEGInfo, GetSampleRate(), pVoice->MIDIVelocity); |
58 |
} |
} |
59 |
|
|
60 |
|
|
61 |
|
void PitchEGUnit::Trigger() { |
62 |
|
::sfz::Region* const pRegion = pVoice->pRegion; |
63 |
|
depth = pRegion->pitcheg_depth; |
64 |
|
|
65 |
|
// the length of the decay and release curves are dependent on the velocity |
66 |
|
const double velrelease = 1 / pVoice->GetVelocityRelease(pVoice->MIDIVelocity); |
67 |
|
|
68 |
|
// set the delay trigger |
69 |
|
uiDelayTrigger = (pRegion->pitcheg_delay + pRegion->pitcheg_vel2delay * velrelease) * GetSampleRate(); |
70 |
|
|
71 |
|
EG.trigger(uint(pRegion->pitcheg_start * 10), |
72 |
|
std::max(0.0, pRegion->pitcheg_attack + pRegion->pitcheg_vel2attack * velrelease), |
73 |
|
std::max(0.0, pRegion->pitcheg_hold + pRegion->pitcheg_vel2hold * velrelease), |
74 |
|
std::max(0.0, pRegion->pitcheg_decay + pRegion->pitcheg_vel2decay * velrelease), |
75 |
|
uint(std::min(std::max(0.0, 10 * (pRegion->pitcheg_sustain + pRegion->pitcheg_vel2sustain * velrelease)), 1000.0)), |
76 |
|
std::max(0.0, pRegion->pitcheg_release + pRegion->pitcheg_vel2release * velrelease), |
77 |
|
GetSampleRate()); |
78 |
|
} |
79 |
|
|
80 |
|
|
81 |
void LFOUnit::Increment() { |
void LFOUnit::Increment() { |
82 |
if (DelayStage()) return; |
if (DelayStage()) return; |
91 |
Level = 0; |
Level = 0; |
92 |
|
|
93 |
// set the delay trigger |
// set the delay trigger |
94 |
uiDelayTrigger = pLfoInfo->delay * GetSampleRate(); |
uiDelayTrigger = pLfoInfo->delay * GetSampleRate(); |
95 |
} |
} |
96 |
|
|
97 |
void LFOv2Unit::Trigger() { |
void LFOv2Unit::Trigger() { |
156 |
} |
} |
157 |
|
|
158 |
float EndpointUnit::GetPitch() { |
float EndpointUnit::GetPitch() { |
159 |
return 1; |
EGv1Unit* u = &(GetRack()->suPitchEG); |
160 |
|
double pitchEg = u->Active() ? RTMath::CentsToFreqRatioUnlimited(u->GetLevel() * u->depth) : 1; |
161 |
|
return pitchEg; |
162 |
} |
} |
163 |
|
|
164 |
float EndpointUnit::GetResonance() { |
float EndpointUnit::GetResonance() { |
192 |
|
|
193 |
|
|
194 |
SfzSignalUnitRack::SfzSignalUnitRack(Voice* voice) |
SfzSignalUnitRack::SfzSignalUnitRack(Voice* voice) |
195 |
: SignalUnitRack(MaxUnitCount), pVoice(voice), suEndpoint(this), suVolEG(this), |
: SignalUnitRack(MaxUnitCount), pVoice(voice), suEndpoint(this), suVolEG(this), suPitchEG(this), |
196 |
EGs(maxEgCount), volEGs(maxEgCount), pitchEGs(maxEgCount), |
EGs(maxEgCount), volEGs(maxEgCount), pitchEGs(maxEgCount), |
197 |
LFOs(maxLfoCount), filLFOs(maxLfoCount), resLFOs(maxLfoCount), panLFOs(maxLfoCount) |
LFOs(maxLfoCount), filLFOs(maxLfoCount), resLFOs(maxLfoCount), panLFOs(maxLfoCount) |
198 |
{ |
{ |
199 |
suEndpoint.pVoice = suVolEG.pVoice = voice; |
suEndpoint.pVoice = suVolEG.pVoice = suPitchEG.pVoice = voice; |
200 |
|
|
201 |
for (int i = 0; i < EGs.capacity(); i++) { |
for (int i = 0; i < EGs.capacity(); i++) { |
202 |
EGs[i] = new EGv2Unit(this); |
EGs[i] = new EGv2Unit(this); |
280 |
Units.clear(); |
Units.clear(); |
281 |
|
|
282 |
Units.add(&suVolEG); |
Units.add(&suVolEG); |
283 |
|
Units.add(&suPitchEG); |
284 |
|
|
285 |
for (int i = 0; i < EGs.size(); i++) { |
for (int i = 0; i < EGs.size(); i++) { |
286 |
Units.add(EGs[i]); |
Units.add(EGs[i]); |