/[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 2225 by iliev, Tue Aug 2 13:44:57 2011 UTC revision 2236 by iliev, Thu Aug 11 18:25:45 2011 UTC
# Line 34  namespace LinuxSampler { namespace sfz { Line 34  namespace LinuxSampler { namespace sfz {
34          return pVoice->GetSampleRate() / CONFIG_DEFAULT_SUBFRAGMENT_SIZE;          return pVoice->GetSampleRate() / CONFIG_DEFAULT_SUBFRAGMENT_SIZE;
35      }      }
36            
37        float SfzSignalUnit::GetInfluence(ArrayList< ::sfz::CC>& cc) {
38            float f = 0;
39            for (int i = 0; i < cc.size(); i++) {
40                int val = pVoice->GetControllerValue(cc[i].Controller);
41                f += (val / 127.0f) * cc[i].Influence;
42            }
43            return f;
44        }
45            
46      void EGv1Unit::Trigger() {      void XFInCCUnit::SetCrossFadeCCs(::sfz::Array<int>& loCCs, ::sfz::Array<int>& hiCCs) {
47          ::sfz::Region* const pRegion = pVoice->pRegion;          RemoveAllCCs();
48                    
49          // the length of the decay and release curves are dependent on the velocity          for (int cc = 0; cc < 128; cc++) {
50          const double velrelease = 1 / pVoice->GetVelocityRelease(pVoice->MIDIVelocity);              if (loCCs[cc] == 0 && hiCCs[cc] == 0) continue;
51                int i = loCCs[cc];
52          // set the delay trigger              int j = hiCCs[cc];
53          uiDelayTrigger = (pRegion->ampeg_delay + pRegion->ampeg_vel2delay * velrelease) * GetSampleRate();              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          EG.trigger(uint(pRegion->ampeg_start * 10),          if (Level != l) {
84                     std::max(0.0, pRegion->ampeg_attack + pRegion->ampeg_vel2attack * velrelease),              Level = l;
85                     std::max(0.0, pRegion->ampeg_hold + pRegion->ampeg_vel2hold * velrelease),              if (pListener != NULL) pListener->ValueChanged(this);
86                     std::max(0.0, pRegion->ampeg_decay + pRegion->ampeg_vel2decay * velrelease),          }
                    uint(std::min(std::max(0.0, 10 * (pRegion->ampeg_sustain + pRegion->ampeg_vel2sustain * velrelease)), 1000.0)),  
                    std::max(0.0, pRegion->ampeg_release + pRegion->ampeg_vel2release * velrelease),  
                    GetSampleRate());  
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)
122            : EGUnit< ::LinuxSampler::sfz::EG>(rack),
123              suAmpOnCC(rack), suVolOnCC(rack), suPitchOnCC(rack), suCutoffOnCC(rack), suResOnCC(rack)
124        { }
125        
126      void EGv2Unit::Trigger() {      void EGv2Unit::Trigger() {
127          EG.trigger(*pEGInfo, GetSampleRate(), pVoice->MIDIVelocity);          egInfo = *pEGInfo;
128            for (int i = 0; i < egInfo.node.size(); i++) {
129                float f = GetInfluence(egInfo.node[i].level_oncc);
130                egInfo.node[i].level = std::min(egInfo.node[i].level + f, 1.0f);
131                
132                f = GetInfluence(egInfo.node[i].time_oncc);
133                egInfo.node[i].time = std::min(egInfo.node[i].time + f, 100.0f);
134            }
135            EG.trigger(egInfo, GetSampleRate(), pVoice->MIDIVelocity);
136      }      }
137            
138            
# Line 98  namespace LinuxSampler { namespace sfz { Line 175  namespace LinuxSampler { namespace sfz {
175                     GetSampleRate());                     GetSampleRate());
176      }      }
177            
178        
179        void AmpEGUnit::Trigger() {
180            ::sfz::Region* const pRegion = pVoice->pRegion;
181            
182            // the length of the decay and release curves are dependent on the velocity
183            const double velrelease = 1 / pVoice->GetVelocityRelease(pVoice->MIDIVelocity);
184    
185            // set the delay trigger
186            float delay = pRegion->ampeg_delay + pRegion->ampeg_vel2delay * velrelease;
187            delay += GetInfluence(pRegion->ampeg_delaycc);
188            uiDelayTrigger = std::max(0.0f, delay) * GetSampleRate();
189            
190            float start = (pRegion->ampeg_start + GetInfluence(pRegion->ampeg_startcc)) * 10;
191            
192            float attack = pRegion->ampeg_attack + pRegion->ampeg_vel2attack * velrelease;
193            attack = std::max(0.0f, attack + GetInfluence(pRegion->ampeg_attackcc));
194            
195            float hold = pRegion->ampeg_hold + pRegion->ampeg_vel2hold * velrelease;
196            hold = std::max(0.0f, hold + GetInfluence(pRegion->ampeg_holdcc));
197            
198            float decay = pRegion->ampeg_decay + pRegion->ampeg_vel2decay * velrelease;
199            decay = std::max(0.0f, decay + GetInfluence(pRegion->ampeg_decaycc));
200            
201            float sustain = pRegion->ampeg_sustain + pRegion->ampeg_vel2sustain * velrelease;
202            sustain = 10 * (sustain + GetInfluence(pRegion->ampeg_sustaincc));
203            
204            float release = pRegion->ampeg_release + pRegion->ampeg_vel2release * velrelease;
205            release = std::max(0.0f, release + GetInfluence(pRegion->ampeg_releasecc));
206            
207            EG.trigger (
208                uint(std::min(std::max(0.0f, start), 1000.0f)), attack, hold, decay,
209                uint(std::min(std::max(0.0f, sustain), 1000.0f)), release, GetSampleRate()
210            );
211        }
212        
213        
214        LFOUnit::LFOUnit(SfzSignalUnitRack* rack)
215            : SfzSignalUnit(rack), pLfoInfo(NULL), pLFO(NULL),
216              suFadeEG(rack), suFreqOnCC(rack, this), suDepthOnCC(rack)
217        { }
218        
219        LFOUnit::LFOUnit(const LFOUnit& Unit)
220            : SfzSignalUnit(Unit), suFadeEG(static_cast<SfzSignalUnitRack*>(Unit.pRack)),
221              suFreqOnCC(static_cast<SfzSignalUnitRack*>(Unit.pRack), this),
222              suDepthOnCC(static_cast<SfzSignalUnitRack*>(Unit.pRack))
223        {
224            Copy(Unit);
225        }
226    
227      void LFOUnit::Increment() {      void LFOUnit::Increment() {
228          if (DelayStage()) return;          if (DelayStage()) return;
# Line 105  namespace LinuxSampler { namespace sfz { Line 230  namespace LinuxSampler { namespace sfz {
230          SignalUnit::Increment();          SignalUnit::Increment();
231                    
232          Level = pLFO->Render();          Level = pLFO->Render();
233            if (suFadeEG.Active()) Level *= suFadeEG.GetLevel();
234      }      }
235            
236      void LFOUnit::Trigger() {      void LFOUnit::Trigger() {
# Line 112  namespace LinuxSampler { namespace sfz { Line 238  namespace LinuxSampler { namespace sfz {
238          Level = 0;          Level = 0;
239                    
240          // set the delay trigger          // set the delay trigger
241          uiDelayTrigger = pLfoInfo->delay * GetSampleRate();          uiDelayTrigger = (pLfoInfo->delay + GetInfluence(pLfoInfo->delay_oncc)) * GetSampleRate();
242            if(pLfoInfo->fade != 0 || !pLfoInfo->fade_oncc.empty()) {
243                float f = pLfoInfo->fade;
244                f += GetInfluence(pLfoInfo->fade_oncc);
245                
246                if (f != 0) {
247                    suFadeEG.uiDelayTrigger = pLfoInfo->delay * GetSampleRate();
248                    suFadeEG.EG.trigger(0, f, 0, 0, 1000, 0, GetSampleRate());
249                }
250            }
251        }
252        
253        void LFOUnit::ValueChanged(CCSignalUnit* pUnit) {
254            pLFO->SetFrequency(std::max(0.0f, suFreqOnCC.GetLevel() + pLfoInfo->freq), GetSampleRate());
255      }      }
256            
257        
258      void LFOv1Unit::Trigger() {      void LFOv1Unit::Trigger() {
259          LFOUnit::Trigger();          LFOUnit::Trigger();
260                    
261          lfo.trigger (          lfo.trigger (
262              pLfoInfo->freq,              pLfoInfo->freq + suFreqOnCC.GetLevel(),
263              start_level_mid,              start_level_mid,
264              1, 0, false, GetSampleRate()              1, 0, false, GetSampleRate()
265          );          );
# Line 130  namespace LinuxSampler { namespace sfz { Line 270  namespace LinuxSampler { namespace sfz {
270      LFOv2Unit::LFOv2Unit(SfzSignalUnitRack* rack)      LFOv2Unit::LFOv2Unit(SfzSignalUnitRack* rack)
271          : LFOUnit(rack), lfos(8), lfo0(1200.0f), lfo1(1200.0f), lfo2(1200.0f),          : LFOUnit(rack), lfos(8), lfo0(1200.0f), lfo1(1200.0f), lfo2(1200.0f),
272            lfo3(1200.0f), lfo4(1200.0f), lfo5(1200.0f), lfo6(1200.0f), lfo7(1200.0f),            lfo3(1200.0f), lfo4(1200.0f), lfo5(1200.0f), lfo6(1200.0f), lfo7(1200.0f),
273            suPitchOnCC(rack)            suVolOnCC(rack), suPitchOnCC(rack), suPanOnCC(rack), suCutoffOnCC(rack), suResOnCC(rack)
274      {      {
275          lfos.add(&lfo0);          lfos.add(&lfo0);
276          lfos.add(&lfo1);          lfos.add(&lfo1);
# Line 149  namespace LinuxSampler { namespace sfz { Line 289  namespace LinuxSampler { namespace sfz {
289          else pLFO = lfos[pLfoInfo->wave];          else pLFO = lfos[pLfoInfo->wave];
290                    
291          pLFO->Trigger (          pLFO->Trigger (
292              pLfoInfo->freq,              pLfoInfo->freq + suFreqOnCC.GetLevel(),
293              start_level_mid,              start_level_mid,
294              1, 0, false, GetSampleRate()              1, 0, false, GetSampleRate()
295          );          );
296          pLFO->Update(0);          pLFO->Update(0);
297                    
298          float phase = pLfoInfo->phase;          float phase = pLfoInfo->phase + GetInfluence(pLfoInfo->phase_oncc);
         for (int i = 0; i < pLfoInfo->phase_oncc.size(); i++) {  
             int val = pVoice->GetControllerValue(pLfoInfo->phase_oncc[i].Controller);  
             phase += (val / 127.0f) * pLfoInfo->phase_oncc[i].Influence;  
         }  
299          if (phase != 0) pLFO->SetPhase(phase);          if (phase != 0) pLFO->SetPhase(phase);
300      }      }
301            
302      void AmpLFOUnit::Trigger() {      void AmpLFOUnit::Trigger() {
303          ::sfz::Region* const pRegion = pVoice->pRegion;          ::sfz::Region* const pRegion = pVoice->pRegion;
304          pLfoInfo->delay = pRegion->amplfo_delay;          pLfoInfo->delay  = pRegion->amplfo_delay;
305          pLfoInfo->freq = pRegion->amplfo_freq;          pLfoInfo->freq   = pRegion->amplfo_freq;
306            pLfoInfo->fade   = pRegion->amplfo_fade;
307          pLfoInfo->volume = pRegion->amplfo_depth;          pLfoInfo->volume = pRegion->amplfo_depth;
308                    
309          LFOv1Unit::Trigger();          LFOv1Unit::Trigger();
# Line 175  namespace LinuxSampler { namespace sfz { Line 312  namespace LinuxSampler { namespace sfz {
312      void PitchLFOUnit::Trigger() {      void PitchLFOUnit::Trigger() {
313          ::sfz::Region* const pRegion = pVoice->pRegion;          ::sfz::Region* const pRegion = pVoice->pRegion;
314          pLfoInfo->delay = pRegion->pitchlfo_delay;          pLfoInfo->delay = pRegion->pitchlfo_delay;
315          pLfoInfo->freq = pRegion->pitchlfo_freq;          pLfoInfo->freq  = pRegion->pitchlfo_freq;
316            pLfoInfo->fade  = pRegion->pitchlfo_fade;
317          pLfoInfo->pitch = pRegion->pitchlfo_depth;          pLfoInfo->pitch = pRegion->pitchlfo_depth;
318                    
319          LFOv1Unit::Trigger();          LFOv1Unit::Trigger();
# Line 183  namespace LinuxSampler { namespace sfz { Line 321  namespace LinuxSampler { namespace sfz {
321            
322      void FilLFOUnit::Trigger() {      void FilLFOUnit::Trigger() {
323          ::sfz::Region* const pRegion = pVoice->pRegion;          ::sfz::Region* const pRegion = pVoice->pRegion;
324          pLfoInfo->delay = pRegion->fillfo_delay;          pLfoInfo->delay  = pRegion->fillfo_delay;
325          pLfoInfo->freq = pRegion->fillfo_freq;          pLfoInfo->freq   = pRegion->fillfo_freq;
326            pLfoInfo->fade   = pRegion->fillfo_fade;
327          pLfoInfo->cutoff = pRegion->fillfo_depth;          pLfoInfo->cutoff = pRegion->fillfo_depth;
328                    
329          LFOv1Unit::Trigger();          LFOv1Unit::Trigger();
330      }      }
331            
332      CCUnit::CCUnit(SfzSignalUnitRack* rack): CCSignalUnit(rack) { }      CCUnit::CCUnit(SfzSignalUnitRack* rack, Listener* l): CCSignalUnit(rack, l) {
333            pVoice = NULL;
334        }
335            
336      void CCUnit::Trigger() {      void CCUnit::Trigger() {
337          for (int i = 0; i < Ctrls.size(); i++) {          for (int i = 0; i < Ctrls.size(); i++) {
338              Ctrls[i].Value = pVoice->GetControllerValue(Ctrls[i].Controller);              Ctrls[i].Value = pVoice->GetControllerValue(Ctrls[i].Controller);
339                if (Ctrls[i].pSmoother != NULL) Ctrls[i].pSmoother->setValue(Ctrls[i].Value);
340          }          }
341          CCSignalUnit::Trigger();          CCSignalUnit::Trigger();
342      }      }
# Line 209  namespace LinuxSampler { namespace sfz { Line 351  namespace LinuxSampler { namespace sfz {
351       void CCUnit::SetCCs(ArrayList< ::sfz::CC>& cc) {       void CCUnit::SetCCs(ArrayList< ::sfz::CC>& cc) {
352           RemoveAllCCs();           RemoveAllCCs();
353           for (int i = 0; i < cc.size(); i++) {           for (int i = 0; i < cc.size(); i++) {
354               if (cc[i].Influence != 0) AddCC(cc[i].Controller, cc[i].Influence);               if (cc[i].Influence != 0) {
355                     short int curve = cc[i].Curve;
356                     if (curve >= GetCurveCount()) curve = -1;
357                     AddSmoothCC(cc[i].Controller, cc[i].Influence, curve, cc[i].Smooth);
358                 }
359             }
360         }
361        
362         void CCUnit::AddSmoothCC(uint8_t Controller, float Influence, short int Curve, float Smooth) {
363             AddCC(Controller, Influence, Curve);
364         }
365        
366         int CCUnit::GetCurveCount() {
367             return pVoice->pRegion->GetInstrument()->curves.size();
368         }
369        
370         ::sfz::Curve* CCUnit::GetCurve(int idx) {
371             return &pVoice->pRegion->GetInstrument()->curves[idx];
372         }
373        
374         double CCUnit::GetSampleRate() {
375            return pVoice->GetSampleRate() / CONFIG_DEFAULT_SUBFRAGMENT_SIZE;
376        }
377        
378         void SmoothCCUnit::AddSmoothCC(uint8_t Controller, float Influence, short int Curve, float Smooth) {
379             if (Smooth > 0) {
380                 Smoothers[Controller].trigger(Smooth / 1000.0f, GetSampleRate());
381                 AddCC(Controller, Influence, Curve, &Smoothers[Controller]);
382             } else {
383                 AddCC(Controller, Influence, Curve);
384           }           }
385       }       }
386    
387    
388      EndpointUnit::EndpointUnit(SfzSignalUnitRack* rack): EndpointSignalUnit(rack) {      EndpointUnit::EndpointUnit(SfzSignalUnitRack* rack): EndpointSignalUnit(rack), suXFInCC(rack), suXFOutCC(rack) {
389                    
390      }      }
391            
# Line 223  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 243  namespace LinuxSampler { namespace sfz { Line 477  namespace LinuxSampler { namespace sfz {
477          for (int i = 0; i < GetRack()->volEGs.size(); i++) {          for (int i = 0; i < GetRack()->volEGs.size(); i++) {
478              EGv2Unit* eg = GetRack()->volEGs[i];              EGv2Unit* eg = GetRack()->volEGs[i];
479              if (!eg->Active()) continue;              if (!eg->Active()) continue;
480              vol += eg->GetLevel() * (eg->pEGInfo->amplitude / 100.0f);              
481                float dB = eg->suVolOnCC.Active() ? eg->suVolOnCC.GetLevel() : -200;
482                if (dB < -144) dB = eg->pEGInfo->volume;
483                else if (eg->pEGInfo->volume >= -144) dB += eg->pEGInfo->volume;
484                
485                float amp = eg->suAmpOnCC.Active() ? eg->suAmpOnCC.GetLevel() : 0;
486                amp = (amp + eg->pEGInfo->amplitude) / 100.0f;
487                
488                if (dB >= -144) {
489                    if (amp == 0 && eg->suAmpOnCC.GetCCCount() == 0) amp = 1.0f;
490                    amp *= ::sf2::ToRatio(dB * 10.0);
491                }
492                
493                vol += amp * eg->GetLevel();
494          }          }
495                    
496          AmpLFOUnit* u = &(GetRack()->suAmpLFO);          AmpLFOUnit* u = &(GetRack()->suAmpLFO);
497          vol *= u->Active() ? ::sf2::ToRatio((u->GetLevel() * u->pLfoInfo->volume) * 10.0) : 1;          CCSignalUnit* u2 = &(GetRack()->suAmpLFO.suDepthOnCC);
498            float f = u2->Active() ? u2->GetLevel() : 0;
499            vol *= u->Active() ? ::sf2::ToRatio((u->GetLevel() * (u->pLfoInfo->volume + f) * 10.0)) : 1;
500                    
501          return vol;          vol *= ::sf2::ToRatio(GetRack()->suVolOnCC.GetLevel() * 10.0);
502            
503            for (int i = 0; i < GetRack()->volLFOs.size(); i++) {
504                LFOv2Unit* lfo = GetRack()->volLFOs[i];
505                if (!lfo->Active()) continue;
506                
507                float f = lfo->suVolOnCC.Active() ? lfo->suVolOnCC.GetLevel() : 0;
508                vol *= ::sf2::ToRatio(lfo->GetLevel() * (lfo->pLfoInfo->volume + f) * 10.0);
509            }
510            
511            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() {
517          float val;          float val;
518                    
519          FilLFOUnit* u = &(GetRack()->suFilLFO);          FilLFOUnit* u = &(GetRack()->suFilLFO);
520          val = u->Active() ? RTMath::CentsToFreqRatioUnlimited(u->GetLevel() * u->pLfoInfo->cutoff) : 1;          CCSignalUnit* u1 = &(GetRack()->suFilLFO.suDepthOnCC);
521            float f = u1->Active() ? u1->GetLevel() : 0;
522            val = u->Active() ? RTMath::CentsToFreqRatioUnlimited(u->GetLevel() * (u->pLfoInfo->cutoff + f)) : 1;
523                    
524          FilEGUnit* u2 = &(GetRack()->suFilEG);          FilEGUnit* u2 = &(GetRack()->suFilEG);
525          val *= u2->Active() ? RTMath::CentsToFreqRatioUnlimited(u2->GetLevel() * u2->depth) : 1;          val *= u2->Active() ? RTMath::CentsToFreqRatioUnlimited(u2->GetLevel() * u2->depth) : 1;
526                    
527            for (int i = 0; i < GetRack()->filEGs.size(); i++) {
528                EGv2Unit* eg = GetRack()->filEGs[i];
529                if (!eg->Active()) continue;
530                
531                float f = eg->suCutoffOnCC.Active() ? eg->suCutoffOnCC.GetLevel() : 0;
532                f = eg->GetLevel() * (eg->pEGInfo->cutoff + f);
533                val *= RTMath::CentsToFreqRatioUnlimited(f);
534            }
535            
536          for (int i = 0; i < GetRack()->filLFOs.size(); i++) {          for (int i = 0; i < GetRack()->filLFOs.size(); i++) {
537              LFOv2Unit* lfo = GetRack()->filLFOs[i];              LFOv2Unit* lfo = GetRack()->filLFOs[i];
538              if (!lfo->Active()) continue;              if (!lfo->Active()) continue;
539                            
540              float f = lfo->GetLevel() * lfo->pLfoInfo->cutoff;              float f = lfo->suCutoffOnCC.Active() ? lfo->suCutoffOnCC.GetLevel() : 0;
541                f = lfo->GetLevel() * (lfo->pLfoInfo->cutoff + f);
542              val *= RTMath::CentsToFreqRatioUnlimited(f);              val *= RTMath::CentsToFreqRatioUnlimited(f);
543          }          }
544                    
545          return val;          return val;
546      }      }
547            
548        float EndpointUnit::CalculateFilterCutoff(float cutoff) {
549             cutoff *= GetFilterCutoff();
550             float maxCutoff = 0.49 * pVoice->GetSampleRate();
551             return cutoff > maxCutoff ? maxCutoff : cutoff;
552        }
553        
554      float EndpointUnit::GetPitch() {      float EndpointUnit::GetPitch() {
555          double p;          double p;
556          EGv1Unit* u = &(GetRack()->suPitchEG);          EGv1Unit* u = &(GetRack()->suPitchEG);
557          p = u->Active() ? RTMath::CentsToFreqRatioUnlimited(u->GetLevel() * u->depth) : 1;          p = u->Active() ? RTMath::CentsToFreqRatioUnlimited(u->GetLevel() * u->depth) : 1;
558                    
559            for (int i = 0; i < GetRack()->pitchEGs.size(); i++) {
560                EGv2Unit* eg = GetRack()->pitchEGs[i];
561                if (!eg->Active()) continue;
562                
563                float f = eg->suPitchOnCC.Active() ? eg->suPitchOnCC.GetLevel() : 0;
564                p *= RTMath::CentsToFreqRatioUnlimited(eg->GetLevel() * (eg->pEGInfo->pitch + f));
565            }
566            
567          PitchLFOUnit* u2 = &(GetRack()->suPitchLFO);          PitchLFOUnit* u2 = &(GetRack()->suPitchLFO);
568          CCSignalUnit* u3 = &(GetRack()->suPitchLFO.suDepthCC);          CCSignalUnit* u3 = &(GetRack()->suPitchLFO.suDepthOnCC);
569          float f = u3->Active() ? u3->GetLevel() : 0;          float f = u3->Active() ? u3->GetLevel() : 0;
570          p *= u2->Active() ? RTMath::CentsToFreqRatioUnlimited(u2->GetLevel() * (u2->pLfoInfo->pitch + f)) : 1;          p *= u2->Active() ? RTMath::CentsToFreqRatioUnlimited(u2->GetLevel() * (u2->pLfoInfo->pitch + f)) : 1;
571                    
# Line 296  namespace LinuxSampler { namespace sfz { Line 583  namespace LinuxSampler { namespace sfz {
583      float EndpointUnit::GetResonance() {      float EndpointUnit::GetResonance() {
584           float val = 0;           float val = 0;
585                    
586            for (int i = 0; i < GetRack()->resEGs.size(); i++) {
587                EGv2Unit* eg = GetRack()->resEGs[i];
588                if (!eg->Active()) continue;
589                
590                float f = eg->suResOnCC.Active() ? eg->suResOnCC.GetLevel() : 0;
591                val += eg->GetLevel() * (eg->pEGInfo->resonance + f);
592            }
593            
594          for (int i = 0; i < GetRack()->resLFOs.size(); i++) {          for (int i = 0; i < GetRack()->resLFOs.size(); i++) {
595              LFOv2Unit* lfo = GetRack()->resLFOs[i];              LFOv2Unit* lfo = GetRack()->resLFOs[i];
596              if (!lfo->Active()) continue;              if (!lfo->Active()) continue;
597                            
598              val += lfo->GetLevel() * lfo->pLfoInfo->resonance;              float f = lfo->suResOnCC.Active() ? lfo->suResOnCC.GetLevel() : 0;
599                val += lfo->GetLevel() * (lfo->pLfoInfo->resonance + f);
600          }          }
601                    
602          return val;          return val;
# Line 313  namespace LinuxSampler { namespace sfz { Line 609  namespace LinuxSampler { namespace sfz {
609              LFOv2Unit* lfo = GetRack()->panLFOs[i];              LFOv2Unit* lfo = GetRack()->panLFOs[i];
610              if (!lfo->Active()) continue;              if (!lfo->Active()) continue;
611                            
612              pan += lfo->GetLevel() * lfo->pLfoInfo->pan;              float f = lfo->suPanOnCC.Active() ? lfo->suPanOnCC.GetLevel() : 0;
613                pan += lfo->GetLevel() * (lfo->pLfoInfo->pan + f);
614          }          }
615                    
616          if(pan < -100) return -100;          if(pan < -100) return -100;
# Line 325  namespace LinuxSampler { namespace sfz { Line 622  namespace LinuxSampler { namespace sfz {
622            
623      SfzSignalUnitRack::SfzSignalUnitRack(Voice* voice)      SfzSignalUnitRack::SfzSignalUnitRack(Voice* voice)
624          : SignalUnitRack(MaxUnitCount), pVoice(voice), suEndpoint(this), suVolEG(this), suFilEG(this), suPitchEG(this),          : SignalUnitRack(MaxUnitCount), pVoice(voice), suEndpoint(this), suVolEG(this), suFilEG(this), suPitchEG(this),
625          EGs(maxEgCount), volEGs(maxEgCount), pitchEGs(maxEgCount),          EGs(maxEgCount), volEGs(maxEgCount), pitchEGs(maxEgCount), filEGs(maxEgCount), resEGs(maxEgCount), suVolOnCC(this),
626          suAmpLFO(this), suPitchLFO(this), suFilLFO(this),          suAmpLFO(this), suPitchLFO(this), suFilLFO(this),
627          LFOs(maxLfoCount), pitchLFOs(maxLfoCount), filLFOs(maxLfoCount), resLFOs(maxLfoCount), panLFOs(maxLfoCount)          LFOs(maxLfoCount), volLFOs(maxLfoCount), pitchLFOs(maxLfoCount),
628            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          suAmpLFO.pVoice = suPitchLFO.pVoice = suFilLFO.pVoice = voice;          suVolEG.pVoice = suFilEG.pVoice = suPitchEG.pVoice = voice;
632          suPitchLFO.suDepthCC.pVoice = voice;          suAmpLFO.pVoice = suPitchLFO.pVoice = suFilLFO.pVoice = suVolOnCC.pVoice = voice;
633            suPitchLFO.suDepthOnCC.pVoice = suPitchLFO.suFadeEG.pVoice = suPitchLFO.suFreqOnCC.pVoice = voice;
634            suFilLFO.suFadeEG.pVoice = suFilLFO.suDepthOnCC.pVoice = suFilLFO.suFreqOnCC.pVoice = voice;
635            suAmpLFO.suFadeEG.pVoice = suAmpLFO.suDepthOnCC.pVoice = suAmpLFO.suFreqOnCC.pVoice = voice;
636                    
637          for (int i = 0; i < EGs.capacity(); i++) {          for (int i = 0; i < EGs.capacity(); i++) {
638              EGs[i] = new EGv2Unit(this);              EGs[i] = new EGv2Unit(this);
639              EGs[i]->pVoice = voice;              EGs[i]->pVoice = voice;
640                EGs[i]->suAmpOnCC.pVoice = voice;
641                EGs[i]->suVolOnCC.pVoice = voice;
642                EGs[i]->suPitchOnCC.pVoice = voice;
643                EGs[i]->suCutoffOnCC.pVoice = voice;
644                EGs[i]->suResOnCC.pVoice = voice;
645          }          }
646                    
647          for (int i = 0; i < LFOs.capacity(); i++) {          for (int i = 0; i < LFOs.capacity(); i++) {
648              LFOs[i] = new LFOv2Unit(this);              LFOs[i] = new LFOv2Unit(this);
649              LFOs[i]->pVoice = voice;              LFOs[i]->pVoice = voice;
650                LFOs[i]->suFadeEG.pVoice = voice;
651                LFOs[i]->suVolOnCC.pVoice = voice;
652              LFOs[i]->suPitchOnCC.pVoice = voice;              LFOs[i]->suPitchOnCC.pVoice = voice;
653                LFOs[i]->suFreqOnCC.pVoice = voice;
654                LFOs[i]->suPanOnCC.pVoice = voice;
655                LFOs[i]->suCutoffOnCC.pVoice = voice;
656                LFOs[i]->suResOnCC.pVoice = voice;
657          }          }
658      }      }
659            
# Line 359  namespace LinuxSampler { namespace sfz { Line 671  namespace LinuxSampler { namespace sfz {
671          EGs.clear();          EGs.clear();
672          volEGs.clear();          volEGs.clear();
673          pitchEGs.clear();          pitchEGs.clear();
674            filEGs.clear();
675            resEGs.clear();
676                    
677          LFOs.clear();          LFOs.clear();
678            volLFOs.clear();
679          pitchLFOs.clear();          pitchLFOs.clear();
680          filLFOs.clear();          filLFOs.clear();
681          resLFOs.clear();          resLFOs.clear();
# Line 368  namespace LinuxSampler { namespace sfz { Line 683  namespace LinuxSampler { namespace sfz {
683                    
684          ::sfz::Region* const pRegion = pVoice->pRegion;          ::sfz::Region* const pRegion = pVoice->pRegion;
685                    
686            suVolOnCC.SetCCs(pRegion->volume_oncc);
687            
688          for (int i = 0; i < pRegion->eg.size(); i++) {          for (int i = 0; i < pRegion->eg.size(); i++) {
689              if (pRegion->eg[i].node.size() == 0) continue;              if (pRegion->eg[i].node.size() == 0) continue;
690                            
# Line 375  namespace LinuxSampler { namespace sfz { Line 692  namespace LinuxSampler { namespace sfz {
692                  EGv2Unit eg(this);                  EGv2Unit eg(this);
693                  eg.pEGInfo = &(pRegion->eg[i]);                  eg.pEGInfo = &(pRegion->eg[i]);
694                  EGs.increment()->Copy(eg);                  EGs.increment()->Copy(eg);
695                    EGs[EGs.size() - 1]->suAmpOnCC.SetCCs(pRegion->eg[i].amplitude_oncc);
696                    EGs[EGs.size() - 1]->suVolOnCC.SetCCs(pRegion->eg[i].volume_oncc);
697                    EGs[EGs.size() - 1]->suPitchOnCC.SetCCs(pRegion->eg[i].pitch_oncc);
698                    EGs[EGs.size() - 1]->suCutoffOnCC.SetCCs(pRegion->eg[i].cutoff_oncc);
699                    EGs[EGs.size() - 1]->suResOnCC.SetCCs(pRegion->eg[i].resonance_oncc);
700              } else { std::cerr << "Maximum number of EGs reached!" << std::endl; break; }              } else { std::cerr << "Maximum number of EGs reached!" << std::endl; break; }
701                            
702              if (pRegion->eg[i].amplitude > 0) {              if ( pRegion->eg[i].amplitude > 0 || !pRegion->eg[i].amplitude_oncc.empty() ||
703                     pRegion->eg[i].volume > -145 || !pRegion->eg[i].volume_oncc.empty()
704                ) {
705                  if(volEGs.size() < volEGs.capacity()) volEGs.add(EGs[EGs.size() - 1]);                  if(volEGs.size() < volEGs.capacity()) volEGs.add(EGs[EGs.size() - 1]);
706                  else std::cerr << "Maximum number of EGs reached!" << std::endl;                  else std::cerr << "Maximum number of EGs reached!" << std::endl;
707              }              }
708                
709                if (pRegion->eg[i].cutoff != 0 || !pRegion->eg[i].cutoff_oncc.empty()) {
710                    if(filEGs.size() < filEGs.capacity()) filEGs.add(EGs[EGs.size() - 1]);
711                    else std::cerr << "Maximum number of EGs reached!" << std::endl;
712                }
713                
714                if (pRegion->eg[i].resonance != 0 || !pRegion->eg[i].resonance_oncc.empty()) {
715                    if(resEGs.size() < resEGs.capacity()) resEGs.add(EGs[EGs.size() - 1]);
716                    else std::cerr << "Maximum number of EGs reached!" << std::endl;
717                }
718                
719                if (pRegion->eg[i].pitch != 0 || !pRegion->eg[i].pitch_oncc.empty()) {
720                    if(pitchEGs.size() < pitchEGs.capacity()) pitchEGs.add(EGs[EGs.size() - 1]);
721                    else std::cerr << "Maximum number of EGs reached!" << std::endl;
722                }
723          }          }
724                    
725          if (pRegion->ampeg_sustain == -1) {          if (pRegion->ampeg_sustain == -1) {
# Line 396  namespace LinuxSampler { namespace sfz { Line 735  namespace LinuxSampler { namespace sfz {
735                  LFOv2Unit lfo(this);                  LFOv2Unit lfo(this);
736                  lfo.pLfoInfo = &(pRegion->lfos[i]);                  lfo.pLfoInfo = &(pRegion->lfos[i]);
737                  LFOs.increment()->Copy(lfo);                  LFOs.increment()->Copy(lfo);
738                    LFOs[LFOs.size() - 1]->suVolOnCC.SetCCs(pRegion->lfos[i].volume_oncc);
739                  LFOs[LFOs.size() - 1]->suPitchOnCC.SetCCs(pRegion->lfos[i].pitch_oncc);                  LFOs[LFOs.size() - 1]->suPitchOnCC.SetCCs(pRegion->lfos[i].pitch_oncc);
740                    LFOs[LFOs.size() - 1]->suFreqOnCC.SetCCs(pRegion->lfos[i].freq_oncc);
741                    LFOs[LFOs.size() - 1]->suPanOnCC.SetCCs(pRegion->lfos[i].pan_oncc);
742                    LFOs[LFOs.size() - 1]->suCutoffOnCC.SetCCs(pRegion->lfos[i].cutoff_oncc);
743                    LFOs[LFOs.size() - 1]->suResOnCC.SetCCs(pRegion->lfos[i].resonance_oncc);
744              } else { std::cerr << "Maximum number of LFOs reached!" << std::endl; break; }              } else { std::cerr << "Maximum number of LFOs reached!" << std::endl; break; }
745                            
746                if (pRegion->lfos[i].volume != 0 || !pRegion->lfos[i].volume_oncc.empty()) {
747                    if(volLFOs.size() < volLFOs.capacity()) volLFOs.add(LFOs[LFOs.size() - 1]);
748                    else std::cerr << "Maximum number of LFOs reached!" << std::endl;
749                }
750                
751              if (pRegion->lfos[i].pitch != 0 || !pRegion->lfos[i].pitch_oncc.empty()) {              if (pRegion->lfos[i].pitch != 0 || !pRegion->lfos[i].pitch_oncc.empty()) {
752                  if(pitchLFOs.size() < pitchLFOs.capacity()) pitchLFOs.add(LFOs[LFOs.size() - 1]);                  if(pitchLFOs.size() < pitchLFOs.capacity()) pitchLFOs.add(LFOs[LFOs.size() - 1]);
753                  else std::cerr << "Maximum number of LFOs reached!" << std::endl;                  else std::cerr << "Maximum number of LFOs reached!" << std::endl;
754              }              }
755                            
756              if (pRegion->lfos[i].cutoff != 0) {              if (pRegion->lfos[i].cutoff != 0 || !pRegion->lfos[i].cutoff_oncc.empty()) {
757                  if(filLFOs.size() < filLFOs.capacity()) filLFOs.add(LFOs[LFOs.size() - 1]);                  if(filLFOs.size() < filLFOs.capacity()) filLFOs.add(LFOs[LFOs.size() - 1]);
758                  else std::cerr << "Maximum number of LFOs reached!" << std::endl;                  else std::cerr << "Maximum number of LFOs reached!" << std::endl;
759              }              }
760                            
761              if (pRegion->lfos[i].resonance != 0) {              if (pRegion->lfos[i].resonance != 0 || !pRegion->lfos[i].resonance_oncc.empty()) {
762                  if(resLFOs.size() < resLFOs.capacity()) resLFOs.add(LFOs[LFOs.size() - 1]);                  if(resLFOs.size() < resLFOs.capacity()) resLFOs.add(LFOs[LFOs.size() - 1]);
763                  else std::cerr << "Maximum number of LFOs reached!" << std::endl;                  else std::cerr << "Maximum number of LFOs reached!" << std::endl;
764              }              }
765                            
766              if (pRegion->lfos[i].pan != 0) {              if (pRegion->lfos[i].pan != 0 || !pRegion->lfos[i].pan_oncc.empty()) {
767                  if(panLFOs.size() < panLFOs.capacity()) panLFOs.add(LFOs[LFOs.size() - 1]);                  if(panLFOs.size() < panLFOs.capacity()) panLFOs.add(LFOs[LFOs.size() - 1]);
768                  else std::cerr << "Maximum number of LFOs reached!" << std::endl;                  else std::cerr << "Maximum number of LFOs reached!" << std::endl;
769              }              }
770          }          }
771                    
772          suPitchLFO.suDepthCC.SetCCs(pRegion->pitchlfo_depthcc);          suPitchLFO.suDepthOnCC.SetCCs(pRegion->pitchlfo_depthcc);
773            suPitchLFO.suFreqOnCC.SetCCs(pRegion->pitchlfo_freqcc);
774            
775            suFilLFO.suDepthOnCC.SetCCs(pRegion->fillfo_depthcc);
776            suFilLFO.suFreqOnCC.SetCCs(pRegion->fillfo_freqcc);
777            
778            suAmpLFO.suDepthOnCC.SetCCs(pRegion->amplfo_depthcc);
779            suAmpLFO.suFreqOnCC.SetCCs(pRegion->amplfo_freqcc);
780                    
781          Units.clear();          Units.clear();
782                    
783            Units.add(&suVolOnCC);
784            
785          Units.add(&suVolEG);          Units.add(&suVolEG);
786          Units.add(&suFilEG);          Units.add(&suFilEG);
787          Units.add(&suPitchEG);          Units.add(&suPitchEG);
788            
789            Units.add(&suPitchLFO.suFreqOnCC); // Don't change order! (should be triggered before the LFO)
790          Units.add(&suPitchLFO);          Units.add(&suPitchLFO);
791          Units.add(&suPitchLFO.suDepthCC);          Units.add(&suPitchLFO.suDepthOnCC);
792            Units.add(&suPitchLFO.suFadeEG);
793            
794            Units.add(&suAmpLFO.suFreqOnCC); // Don't change order! (should be triggered before the LFO)
795            Units.add(&suAmpLFO.suDepthOnCC);
796          Units.add(&suAmpLFO);          Units.add(&suAmpLFO);
797            Units.add(&suAmpLFO.suFadeEG);
798            
799            Units.add(&suFilLFO.suFreqOnCC); // Don't change order! (should be triggered before the LFO)
800            Units.add(&suFilLFO.suDepthOnCC);
801          Units.add(&suFilLFO);          Units.add(&suFilLFO);
802            Units.add(&suFilLFO.suFadeEG);
803                    
804          for (int i = 0; i < EGs.size(); i++) {          for (int i = 0; i < EGs.size(); i++) {
805              Units.add(EGs[i]);              Units.add(EGs[i]);
806                Units.add(&(EGs[i]->suAmpOnCC));
807                Units.add(&(EGs[i]->suVolOnCC));
808                Units.add(&(EGs[i]->suPitchOnCC));
809                Units.add(&(EGs[i]->suCutoffOnCC));
810                Units.add(&(EGs[i]->suResOnCC));
811          }          }
812                    
813          for (int i = 0; i < LFOs.size(); i++) {          for (int i = 0; i < LFOs.size(); i++) {
814                Units.add(&(LFOs[i]->suFreqOnCC)); // Don't change order! (should be triggered before the LFO)
815              Units.add(LFOs[i]);              Units.add(LFOs[i]);
816                Units.add(&(LFOs[i]->suFadeEG));
817                Units.add(&(LFOs[i]->suVolOnCC));
818              Units.add(&(LFOs[i]->suPitchOnCC));              Units.add(&(LFOs[i]->suPitchOnCC));
819                Units.add(&(LFOs[i]->suPanOnCC));
820                Units.add(&(LFOs[i]->suCutoffOnCC));
821                Units.add(&(LFOs[i]->suResOnCC));
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.2225  
changed lines
  Added in v.2236

  ViewVC Help
Powered by ViewVC