32 |
#include "../common/SineLFO.h" |
#include "../common/SineLFO.h" |
33 |
|
|
34 |
namespace LinuxSampler { namespace sfz { |
namespace LinuxSampler { namespace sfz { |
35 |
const int MaxUnitCount = 1000; |
const int MaxUnitCount = 200; |
36 |
const int maxEgCount = 100; // Maximum number of v2 envelope generators |
const int maxEgCount = 30; // Maximum number of v2 envelope generators |
37 |
const int maxLfoCount = 100; // Maximum number of v2 LFOs |
const int maxLfoCount = 30; // Maximum number of v2 LFOs |
38 |
|
|
39 |
class Voice; |
class Voice; |
40 |
class SfzSignalUnitRack; |
class SfzSignalUnitRack; |
90 |
|
|
91 |
class SmoothCCUnit: public CurveCCUnit { |
class SmoothCCUnit: public CurveCCUnit { |
92 |
protected: |
protected: |
93 |
Smoother Smoothers[128]; |
FixedArray<Smoother> Smoothers; |
94 |
public: |
public: |
95 |
SmoothCCUnit(SfzSignalUnitRack* rack, Listener* l = NULL): CurveCCUnit(rack, l) { } |
SmoothCCUnit(SfzSignalUnitRack* rack, Listener* l = NULL): CurveCCUnit(rack, l), Smoothers(MaxCCs) { } |
96 |
|
|
97 |
virtual void AddSmoothCC(uint8_t Controller, float Influence, short int Curve, float Smooth); |
virtual void AddSmoothCC(uint8_t Controller, float Influence, short int Curve, float Smooth); |
98 |
|
|
99 |
|
virtual void RemoveAllCCs() { CurveCCUnit::RemoveAllCCs(); Smoothers.clear(); } |
100 |
|
}; |
101 |
|
|
102 |
|
|
103 |
|
class XFInCCUnit: public CCUnit { |
104 |
|
public: |
105 |
|
XFInCCUnit(SfzSignalUnitRack* rack, Listener* l = NULL): CCUnit(rack, l) { } |
106 |
|
|
107 |
|
virtual bool Active() { return Ctrls.size() > 0; } |
108 |
|
virtual void Calculate(); |
109 |
|
virtual void SetCrossFadeCCs(::sfz::Array<int>& loCCs, ::sfz::Array<int>& hiCCs); |
110 |
|
}; |
111 |
|
|
112 |
|
|
113 |
|
class XFOutCCUnit: public XFInCCUnit { |
114 |
|
public: |
115 |
|
XFOutCCUnit(SfzSignalUnitRack* rack, Listener* l = NULL): XFInCCUnit(rack, l) { } |
116 |
|
|
117 |
|
virtual void Calculate(); |
118 |
}; |
}; |
119 |
|
|
120 |
|
|
178 |
protected: |
protected: |
179 |
::sfz::EG egInfo; |
::sfz::EG egInfo; |
180 |
public: |
public: |
181 |
EGv2Unit(SfzSignalUnitRack* rack): EGUnit< ::LinuxSampler::sfz::EG>(rack) { } |
CCUnit suAmpOnCC; |
182 |
|
CCUnit suVolOnCC; |
183 |
|
CCUnit suPitchOnCC; |
184 |
|
CCUnit suCutoffOnCC; |
185 |
|
CCUnit suResOnCC; |
186 |
|
CurveCCUnit suPanOnCC; |
187 |
|
|
188 |
|
EGv2Unit(SfzSignalUnitRack* rack); |
189 |
virtual void Trigger(); |
virtual void Trigger(); |
190 |
}; |
}; |
191 |
|
|
255 |
::sfz::LFO* pLfoInfo; |
::sfz::LFO* pLfoInfo; |
256 |
AbstractLfo* pLFO; |
AbstractLfo* pLFO; |
257 |
FadeEGUnit suFadeEG; |
FadeEGUnit suFadeEG; |
258 |
CCUnit suFreqOnCC; |
SmoothCCUnit suDepthOnCC; |
259 |
|
SmoothCCUnit suFreqOnCC; |
260 |
|
|
261 |
LFOUnit(SfzSignalUnitRack* rack); |
LFOUnit(SfzSignalUnitRack* rack); |
262 |
LFOUnit(const LFOUnit& Unit); |
LFOUnit(const LFOUnit& Unit); |
302 |
|
|
303 |
|
|
304 |
public: |
public: |
305 |
CCUnit suPitchOnCC; |
SmoothCCUnit suVolOnCC; |
306 |
|
SmoothCCUnit suPitchOnCC; |
307 |
|
SmoothCCUnit suPanOnCC; |
308 |
|
SmoothCCUnit suCutoffOnCC; |
309 |
|
SmoothCCUnit suResOnCC; |
310 |
|
|
311 |
LFOv2Unit(SfzSignalUnitRack* rack); |
LFOv2Unit(SfzSignalUnitRack* rack); |
312 |
|
|
322 |
|
|
323 |
class PitchLFOUnit: public LFOv1Unit { |
class PitchLFOUnit: public LFOv1Unit { |
324 |
public: |
public: |
325 |
CCUnit suDepthCC; |
PitchLFOUnit(SfzSignalUnitRack* rack): LFOv1Unit(rack) { } |
|
|
|
|
PitchLFOUnit(SfzSignalUnitRack* rack): LFOv1Unit(rack), suDepthCC(rack) { } |
|
326 |
|
|
327 |
virtual void Trigger(); |
virtual void Trigger(); |
328 |
}; |
}; |
336 |
|
|
337 |
|
|
338 |
class EndpointUnit: public EndpointSignalUnit { |
class EndpointUnit: public EndpointSignalUnit { |
339 |
|
private: |
340 |
|
float xfCoeff; // crossfade coefficient |
341 |
|
float pitchVeltrackRatio; |
342 |
|
|
343 |
public: |
public: |
344 |
Voice* pVoice; |
Voice* pVoice; |
345 |
|
XFInCCUnit suXFInCC; |
346 |
|
XFOutCCUnit suXFOutCC; |
347 |
|
SmoothCCUnit suPanOnCC; |
348 |
|
|
349 |
EndpointUnit(SfzSignalUnitRack* rack); |
EndpointUnit(SfzSignalUnitRack* rack); |
350 |
|
|
364 |
virtual float CalculateResonance(float res) { |
virtual float CalculateResonance(float res) { |
365 |
return GetResonance() + res; |
return GetResonance() + res; |
366 |
} |
} |
367 |
|
|
368 |
|
virtual float CalculateFilterCutoff(float cutoff); |
369 |
}; |
}; |
370 |
|
|
371 |
|
|
392 |
// used for optimization - contains only the ones that are modulating pitch |
// used for optimization - contains only the ones that are modulating pitch |
393 |
FixedArray<EGv2Unit*> pitchEGs; |
FixedArray<EGv2Unit*> pitchEGs; |
394 |
|
|
395 |
|
// used for optimization - contains only the ones that are modulating filter cutoff |
396 |
|
FixedArray<EGv2Unit*> filEGs; |
397 |
|
|
398 |
|
// used for optimization - contains only the ones that are modulating resonance |
399 |
|
FixedArray<EGv2Unit*> resEGs; |
400 |
|
|
401 |
|
// used for optimization - contains only the ones that are modulating pitch |
402 |
|
FixedArray<EGv2Unit*> panEGs; |
403 |
|
|
404 |
|
|
405 |
FixedArray<LFOv2Unit*> LFOs; |
FixedArray<LFOv2Unit*> LFOs; |
406 |
|
|
407 |
|
// used for optimization - contains only the ones that are modulating volume |
408 |
|
FixedArray<LFOv2Unit*> volLFOs; |
409 |
|
|
410 |
// used for optimization - contains only the ones that are modulating pitch |
// used for optimization - contains only the ones that are modulating pitch |
411 |
FixedArray<LFOv2Unit*> pitchLFOs; |
FixedArray<LFOv2Unit*> pitchLFOs; |
412 |
|
|