/[svn]/linuxsampler/trunk/src/engines/sfz/SfzSignalUnitRack.cpp
ViewVC logotype

Diff of /linuxsampler/trunk/src/engines/sfz/SfzSignalUnitRack.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2235 by iliev, Wed Aug 10 19:40:39 2011 UTC revision 2236 by iliev, Thu Aug 11 18:25:45 2011 UTC
# Line 43  namespace LinuxSampler { namespace sfz { Line 43  namespace LinuxSampler { namespace sfz {
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),
# Line 311  namespace LinuxSampler { namespace sfz { Line 385  namespace LinuxSampler { namespace sfz {
385       }       }
386    
387    
388      EndpointUnit::EndpointUnit(SfzSignalUnitRack* rack): EndpointSignalUnit(rack) {      EndpointUnit::EndpointUnit(SfzSignalUnitRack* rack): EndpointSignalUnit(rack), suXFInCC(rack), suXFOutCC(rack) {
389                    
390      }      }
391            
# Line 320  namespace LinuxSampler { namespace sfz { Line 394  namespace LinuxSampler { namespace sfz {
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() {
# Line 371  namespace LinuxSampler { namespace sfz { Line 508  namespace LinuxSampler { namespace sfz {
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() {
# Line 488  namespace LinuxSampler { namespace sfz { Line 627  namespace LinuxSampler { namespace sfz {
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;
# Line 682  namespace LinuxSampler { namespace sfz { Line 822  namespace LinuxSampler { namespace sfz {
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      }      }

Legend:
Removed from v.2235  
changed lines
  Added in v.2236

  ViewVC Help
Powered by ViewVC