--- linuxsampler/trunk/src/engines/sfz/SfzSignalUnitRack.h 2011/08/01 19:08:09 2224 +++ linuxsampler/trunk/src/engines/sfz/SfzSignalUnitRack.h 2011/08/10 19:40:39 2235 @@ -53,6 +53,7 @@ } double GetSampleRate(); + float GetInfluence(ArrayList< ::sfz::CC>& cc); }; @@ -60,11 +61,40 @@ public: Voice* pVoice; - CCUnit(SfzSignalUnitRack* rack); + CCUnit(SfzSignalUnitRack* rack, Listener* l = NULL); virtual void Trigger(); void SetCCs(::sfz::Array& pCC); + void SetCCs(ArrayList< ::sfz::CC>& cc); + + virtual void AddSmoothCC(uint8_t Controller, float Influence, short int Curve, float Smooth); + + inline int GetCurveCount(); + inline ::sfz::Curve* GetCurve(int idx); + + double GetSampleRate(); + }; + + class CurveCCUnit: public CCUnit { + public: + CurveCCUnit(SfzSignalUnitRack* rack, Listener* l = NULL): CCUnit(rack, l) { } + + virtual float Normalize(uint8_t val, short int curve = -1) { + if (curve == -1) return val / 127.0f; + return GetCurve(curve)->v[val]; + } + }; + + + + class SmoothCCUnit: public CurveCCUnit { + protected: + Smoother Smoothers[128]; + public: + SmoothCCUnit(SfzSignalUnitRack* rack, Listener* l = NULL): CurveCCUnit(rack, l) { } + + virtual void AddSmoothCC(uint8_t Controller, float Influence, short int Curve, float Smooth); }; @@ -122,12 +152,19 @@ public: int depth; EGv1Unit(SfzSignalUnitRack* rack): EGUnit(rack), depth(0) { } - virtual void Trigger(); }; class EGv2Unit: public EGUnit< ::LinuxSampler::sfz::EG> { + protected: + ::sfz::EG egInfo; public: - EGv2Unit(SfzSignalUnitRack* rack): EGUnit< ::LinuxSampler::sfz::EG>(rack) { } + CCUnit suAmpOnCC; + CCUnit suVolOnCC; + CCUnit suPitchOnCC; + CCUnit suCutoffOnCC; + CCUnit suResOnCC; + + EGv2Unit(SfzSignalUnitRack* rack); virtual void Trigger(); }; @@ -143,11 +180,19 @@ virtual void Trigger(); }; + class AmpEGUnit: public EGv1Unit { + public: + AmpEGUnit(SfzSignalUnitRack* rack): EGv1Unit(rack) { } + virtual void Trigger(); + }; + class AbstractLfo { public: virtual float Render() = 0; virtual void Update(const uint16_t& ExtControlValue) = 0; virtual void Trigger(float Frequency, start_level_t StartLevel, uint16_t InternalDepth, uint16_t ExtControlDepth, bool FlipPhase, unsigned int SampleRate) = 0; + virtual void SetPhase(float phase) = 0; + virtual void SetFrequency(float Frequency, unsigned int SampleRate) = 0; }; template @@ -164,27 +209,50 @@ ) { T::trigger(Frequency, StartLevel, InternalDepth, ExtControlDepth, FlipPhase, SampleRate); } + + virtual void SetPhase(float phase) { T::setPhase(phase); } + + virtual void SetFrequency(float Frequency, unsigned int SampleRate) { + T::setFrequency(Frequency, SampleRate); + } }; - class LFOUnit: public SfzSignalUnit { + class LFOUnit; + + class FadeEGUnit: public EGUnit { public: - ::sfz::LFO* pLfoInfo; + FadeEGUnit(SfzSignalUnitRack* rack): EGUnit(rack) { } + virtual void Trigger() { } + virtual void EnterReleaseStage() { } + virtual void CancelRelease() { } + + friend class LFOUnit; + }; + + class LFOUnit: public SfzSignalUnit, public CCSignalUnit::Listener { + public: + ::sfz::LFO* pLfoInfo; AbstractLfo* pLFO; + FadeEGUnit suFadeEG; + SmoothCCUnit suDepthOnCC; + SmoothCCUnit suFreqOnCC; - LFOUnit(SfzSignalUnitRack* rack): SfzSignalUnit(rack), pLfoInfo(NULL), pLFO(NULL) { } - LFOUnit(const LFOUnit& Unit): SfzSignalUnit(Unit) { Copy(Unit); } + LFOUnit(SfzSignalUnitRack* rack); + LFOUnit(const LFOUnit& Unit); void operator=(const LFOUnit& Unit) { Copy(Unit); } void Copy(const LFOUnit& Unit) { - pLfoInfo = Unit.pLfoInfo; + pLfoInfo = Unit.pLfoInfo; + suFadeEG = Unit.suFadeEG; SfzSignalUnit::Copy(Unit); } - virtual bool Active() { return true; } + virtual bool Active() { return pLfoInfo->freq > 0; } virtual void Trigger(); virtual void Increment(); virtual float GetLevel() { return Level; } + virtual void ValueChanged(CCSignalUnit* pUnit); }; class LFOv1Unit: public LFOUnit { @@ -213,6 +281,12 @@ public: + SmoothCCUnit suVolOnCC; + SmoothCCUnit suPitchOnCC; + SmoothCCUnit suPanOnCC; + SmoothCCUnit suCutoffOnCC; + SmoothCCUnit suResOnCC; + LFOv2Unit(SfzSignalUnitRack* rack); virtual void Trigger(); @@ -227,9 +301,7 @@ class PitchLFOUnit: public LFOv1Unit { public: - CCUnit suDepthCC; - - PitchLFOUnit(SfzSignalUnitRack* rack): LFOv1Unit(rack), suDepthCC(rack) { } + PitchLFOUnit(SfzSignalUnitRack* rack): LFOv1Unit(rack) { } virtual void Trigger(); }; @@ -242,7 +314,6 @@ }; - class EndpointUnit: public EndpointSignalUnit { public: Voice* pVoice; @@ -265,13 +336,15 @@ virtual float CalculateResonance(float res) { return GetResonance() + res; } + + virtual float CalculateFilterCutoff(float cutoff); }; class SfzSignalUnitRack : public SignalUnitRack { private: EndpointUnit suEndpoint; - EGv1Unit suVolEG; + AmpEGUnit suVolEG; FilEGUnit suFilEG; PitchEGUnit suPitchEG; @@ -279,6 +352,10 @@ PitchLFOUnit suPitchLFO; FilLFOUnit suFilLFO; + // SFZ v2 + + SmoothCCUnit suVolOnCC; + FixedArray EGs; // used for optimization - contains only the ones that are modulating volume @@ -287,9 +364,21 @@ // used for optimization - contains only the ones that are modulating pitch FixedArray pitchEGs; + // used for optimization - contains only the ones that are modulating filter cutoff + FixedArray filEGs; + + // used for optimization - contains only the ones that are modulating filter cutoff + FixedArray resEGs; + FixedArray LFOs; + // used for optimization - contains only the ones that are modulating volume + FixedArray volLFOs; + + // used for optimization - contains only the ones that are modulating pitch + FixedArray pitchLFOs; + // used for optimization - contains only the ones that are modulating filter cutoff FixedArray filLFOs;