/[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 2296 by iliev, Thu Dec 8 20:03:47 2011 UTC revision 3561 by schoenebeck, Fri Aug 23 11:44:00 2019 UTC
# Line 2  Line 2 
2   *                                                                         *   *                                                                         *
3   *   LinuxSampler - modular, streaming capable sampler                     *   *   LinuxSampler - modular, streaming capable sampler                     *
4   *                                                                         *   *                                                                         *
5   *   Copyright (C) 2011 Grigor Iliev                                       *   *   Copyright (C) 2011 - 2012 Grigor Iliev                                *
6   *                                                                         *   *                                                                         *
7   *   This program is free software; you can redistribute it and/or modify  *   *   This program is free software; you can redistribute it and/or modify  *
8   *   it under the terms of the GNU General Public License as published by  *   *   it under the terms of the GNU General Public License as published by  *
# Line 129  namespace LinuxSampler { namespace sfz { Line 129  namespace LinuxSampler { namespace sfz {
129            
130            
131      EGv2Unit::EGv2Unit(SfzSignalUnitRack* rack)      EGv2Unit::EGv2Unit(SfzSignalUnitRack* rack)
132          : EGUnit< ::LinuxSampler::sfz::EG>(rack), suAmpOnCC(rack), suVolOnCC(rack),          : EGUnit< ::LinuxSampler::sfz::EG>(rack), EqUnitSupport(rack), suAmpOnCC(rack), suVolOnCC(rack),
133            suPitchOnCC(rack), suCutoffOnCC(rack), suResOnCC(rack), suPanOnCC(rack)            suPitchOnCC(rack), suCutoffOnCC(rack), suResOnCC(rack), suPanOnCC(rack)
134      { }      { }
135            
# Line 142  namespace LinuxSampler { namespace sfz { Line 142  namespace LinuxSampler { namespace sfz {
142              f = GetInfluence(egInfo.node[i].time_oncc);              f = GetInfluence(egInfo.node[i].time_oncc);
143              egInfo.node[i].time = std::min(egInfo.node[i].time + f, 100.0f);              egInfo.node[i].time = std::min(egInfo.node[i].time + f, 100.0f);
144          }          }
145          EG.trigger(egInfo, GetSampleRate(), pVoice->MIDIVelocity);          EG.trigger(egInfo, GetSampleRate(), pVoice->MIDIVelocity());
146      }      }
147            
148            
# Line 151  namespace LinuxSampler { namespace sfz { Line 151  namespace LinuxSampler { namespace sfz {
151          depth = pRegion->pitcheg_depth + GetInfluence(pRegion->pitcheg_depth_oncc);          depth = pRegion->pitcheg_depth + GetInfluence(pRegion->pitcheg_depth_oncc);
152                    
153          // 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
154          const double velrelease = 1 / pVoice->GetVelocityRelease(pVoice->MIDIVelocity);          const double velrelease = 1 / pVoice->GetVelocityRelease(pVoice->MIDIVelocity());
155    
156          // set the delay trigger          // set the delay trigger
157          float delay = pRegion->pitcheg_delay + pRegion->pitcheg_vel2delay * velrelease;          float delay = pRegion->pitcheg_delay + pRegion->pitcheg_vel2delay * velrelease;
# Line 177  namespace LinuxSampler { namespace sfz { Line 177  namespace LinuxSampler { namespace sfz {
177                    
178          EG.trigger (          EG.trigger (
179              uint(std::min(std::max(0.0f, start), 1000.0f)), attack, hold, decay,              uint(std::min(std::max(0.0f, start), 1000.0f)), attack, hold, decay,
180              uint(std::min(std::max(0.0f, sustain), 1000.0f)), release, GetSampleRate()              uint(std::min(std::max(0.0f, sustain), 1000.0f)), release, GetSampleRate(), true
181          );          );
182      }      }
183            
# Line 187  namespace LinuxSampler { namespace sfz { Line 187  namespace LinuxSampler { namespace sfz {
187          depth = pRegion->fileg_depth + GetInfluence(pRegion->fileg_depth_oncc);          depth = pRegion->fileg_depth + GetInfluence(pRegion->fileg_depth_oncc);
188                    
189          // 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
190          const double velrelease = 1 / pVoice->GetVelocityRelease(pVoice->MIDIVelocity);          const double velrelease = 1 / pVoice->GetVelocityRelease(pVoice->MIDIVelocity());
191    
192          // set the delay trigger          // set the delay trigger
193          float delay = pRegion->fileg_delay + pRegion->fileg_vel2delay * velrelease;          float delay = pRegion->fileg_delay + pRegion->fileg_vel2delay * velrelease;
# Line 213  namespace LinuxSampler { namespace sfz { Line 213  namespace LinuxSampler { namespace sfz {
213                    
214          EG.trigger (          EG.trigger (
215              uint(std::min(std::max(0.0f, start), 1000.0f)), attack, hold, decay,              uint(std::min(std::max(0.0f, start), 1000.0f)), attack, hold, decay,
216              uint(std::min(std::max(0.0f, sustain), 1000.0f)), release, GetSampleRate()              uint(std::min(std::max(0.0f, sustain), 1000.0f)), release, GetSampleRate(), true
217          );          );
218      }      }
219            
# Line 222  namespace LinuxSampler { namespace sfz { Line 222  namespace LinuxSampler { namespace sfz {
222          ::sfz::Region* const pRegion = pVoice->pRegion;          ::sfz::Region* const pRegion = pVoice->pRegion;
223                    
224          // 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
225          const double velrelease = 1 / pVoice->GetVelocityRelease(pVoice->MIDIVelocity);          const double velrelease = 1 / pVoice->GetVelocityRelease(pVoice->MIDIVelocity());
226    
227          // set the delay trigger          // set the delay trigger
228          float delay = pRegion->ampeg_delay + pRegion->ampeg_vel2delay * velrelease;          float delay = pRegion->ampeg_delay + pRegion->ampeg_vel2delay * velrelease;
# Line 242  namespace LinuxSampler { namespace sfz { Line 242  namespace LinuxSampler { namespace sfz {
242                    
243          float sustain = pRegion->ampeg_sustain + pRegion->ampeg_vel2sustain * velrelease;          float sustain = pRegion->ampeg_sustain + pRegion->ampeg_vel2sustain * velrelease;
244          sustain = 10 * (sustain + GetInfluence(pRegion->ampeg_sustaincc));          sustain = 10 * (sustain + GetInfluence(pRegion->ampeg_sustaincc));
245                    if (pVoice->pNote) {
246                pVoice->pNote->Override.Sustain.applyTo(sustain);
247            }
248    
249          float release = pRegion->ampeg_release + pRegion->ampeg_vel2release * velrelease;          float release = pRegion->ampeg_release + pRegion->ampeg_vel2release * velrelease;
250          release = std::max(0.0f, release + GetInfluence(pRegion->ampeg_releasecc));          release = std::max(0.0f, release + GetInfluence(pRegion->ampeg_releasecc));
251                    
252          EG.trigger (          EG.trigger (
253              uint(std::min(std::max(0.0f, start), 1000.0f)), attack, hold, decay,              uint(std::min(std::max(0.0f, start), 1000.0f)), attack, hold, decay,
254              uint(std::min(std::max(0.0f, sustain), 1000.0f)), release, GetSampleRate()              uint(std::min(std::max(0.0f, sustain), 1000.0f)), release, GetSampleRate(), false
255          );          );
256      }      }
257            
258            
259      LFOUnit::LFOUnit(SfzSignalUnitRack* rack)      LFOUnit::LFOUnit(SfzSignalUnitRack* rack)
260          : SfzSignalUnit(rack), pLfoInfo(NULL), pLFO(NULL),          : SfzSignalUnit(rack), pLfoInfo(NULL), pLFO(NULL),
261            suFadeEG(rack), suFreqOnCC(rack, this), suDepthOnCC(rack)            suFadeEG(rack), suDepthOnCC(rack), suFreqOnCC(rack, this)
262      { }      { }
263            
264      LFOUnit::LFOUnit(const LFOUnit& Unit)      LFOUnit::LFOUnit(const LFOUnit& Unit)
265          : SfzSignalUnit(Unit), suFadeEG(static_cast<SfzSignalUnitRack*>(Unit.pRack)),          : SfzSignalUnit(Unit), suFadeEG(static_cast<SfzSignalUnitRack*>(Unit.pRack)),
266            suFreqOnCC(static_cast<SfzSignalUnitRack*>(Unit.pRack), this),            suDepthOnCC(static_cast<SfzSignalUnitRack*>(Unit.pRack)),
267            suDepthOnCC(static_cast<SfzSignalUnitRack*>(Unit.pRack))            suFreqOnCC(static_cast<SfzSignalUnitRack*>(Unit.pRack), this)
268      {      {
269          Copy(Unit);          Copy(Unit);
270      }      }
# Line 287  namespace LinuxSampler { namespace sfz { Line 290  namespace LinuxSampler { namespace sfz {
290                            
291              if (f != 0) {              if (f != 0) {
292                  suFadeEG.uiDelayTrigger = pLfoInfo->delay * GetSampleRate();                  suFadeEG.uiDelayTrigger = pLfoInfo->delay * GetSampleRate();
293                  suFadeEG.EG.trigger(0, f, 0, 0, 1000, 0, GetSampleRate());                  suFadeEG.EG.trigger(0, f, 0, 0, 1000, 0, GetSampleRate(), false);
294              }              }
295          }          }
296      }      }
# Line 306  namespace LinuxSampler { namespace sfz { Line 309  namespace LinuxSampler { namespace sfz {
309              start_level_mid,              start_level_mid,
310              1, 0, false, GetSampleRate()              1, 0, false, GetSampleRate()
311          );          );
312          lfo.update(0);          lfo.updateByMIDICtrlValue(0);
313      }      }
314            
315            
316      LFOv2Unit::LFOv2Unit(SfzSignalUnitRack* rack)      LFOv2Unit::LFOv2Unit(SfzSignalUnitRack* rack)
317          : LFOUnit(rack), lfos(8), lfo0(1200.0f), lfo1(1200.0f), lfo2(1200.0f),          : LFOUnit(rack), EqUnitSupport(rack), lfos(8), lfo0(1200.0f), lfo1(1200.0f), lfo2(1200.0f),
318            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),
319            suVolOnCC(rack), suPitchOnCC(rack), suPanOnCC(rack), suCutoffOnCC(rack), suResOnCC(rack)            suVolOnCC(rack), suPitchOnCC(rack), suPanOnCC(rack), suCutoffOnCC(rack), suResOnCC(rack)
320      {      {
# Line 328  namespace LinuxSampler { namespace sfz { Line 331  namespace LinuxSampler { namespace sfz {
331      void LFOv2Unit::Trigger() {      void LFOv2Unit::Trigger() {
332          LFOUnit::Trigger();          LFOUnit::Trigger();
333                    
334          if (pLfoInfo->wave < 0 || pLfoInfo->wave >= lfos.size()) pLFO = &lfo0;          if (/*pLfoInfo->wave < 0 ||*/ pLfoInfo->wave >= lfos.size()) pLFO = &lfo0;
335          else pLFO = lfos[pLfoInfo->wave];          else pLFO = lfos[pLfoInfo->wave];
336                    
337          pLFO->Trigger (          pLFO->Trigger (
# Line 483  namespace LinuxSampler { namespace sfz { Line 486  namespace LinuxSampler { namespace sfz {
486    
487    
488      EndpointUnit::EndpointUnit(SfzSignalUnitRack* rack)      EndpointUnit::EndpointUnit(SfzSignalUnitRack* rack)
489          : EndpointSignalUnit(rack), suXFInCC(rack), suXFOutCC(rack), suPanOnCC(rack), pitchVeltrackRatio(0)          : EndpointSignalUnit(rack), pitchVeltrackRatio(0), suXFInCC(rack), suXFOutCC(rack), suPanOnCC(rack)
490      {      {
491                    
492      }      }
493            
494        float EndpointUnit::GetInfluence(::sfz::Array< optional<float> >& cc) {
495            float f = 0;
496            for (int i = 0; i < 128; i++) {
497                if (cc[i]) {
498                    f += (pVoice->GetControllerValue(i) / 127.0f) * (*cc[i]);
499                }
500            }
501            return f;
502        }
503        
504        float EndpointUnit::GetInfluence(::sfz::Array< optional<int> >& cc) {
505            float f = 0;
506            for (int i = 0; i < 128; i++) {
507                if (cc[i]) {
508                    f += (pVoice->GetControllerValue(i) / 127.0f) * (*cc[i]);
509                }
510            }
511            return f;
512        }
513        
514      SfzSignalUnitRack* const EndpointUnit::GetRack() {      SfzSignalUnitRack* const EndpointUnit::GetRack() {
515          return static_cast<SfzSignalUnitRack* const>(pRack);          return static_cast<SfzSignalUnitRack* const>(pRack);
516      }      }
517            
518      void EndpointUnit::Trigger() {      void EndpointUnit::Trigger() {
519            uiDelayTrigger = (uint)GetInfluence(pVoice->pRegion->delay_samples_oncc);
520            if (pVoice->pRegion->delay_samples) uiDelayTrigger += *pVoice->pRegion->delay_samples;
521            
522            if (pVoice->pRegion->delay) {
523                /* here we use the device sample rate */
524                uiDelayTrigger += (uint)( (*pVoice->pRegion->delay) * pVoice->GetSampleRate() );
525            }
526            
527            if (pVoice->pRegion->delay_random) {
528                float r = pVoice->GetEngine()->Random();
529                uiDelayTrigger += (uint)( r * (*pVoice->pRegion->delay_random) * pVoice->GetSampleRate() );
530            }
531            
532            uiDelayTrigger += (uint)(GetInfluence(pVoice->pRegion->delay_oncc) * pVoice->GetSampleRate());
533            
534          float xfInVelCoeff = 1;          float xfInVelCoeff = 1;
535                    
536          if (pVoice->MIDIVelocity <= pVoice->pRegion->xfin_lovel) {          if (pVoice->MIDIVelocity() <= pVoice->pRegion->xfin_lovel) {
537              xfInVelCoeff = 0;              xfInVelCoeff = 0;
538          } else if (pVoice->MIDIVelocity >= pVoice->pRegion->xfin_hivel) {          } else if (pVoice->MIDIVelocity() >= pVoice->pRegion->xfin_hivel) {
539              xfInVelCoeff = 1;              xfInVelCoeff = 1;
540          } else {          } else {
541              float xfVelSize = pVoice->pRegion->xfin_hivel - pVoice->pRegion->xfin_lovel;              float xfVelSize = pVoice->pRegion->xfin_hivel - pVoice->pRegion->xfin_lovel;
542              float velPos = pVoice->MIDIVelocity - pVoice->pRegion->xfin_lovel;              float velPos = pVoice->MIDIVelocity() - pVoice->pRegion->xfin_lovel;
543              xfInVelCoeff = velPos / xfVelSize;              xfInVelCoeff = velPos / xfVelSize;
544              if (pVoice->pRegion->xf_velcurve == ::sfz::POWER) {              if (pVoice->pRegion->xf_velcurve == ::sfz::POWER) {
545                  xfInVelCoeff = sin(xfInVelCoeff * M_PI / 2.0);                  xfInVelCoeff = sin(xfInVelCoeff * M_PI / 2.0);
# Line 510  namespace LinuxSampler { namespace sfz { Line 548  namespace LinuxSampler { namespace sfz {
548                    
549          float xfOutVelCoeff = 1;          float xfOutVelCoeff = 1;
550                    
551          if (pVoice->MIDIVelocity >= pVoice->pRegion->xfout_hivel) {          if (pVoice->MIDIVelocity() >= pVoice->pRegion->xfout_hivel) {
552              if (pVoice->pRegion->xfout_lovel < 127 /* is set */) xfOutVelCoeff = 0;              if (pVoice->pRegion->xfout_lovel < 127 /* is set */) xfOutVelCoeff = 0;
553          } else if (pVoice->MIDIVelocity <= pVoice->pRegion->xfout_lovel) {          } else if (pVoice->MIDIVelocity() <= pVoice->pRegion->xfout_lovel) {
554              xfOutVelCoeff = 1;              xfOutVelCoeff = 1;
555          } else {          } else {
556              float xfVelSize = pVoice->pRegion->xfout_hivel - pVoice->pRegion->xfout_lovel;              float xfVelSize = pVoice->pRegion->xfout_hivel - pVoice->pRegion->xfout_lovel;
557              float velPos = pVoice->MIDIVelocity - pVoice->pRegion->xfout_lovel;              float velPos = pVoice->MIDIVelocity() - pVoice->pRegion->xfout_lovel;
558              xfOutVelCoeff = 1.0f - velPos / xfVelSize;              xfOutVelCoeff = 1.0f - velPos / xfVelSize;
559              if (pVoice->pRegion->xf_velcurve == ::sfz::POWER) {              if (pVoice->pRegion->xf_velcurve == ::sfz::POWER) {
560                  xfOutVelCoeff = sin(xfOutVelCoeff * M_PI / 2.0);                  xfOutVelCoeff = sin(xfOutVelCoeff * M_PI / 2.0);
# Line 525  namespace LinuxSampler { namespace sfz { Line 563  namespace LinuxSampler { namespace sfz {
563                    
564          float xfInKeyCoeff = 1;          float xfInKeyCoeff = 1;
565                    
566          if (pVoice->MIDIKey <= pVoice->pRegion->xfin_lokey) {          if (pVoice->MIDIKey() <= pVoice->pRegion->xfin_lokey) {
567              if (pVoice->pRegion->xfin_hikey > 0 /* is set */) xfInKeyCoeff = 0;              if (pVoice->pRegion->xfin_hikey > 0 /* is set */) xfInKeyCoeff = 0;
568          } else if (pVoice->MIDIKey >= pVoice->pRegion->xfin_hikey) {          } else if (pVoice->MIDIKey() >= pVoice->pRegion->xfin_hikey) {
569              xfInKeyCoeff = 1;              xfInKeyCoeff = 1;
570          } else {          } else {
571              float xfKeySize = pVoice->pRegion->xfin_hikey - pVoice->pRegion->xfin_lokey;              float xfKeySize = pVoice->pRegion->xfin_hikey - pVoice->pRegion->xfin_lokey;
572              float keyPos = pVoice->MIDIKey - pVoice->pRegion->xfin_lokey;              float keyPos = pVoice->MIDIKey() - pVoice->pRegion->xfin_lokey;
573              xfInKeyCoeff = keyPos / xfKeySize;              xfInKeyCoeff = keyPos / xfKeySize;
574              if (pVoice->pRegion->xf_keycurve == ::sfz::POWER) {              if (pVoice->pRegion->xf_keycurve == ::sfz::POWER) {
575                  xfInKeyCoeff = sin(xfInKeyCoeff * M_PI / 2.0);                  xfInKeyCoeff = sin(xfInKeyCoeff * M_PI / 2.0);
# Line 540  namespace LinuxSampler { namespace sfz { Line 578  namespace LinuxSampler { namespace sfz {
578                    
579          float xfOutKeyCoeff = 1;          float xfOutKeyCoeff = 1;
580                    
581          if (pVoice->MIDIKey >= pVoice->pRegion->xfout_hikey) {          if (pVoice->MIDIKey() >= pVoice->pRegion->xfout_hikey) {
582              if (pVoice->pRegion->xfout_lokey < 127 /* is set */) xfOutKeyCoeff = 0;              if (pVoice->pRegion->xfout_lokey < 127 /* is set */) xfOutKeyCoeff = 0;
583          } else if (pVoice->MIDIKey <= pVoice->pRegion->xfout_lokey) {          } else if (pVoice->MIDIKey() <= pVoice->pRegion->xfout_lokey) {
584              xfOutKeyCoeff = 1;              xfOutKeyCoeff = 1;
585          } else {          } else {
586              float xfKeySize = pVoice->pRegion->xfout_hikey - pVoice->pRegion->xfout_lokey;              float xfKeySize = pVoice->pRegion->xfout_hikey - pVoice->pRegion->xfout_lokey;
587              float keyPos = pVoice->MIDIKey - pVoice->pRegion->xfout_lokey;              float keyPos = pVoice->MIDIKey() - pVoice->pRegion->xfout_lokey;
588              xfOutKeyCoeff = 1.0f - keyPos / xfKeySize;              xfOutKeyCoeff = 1.0f - keyPos / xfKeySize;
589              if (pVoice->pRegion->xf_keycurve == ::sfz::POWER) {              if (pVoice->pRegion->xf_keycurve == ::sfz::POWER) {
590                  xfOutKeyCoeff = sin(xfOutKeyCoeff * M_PI / 2.0);                  xfOutKeyCoeff = sin(xfOutKeyCoeff * M_PI / 2.0);
# Line 560  namespace LinuxSampler { namespace sfz { Line 598  namespace LinuxSampler { namespace sfz {
598                    
599          suPanOnCC.SetCCs(pVoice->pRegion->pan_oncc);          suPanOnCC.SetCCs(pVoice->pRegion->pan_oncc);
600                    
601          pitchVeltrackRatio = RTMath::CentsToFreqRatioUnlimited((pVoice->MIDIVelocity / 127.0f) * pVoice->pRegion->pitch_veltrack);          pitchVeltrackRatio = RTMath::CentsToFreqRatioUnlimited((pVoice->MIDIVelocity() / 127.0f) * pVoice->pRegion->pitch_veltrack);
602      }      }
603            
604      bool EndpointUnit::Active() {      bool EndpointUnit::Active() {
605            if (pRack->isReleaseStageEntered() && uiDelayTrigger) {
606                return false; // The key was released before the delay end, so the voice won't play at all.
607            }
608            
609          if (GetRack()->suVolEG.Active()) return true;          if (GetRack()->suVolEG.Active()) return true;
610                    
611          bool b = false;          bool b = false;
# Line 732  namespace LinuxSampler { namespace sfz { Line 774  namespace LinuxSampler { namespace sfz {
774              pan += lfo->GetLevel() * (lfo->pLfoInfo->pan + f);              pan += lfo->GetLevel() * (lfo->pLfoInfo->pan + f);
775          }          }
776                    
         if(pan < -100) return -100;  
         if(pan >  100) return  100;  
           
777          return pan;          return pan;
778      }      }
779            
780            
781      SfzSignalUnitRack::SfzSignalUnitRack(Voice* voice)      SfzSignalUnitRack::SfzSignalUnitRack(Voice* voice)
782          : SignalUnitRack(MaxUnitCount), pVoice(voice), suEndpoint(this), suVolEG(this), suFilEG(this), suPitchEG(this),          : SignalUnitRack(MaxUnitCount), EqUnitSupport(this, voice),
783          EGs(maxEgCount), volEGs(maxEgCount), pitchEGs(maxEgCount), filEGs(maxEgCount), resEGs(maxEgCount), panEGs(maxEgCount),          suEndpoint(this), suVolEG(this), suFilEG(this), suPitchEG(this),
         suEq1GainOnCC(this), suEq2GainOnCC(this), suEq3GainOnCC(this),  
         suEq1FreqOnCC(this), suEq2FreqOnCC(this), suEq3FreqOnCC(this),  
         suEq1BwOnCC(this), suEq2BwOnCC(this), suEq3BwOnCC(this),  
         suVolOnCC(this), suPitchOnCC(this), suCutoffOnCC(this), suResOnCC(this),  
784          suAmpLFO(this), suPitchLFO(this), suFilLFO(this),          suAmpLFO(this), suPitchLFO(this), suFilLFO(this),
785            suVolOnCC(this), suPitchOnCC(this), suCutoffOnCC(this), suResOnCC(this),
786            EGs(maxEgCount), volEGs(maxEgCount), pitchEGs(maxEgCount), filEGs(maxEgCount),
787            resEGs(maxEgCount), panEGs(maxEgCount), eqEGs(maxEgCount),
788          LFOs(maxLfoCount), volLFOs(maxLfoCount), pitchLFOs(maxLfoCount),          LFOs(maxLfoCount), volLFOs(maxLfoCount), pitchLFOs(maxLfoCount),
789          filLFOs(maxLfoCount), resLFOs(maxLfoCount), panLFOs(maxLfoCount)          filLFOs(maxLfoCount), resLFOs(maxLfoCount), panLFOs(maxLfoCount), eqLFOs(maxLfoCount),
790            pVoice(voice)
791      {      {
792          suEndpoint.pVoice = suEndpoint.suXFInCC.pVoice = suEndpoint.suXFOutCC.pVoice = suEndpoint.suPanOnCC.pVoice = voice;          suEndpoint.pVoice = suEndpoint.suXFInCC.pVoice = suEndpoint.suXFOutCC.pVoice = suEndpoint.suPanOnCC.pVoice = voice;
793          suVolEG.pVoice = suFilEG.pVoice = suPitchEG.pVoice = voice;          suVolEG.pVoice = suFilEG.pVoice = suPitchEG.pVoice = voice;
794          suAmpLFO.pVoice = suPitchLFO.pVoice = suFilLFO.pVoice = voice;          suAmpLFO.pVoice = suPitchLFO.pVoice = suFilLFO.pVoice = voice;
795                    
         suEq1GainOnCC.pVoice = suEq2GainOnCC.pVoice = suEq3GainOnCC.pVoice = voice;  
         suEq1FreqOnCC.pVoice = suEq2FreqOnCC.pVoice = suEq3FreqOnCC.pVoice = voice;  
         suEq1BwOnCC.pVoice = suEq2BwOnCC.pVoice = suEq3BwOnCC.pVoice = voice;  
           
796          suVolOnCC.pVoice = suPitchOnCC.pVoice = suCutoffOnCC.pVoice = suResOnCC.pVoice = voice;          suVolOnCC.pVoice = suPitchOnCC.pVoice = suCutoffOnCC.pVoice = suResOnCC.pVoice = voice;
797          suPitchLFO.suDepthOnCC.pVoice = suPitchLFO.suFadeEG.pVoice = suPitchLFO.suFreqOnCC.pVoice = voice;          suPitchLFO.suDepthOnCC.pVoice = suPitchLFO.suFadeEG.pVoice = suPitchLFO.suFreqOnCC.pVoice = voice;
798          suFilLFO.suFadeEG.pVoice = suFilLFO.suDepthOnCC.pVoice = suFilLFO.suFreqOnCC.pVoice = voice;          suFilLFO.suFadeEG.pVoice = suFilLFO.suDepthOnCC.pVoice = suFilLFO.suFreqOnCC.pVoice = voice;
# Line 772  namespace LinuxSampler { namespace sfz { Line 807  namespace LinuxSampler { namespace sfz {
807              EGs[i]->suCutoffOnCC.pVoice = voice;              EGs[i]->suCutoffOnCC.pVoice = voice;
808              EGs[i]->suResOnCC.pVoice = voice;              EGs[i]->suResOnCC.pVoice = voice;
809              EGs[i]->suPanOnCC.pVoice = voice;              EGs[i]->suPanOnCC.pVoice = voice;
810                EGs[i]->SetVoice(voice); // class EqUnitSupport
811          }          }
812                    
813          for (int i = 0; i < LFOs.capacity(); i++) {          for (int i = 0; i < LFOs.capacity(); i++) {
# Line 786  namespace LinuxSampler { namespace sfz { Line 822  namespace LinuxSampler { namespace sfz {
822              LFOs[i]->suPanOnCC.pVoice = voice;              LFOs[i]->suPanOnCC.pVoice = voice;
823              LFOs[i]->suCutoffOnCC.pVoice = voice;              LFOs[i]->suCutoffOnCC.pVoice = voice;
824              LFOs[i]->suResOnCC.pVoice = voice;              LFOs[i]->suResOnCC.pVoice = voice;
825                LFOs[i]->SetVoice(voice); // class EqUnitSupport
826          }          }
827      }      }
828            
# Line 803  namespace LinuxSampler { namespace sfz { Line 840  namespace LinuxSampler { namespace sfz {
840          Pool<CCSignalUnit::CC>* pCCPool = pVoice->pEngine->pCCPool;          Pool<CCSignalUnit::CC>* pCCPool = pVoice->pEngine->pCCPool;
841          Pool<Smoother>* pSmootherPool = pVoice->pEngine->pSmootherPool;          Pool<Smoother>* pSmootherPool = pVoice->pEngine->pSmootherPool;
842                    
843          suEq1GainOnCC.InitCCList(pCCPool, pSmootherPool);          EqUnitSupport::InitCCLists(pCCPool, pSmootherPool);
         suEq2GainOnCC.InitCCList(pCCPool, pSmootherPool);  
         suEq3GainOnCC.InitCCList(pCCPool, pSmootherPool);  
         suEq1FreqOnCC.InitCCList(pCCPool, pSmootherPool);  
         suEq2FreqOnCC.InitCCList(pCCPool, pSmootherPool);  
         suEq3FreqOnCC.InitCCList(pCCPool, pSmootherPool);  
         suEq1BwOnCC.InitCCList(pCCPool, pSmootherPool);  
         suEq2BwOnCC.InitCCList(pCCPool, pSmootherPool);  
         suEq3BwOnCC.InitCCList(pCCPool, pSmootherPool);  
844                    
845          suVolOnCC.InitCCList(pCCPool, pSmootherPool);          suVolOnCC.InitCCList(pCCPool, pSmootherPool);
846          suPitchOnCC.InitCCList(pCCPool, pSmootherPool);          suPitchOnCC.InitCCList(pCCPool, pSmootherPool);
# Line 834  namespace LinuxSampler { namespace sfz { Line 863  namespace LinuxSampler { namespace sfz {
863              EGs[i]->suCutoffOnCC.InitCCList(pCCPool, pSmootherPool);              EGs[i]->suCutoffOnCC.InitCCList(pCCPool, pSmootherPool);
864              EGs[i]->suResOnCC.InitCCList(pCCPool, pSmootherPool);              EGs[i]->suResOnCC.InitCCList(pCCPool, pSmootherPool);
865              EGs[i]->suPanOnCC.InitCCList(pCCPool, pSmootherPool);              EGs[i]->suPanOnCC.InitCCList(pCCPool, pSmootherPool);
866                EGs[i]->InitCCLists(pCCPool, pSmootherPool); // class EqUnitSupport
867          }          }
868                    
869          for (int i = 0; i < LFOs.capacity(); i++) {          for (int i = 0; i < LFOs.capacity(); i++) {
# Line 845  namespace LinuxSampler { namespace sfz { Line 875  namespace LinuxSampler { namespace sfz {
875              LFOs[i]->suPanOnCC.InitCCList(pCCPool, pSmootherPool);              LFOs[i]->suPanOnCC.InitCCList(pCCPool, pSmootherPool);
876              LFOs[i]->suCutoffOnCC.InitCCList(pCCPool, pSmootherPool);              LFOs[i]->suCutoffOnCC.InitCCList(pCCPool, pSmootherPool);
877              LFOs[i]->suResOnCC.InitCCList(pCCPool, pSmootherPool);              LFOs[i]->suResOnCC.InitCCList(pCCPool, pSmootherPool);
878                LFOs[i]->InitCCLists(pCCPool, pSmootherPool); // class EqUnitSupport
879          }          }
880      }      }
881            
# Line 855  namespace LinuxSampler { namespace sfz { Line 886  namespace LinuxSampler { namespace sfz {
886          filEGs.clear();          filEGs.clear();
887          resEGs.clear();          resEGs.clear();
888          panEGs.clear();          panEGs.clear();
889            eqEGs.clear();
890                    
891          LFOs.clear();          LFOs.clear();
892          volLFOs.clear();          volLFOs.clear();
# Line 862  namespace LinuxSampler { namespace sfz { Line 894  namespace LinuxSampler { namespace sfz {
894          filLFOs.clear();          filLFOs.clear();
895          resLFOs.clear();          resLFOs.clear();
896          panLFOs.clear();          panLFOs.clear();
897            eqLFOs.clear();
898                    
899          ::sfz::Region* const pRegion = pVoice->pRegion;          ::sfz::Region* const pRegion = pVoice->pRegion;
900                    
         suEq1GainOnCC.SetCCs(pRegion->eq1_gain_oncc);  
         suEq2GainOnCC.SetCCs(pRegion->eq2_gain_oncc);  
         suEq3GainOnCC.SetCCs(pRegion->eq3_gain_oncc);  
         suEq1FreqOnCC.SetCCs(pRegion->eq1_freq_oncc);  
         suEq2FreqOnCC.SetCCs(pRegion->eq2_freq_oncc);  
         suEq3FreqOnCC.SetCCs(pRegion->eq3_freq_oncc);  
         suEq1BwOnCC.SetCCs(pRegion->eq1_bw_oncc);  
         suEq2BwOnCC.SetCCs(pRegion->eq2_bw_oncc);  
         suEq3BwOnCC.SetCCs(pRegion->eq3_bw_oncc);  
           
         bHasEq = pRegion->eq1_gain || pRegion->eq2_gain || pRegion->eq3_gain ||  
                  suEq1GainOnCC.HasCCs() || suEq2GainOnCC.HasCCs() || suEq3GainOnCC.HasCCs();  
           
901          suVolOnCC.SetCCs(pRegion->volume_oncc);          suVolOnCC.SetCCs(pRegion->volume_oncc);
902          suPitchOnCC.SetCCs(pRegion->pitch_oncc);          suPitchOnCC.SetCCs(pRegion->pitch_oncc);
903          suCutoffOnCC.SetCCs(pRegion->cutoff_oncc);          suCutoffOnCC.SetCCs(pRegion->cutoff_oncc);
# Line 896  namespace LinuxSampler { namespace sfz { Line 916  namespace LinuxSampler { namespace sfz {
916                  EGs[EGs.size() - 1]->suCutoffOnCC.SetCCs(pRegion->eg[i].cutoff_oncc);                  EGs[EGs.size() - 1]->suCutoffOnCC.SetCCs(pRegion->eg[i].cutoff_oncc);
917                  EGs[EGs.size() - 1]->suResOnCC.SetCCs(pRegion->eg[i].resonance_oncc);                  EGs[EGs.size() - 1]->suResOnCC.SetCCs(pRegion->eg[i].resonance_oncc);
918                  EGs[EGs.size() - 1]->suPanOnCC.SetCCs(pRegion->eg[i].pan_oncc);                  EGs[EGs.size() - 1]->suPanOnCC.SetCCs(pRegion->eg[i].pan_oncc);
919                    if (pVoice->bEqSupport) {
920                        EGs[EGs.size() - 1]->suEq1FreqOnCC.SetCCs(pRegion->eg[i].eq1freq_oncc);
921                        EGs[EGs.size() - 1]->suEq2FreqOnCC.SetCCs(pRegion->eg[i].eq2freq_oncc);
922                        EGs[EGs.size() - 1]->suEq3FreqOnCC.SetCCs(pRegion->eg[i].eq3freq_oncc);
923                        EGs[EGs.size() - 1]->suEq1GainOnCC.SetCCs(pRegion->eg[i].eq1gain_oncc);
924                        EGs[EGs.size() - 1]->suEq2GainOnCC.SetCCs(pRegion->eg[i].eq2gain_oncc);
925                        EGs[EGs.size() - 1]->suEq3GainOnCC.SetCCs(pRegion->eg[i].eq3gain_oncc);
926                        EGs[EGs.size() - 1]->suEq1BwOnCC.SetCCs(pRegion->eg[i].eq1bw_oncc);
927                        EGs[EGs.size() - 1]->suEq2BwOnCC.SetCCs(pRegion->eg[i].eq2bw_oncc);
928                        EGs[EGs.size() - 1]->suEq3BwOnCC.SetCCs(pRegion->eg[i].eq3bw_oncc);
929                    }
930              } else { std::cerr << "Maximum number of EGs reached!" << std::endl; break; }              } else { std::cerr << "Maximum number of EGs reached!" << std::endl; break; }
931                            
932              if ( pRegion->eg[i].amplitude > 0 || !pRegion->eg[i].amplitude_oncc.empty() ||              if ( pRegion->eg[i].amplitude > 0 || !pRegion->eg[i].amplitude_oncc.empty() ||
# Line 924  namespace LinuxSampler { namespace sfz { Line 955  namespace LinuxSampler { namespace sfz {
955                  if(panEGs.size() < panEGs.capacity()) panEGs.add(EGs[EGs.size() - 1]);                  if(panEGs.size() < panEGs.capacity()) panEGs.add(EGs[EGs.size() - 1]);
956                  else std::cerr << "Maximum number of EGs reached!" << std::endl;                  else std::cerr << "Maximum number of EGs reached!" << std::endl;
957              }              }
958                
959                if (pRegion->eg[i].HasEq()) {
960                    if(eqEGs.size() < eqEGs.capacity()) eqEGs.add(EGs[EGs.size() - 1]);
961                    else std::cerr << "Maximum number of EGs reached!" << std::endl;
962                }
963          }          }
964                    
965          if (pRegion->ampeg_sustain == -1) {          if (pRegion->ampeg_sustain == -1) {
# Line 948  namespace LinuxSampler { namespace sfz { Line 984  namespace LinuxSampler { namespace sfz {
984                  LFOs[LFOs.size() - 1]->suPanOnCC.SetCCs(pRegion->lfos[i].pan_oncc);                  LFOs[LFOs.size() - 1]->suPanOnCC.SetCCs(pRegion->lfos[i].pan_oncc);
985                  LFOs[LFOs.size() - 1]->suCutoffOnCC.SetCCs(pRegion->lfos[i].cutoff_oncc);                  LFOs[LFOs.size() - 1]->suCutoffOnCC.SetCCs(pRegion->lfos[i].cutoff_oncc);
986                  LFOs[LFOs.size() - 1]->suResOnCC.SetCCs(pRegion->lfos[i].resonance_oncc);                  LFOs[LFOs.size() - 1]->suResOnCC.SetCCs(pRegion->lfos[i].resonance_oncc);
987                    if (pVoice->bEqSupport) {
988                        LFOs[LFOs.size() - 1]->suEq1FreqOnCC.SetCCs(pRegion->lfos[i].eq1freq_oncc);
989                        LFOs[LFOs.size() - 1]->suEq2FreqOnCC.SetCCs(pRegion->lfos[i].eq2freq_oncc);
990                        LFOs[LFOs.size() - 1]->suEq3FreqOnCC.SetCCs(pRegion->lfos[i].eq3freq_oncc);
991                        LFOs[LFOs.size() - 1]->suEq1GainOnCC.SetCCs(pRegion->lfos[i].eq1gain_oncc);
992                        LFOs[LFOs.size() - 1]->suEq2GainOnCC.SetCCs(pRegion->lfos[i].eq2gain_oncc);
993                        LFOs[LFOs.size() - 1]->suEq3GainOnCC.SetCCs(pRegion->lfos[i].eq3gain_oncc);
994                        LFOs[LFOs.size() - 1]->suEq1BwOnCC.SetCCs(pRegion->lfos[i].eq1bw_oncc);
995                        LFOs[LFOs.size() - 1]->suEq2BwOnCC.SetCCs(pRegion->lfos[i].eq2bw_oncc);
996                        LFOs[LFOs.size() - 1]->suEq3BwOnCC.SetCCs(pRegion->lfos[i].eq3bw_oncc);
997                    }
998              } else { std::cerr << "Maximum number of LFOs reached!" << std::endl; break; }              } else { std::cerr << "Maximum number of LFOs reached!" << std::endl; break; }
999                            
1000              if (pRegion->lfos[i].volume != 0 || !pRegion->lfos[i].volume_oncc.empty()) {              if (pRegion->lfos[i].volume != 0 || !pRegion->lfos[i].volume_oncc.empty()) {
# Line 974  namespace LinuxSampler { namespace sfz { Line 1021  namespace LinuxSampler { namespace sfz {
1021                  if(panLFOs.size() < panLFOs.capacity()) panLFOs.add(LFOs[LFOs.size() - 1]);                  if(panLFOs.size() < panLFOs.capacity()) panLFOs.add(LFOs[LFOs.size() - 1]);
1022                  else std::cerr << "Maximum number of LFOs reached!" << std::endl;                  else std::cerr << "Maximum number of LFOs reached!" << std::endl;
1023              }              }
1024                
1025                if (pRegion->lfos[i].HasEq()) {
1026                    if(eqLFOs.size() < eqLFOs.capacity()) eqLFOs.add(LFOs[LFOs.size() - 1]);
1027                    else std::cerr << "Maximum number of LFOs reached!" << std::endl;
1028                }
1029            }
1030            
1031            if (!pVoice->bEqSupport) {
1032                bHasEq = false;
1033            } else {
1034                suEq1GainOnCC.SetCCs(pRegion->eq1_gain_oncc);
1035                suEq2GainOnCC.SetCCs(pRegion->eq2_gain_oncc);
1036                suEq3GainOnCC.SetCCs(pRegion->eq3_gain_oncc);
1037                suEq1FreqOnCC.SetCCs(pRegion->eq1_freq_oncc);
1038                suEq2FreqOnCC.SetCCs(pRegion->eq2_freq_oncc);
1039                suEq3FreqOnCC.SetCCs(pRegion->eq3_freq_oncc);
1040                suEq1BwOnCC.SetCCs(pRegion->eq1_bw_oncc);
1041                suEq2BwOnCC.SetCCs(pRegion->eq2_bw_oncc);
1042                suEq3BwOnCC.SetCCs(pRegion->eq3_bw_oncc);
1043            
1044                bHasEq = pRegion->eq1_gain || pRegion->eq2_gain || pRegion->eq3_gain ||
1045                         pRegion->eq1_vel2gain || pRegion->eq2_vel2gain || pRegion->eq3_vel2gain ||
1046                         suEq1GainOnCC.HasCCs() || suEq2GainOnCC.HasCCs() || suEq3GainOnCC.HasCCs() ||
1047                         eqEGs.size() > 0 || eqLFOs.size() > 0;
1048          }          }
1049                    
1050          suPitchLFO.suDepthOnCC.SetCCs(pRegion->pitchlfo_depthcc);          suPitchLFO.suDepthOnCC.SetCCs(pRegion->pitchlfo_depthcc);
# Line 987  namespace LinuxSampler { namespace sfz { Line 1058  namespace LinuxSampler { namespace sfz {
1058                    
1059          Units.clear();          Units.clear();
1060                    
1061          Units.add(&suEq1GainOnCC);          EqUnitSupport::ImportUnits(this);
         Units.add(&suEq2GainOnCC);  
         Units.add(&suEq3GainOnCC);  
         Units.add(&suEq1FreqOnCC);  
         Units.add(&suEq2FreqOnCC);  
         Units.add(&suEq3FreqOnCC);  
         Units.add(&suEq1BwOnCC);  
         Units.add(&suEq2BwOnCC);  
         Units.add(&suEq3BwOnCC);  
1062                    
1063          Units.add(&suVolOnCC);          Units.add(&suVolOnCC);
1064          Units.add(&suPitchOnCC);          Units.add(&suPitchOnCC);
# Line 1029  namespace LinuxSampler { namespace sfz { Line 1092  namespace LinuxSampler { namespace sfz {
1092              Units.add(&(EGs[i]->suCutoffOnCC));              Units.add(&(EGs[i]->suCutoffOnCC));
1093              Units.add(&(EGs[i]->suResOnCC));              Units.add(&(EGs[i]->suResOnCC));
1094              Units.add(&(EGs[i]->suPanOnCC));              Units.add(&(EGs[i]->suPanOnCC));
1095                EGs[i]->ImportUnits(this); // class EqUnitSupport
1096          }          }
1097                    
1098          for (int i = 0; i < LFOs.size(); i++) {          for (int i = 0; i < LFOs.size(); i++) {
# Line 1040  namespace LinuxSampler { namespace sfz { Line 1104  namespace LinuxSampler { namespace sfz {
1104              Units.add(&(LFOs[i]->suPanOnCC));              Units.add(&(LFOs[i]->suPanOnCC));
1105              Units.add(&(LFOs[i]->suCutoffOnCC));              Units.add(&(LFOs[i]->suCutoffOnCC));
1106              Units.add(&(LFOs[i]->suResOnCC));              Units.add(&(LFOs[i]->suResOnCC));
1107                LFOs[i]->ImportUnits(this); // class EqUnitSupport
1108          }          }
1109                    
1110          Units.add(&suEndpoint);          Units.add(&suEndpoint);
# Line 1061  namespace LinuxSampler { namespace sfz { Line 1126  namespace LinuxSampler { namespace sfz {
1126              volEGs[i]->EG.enterFadeOutStage();              volEGs[i]->EG.enterFadeOutStage();
1127          }          }
1128      }      }
1129        
1130        void SfzSignalUnitRack::EnterFadeOutStage(int maxFadeOutSteps) {
1131            suVolEG.EG.enterFadeOutStage(maxFadeOutSteps);
1132            for (int i = 0; i < volEGs.size(); i++) {
1133                volEGs[i]->EG.enterFadeOutStage(maxFadeOutSteps);
1134            }
1135        }
1136    
1137      void SfzSignalUnitRack::Reset() {      void SfzSignalUnitRack::Reset() {
1138          suEq1GainOnCC.RemoveAllCCs();          EqUnitSupport::ResetUnits();
         suEq2GainOnCC.RemoveAllCCs();  
         suEq3GainOnCC.RemoveAllCCs();  
         suEq1FreqOnCC.RemoveAllCCs();  
         suEq2FreqOnCC.RemoveAllCCs();  
         suEq3FreqOnCC.RemoveAllCCs();  
         suEq1BwOnCC.RemoveAllCCs();  
         suEq2BwOnCC.RemoveAllCCs();  
         suEq3BwOnCC.RemoveAllCCs();  
1139                    
1140          suVolOnCC.RemoveAllCCs();          suVolOnCC.RemoveAllCCs();
1141          suPitchOnCC.RemoveAllCCs();          suPitchOnCC.RemoveAllCCs();
# Line 1094  namespace LinuxSampler { namespace sfz { Line 1158  namespace LinuxSampler { namespace sfz {
1158              EGs[i]->suCutoffOnCC.RemoveAllCCs();              EGs[i]->suCutoffOnCC.RemoveAllCCs();
1159              EGs[i]->suResOnCC.RemoveAllCCs();              EGs[i]->suResOnCC.RemoveAllCCs();
1160              EGs[i]->suPanOnCC.RemoveAllCCs();              EGs[i]->suPanOnCC.RemoveAllCCs();
1161                EGs[i]->ResetUnits(); // class EqUnitSupport
1162          }          }
1163                    
1164          for (int i = 0; i < LFOs.capacity(); i++) {          for (int i = 0; i < LFOs.capacity(); i++) {
# Line 1105  namespace LinuxSampler { namespace sfz { Line 1170  namespace LinuxSampler { namespace sfz {
1170              LFOs[i]->suPanOnCC.RemoveAllCCs();              LFOs[i]->suPanOnCC.RemoveAllCCs();
1171              LFOs[i]->suCutoffOnCC.RemoveAllCCs();              LFOs[i]->suCutoffOnCC.RemoveAllCCs();
1172              LFOs[i]->suResOnCC.RemoveAllCCs();              LFOs[i]->suResOnCC.RemoveAllCCs();
1173                LFOs[i]->ResetUnits(); // class EqUnitSupport
1174            }
1175        }
1176    
1177        void SfzSignalUnitRack::CalculateFadeOutCoeff(float FadeOutTime, float SampleRate) {
1178            suVolEG.EG.CalculateFadeOutCoeff(FadeOutTime, SampleRate);
1179            for (int i = 0; i < EGs.capacity(); i++) {
1180                EGs[i]->EG.CalculateFadeOutCoeff(FadeOutTime, SampleRate);
1181          }          }
1182      }      }
1183            
# Line 1117  namespace LinuxSampler { namespace sfz { Line 1190  namespace LinuxSampler { namespace sfz {
1190                    
1191          ::sfz::Region* const pRegion = pVoice->pRegion;          ::sfz::Region* const pRegion = pVoice->pRegion;
1192                    
1193          float dB = (suEq1GainOnCC.Active() ? suEq1GainOnCC.GetLevel() : 0) + pRegion->eq1_gain;          float dB1 = (suEq1GainOnCC.Active() ? suEq1GainOnCC.GetLevel() : 0) + pRegion->eq1_gain;
1194          pEqSupport->SetGain(0, dB);          float dB2 = (suEq2GainOnCC.Active() ? suEq2GainOnCC.GetLevel() : 0) + pRegion->eq2_gain;
1195                    float dB3 = (suEq3GainOnCC.Active() ? suEq3GainOnCC.GetLevel() : 0) + pRegion->eq3_gain;
1196          dB = (suEq2GainOnCC.Active() ? suEq2GainOnCC.GetLevel() : 0) + pRegion->eq2_gain;          
1197          pEqSupport->SetGain(1, dB);          float freq1 = (suEq1FreqOnCC.Active() ? suEq1FreqOnCC.GetLevel() : 0) + pRegion->eq1_freq;
1198                    float freq2 = (suEq2FreqOnCC.Active() ? suEq2FreqOnCC.GetLevel() : 0) + pRegion->eq2_freq;
1199          dB = (suEq3GainOnCC.Active() ? suEq3GainOnCC.GetLevel() : 0) + pRegion->eq3_gain;          float freq3 = (suEq3FreqOnCC.Active() ? suEq3FreqOnCC.GetLevel() : 0) + pRegion->eq3_freq;
1200          pEqSupport->SetGain(2, dB);          
1201                    float bw1 = (suEq1BwOnCC.Active() ? suEq1BwOnCC.GetLevel() : 0) + pRegion->eq1_bw;
1202          float freq = (suEq1FreqOnCC.Active() ? suEq1FreqOnCC.GetLevel() : 0) + pRegion->eq1_freq;          float bw2 = (suEq2BwOnCC.Active() ? suEq2BwOnCC.GetLevel() : 0) + pRegion->eq2_bw;
1203          pEqSupport->SetFreq(0, freq);          float bw3 = (suEq3BwOnCC.Active() ? suEq3BwOnCC.GetLevel() : 0) + pRegion->eq3_bw;
1204            
1205            const float vel = pVoice->MIDIVelocity() / 127.0f;
1206            
1207            dB1 += pRegion->eq1_vel2gain * vel;
1208            dB2 += pRegion->eq2_vel2gain * vel;
1209            dB3 += pRegion->eq3_vel2gain * vel;
1210            
1211            freq1 += pRegion->eq1_vel2freq * vel;
1212            freq2 += pRegion->eq2_vel2freq * vel;
1213            freq3 += pRegion->eq3_vel2freq * vel;
1214                    
1215          freq = (suEq2FreqOnCC.Active() ? suEq2FreqOnCC.GetLevel() : 0) + pRegion->eq2_freq;          for (int i = 0; i < eqEGs.size(); i++) {
1216          pEqSupport->SetFreq(1, freq);              EGv2Unit* eg = eqEGs[i];
1217                if (!eg->Active()) continue;
1218                
1219                float l = eg->GetLevel();
1220                dB1 += ((eg->suEq1GainOnCC.Active() ? eg->suEq1GainOnCC.GetLevel() : 0) + eg->pEGInfo->eq1gain) * l;
1221                dB2 += ((eg->suEq2GainOnCC.Active() ? eg->suEq2GainOnCC.GetLevel() : 0) + eg->pEGInfo->eq2gain) * l;
1222                dB3 += ((eg->suEq3GainOnCC.Active() ? eg->suEq3GainOnCC.GetLevel() : 0) + eg->pEGInfo->eq3gain) * l;
1223                
1224                freq1 += ((eg->suEq1FreqOnCC.Active() ? eg->suEq1FreqOnCC.GetLevel() : 0) + eg->pEGInfo->eq1freq) * l;
1225                freq2 += ((eg->suEq2FreqOnCC.Active() ? eg->suEq2FreqOnCC.GetLevel() : 0) + eg->pEGInfo->eq2freq) * l;
1226                freq3 += ((eg->suEq3FreqOnCC.Active() ? eg->suEq3FreqOnCC.GetLevel() : 0) + eg->pEGInfo->eq3freq) * l;
1227                
1228                bw1 += ((eg->suEq1BwOnCC.Active() ? eg->suEq1BwOnCC.GetLevel() : 0) + eg->pEGInfo->eq1bw) * l;
1229                bw2 += ((eg->suEq2BwOnCC.Active() ? eg->suEq2BwOnCC.GetLevel() : 0) + eg->pEGInfo->eq2bw) * l;
1230                bw3 += ((eg->suEq3BwOnCC.Active() ? eg->suEq3BwOnCC.GetLevel() : 0) + eg->pEGInfo->eq3bw) * l;
1231            }
1232                    
1233          freq = (suEq3FreqOnCC.Active() ? suEq3FreqOnCC.GetLevel() : 0) + pRegion->eq3_freq;          for (int i = 0; i < eqLFOs.size(); i++) {
1234          pEqSupport->SetFreq(2, freq);              LFOv2Unit* lfo = eqLFOs[i];
1235                if (!lfo->Active()) continue;
1236                
1237                float l = lfo->GetLevel();
1238                dB1 += ((lfo->suEq1GainOnCC.Active() ? lfo->suEq1GainOnCC.GetLevel() : 0) + lfo->pLfoInfo->eq1gain) * l;
1239                dB2 += ((lfo->suEq2GainOnCC.Active() ? lfo->suEq2GainOnCC.GetLevel() : 0) + lfo->pLfoInfo->eq2gain) * l;
1240                dB3 += ((lfo->suEq3GainOnCC.Active() ? lfo->suEq3GainOnCC.GetLevel() : 0) + lfo->pLfoInfo->eq3gain) * l;
1241                
1242                freq1 += ((lfo->suEq1FreqOnCC.Active() ? lfo->suEq1FreqOnCC.GetLevel() : 0) + lfo->pLfoInfo->eq1freq) * l;
1243                freq2 += ((lfo->suEq2FreqOnCC.Active() ? lfo->suEq2FreqOnCC.GetLevel() : 0) + lfo->pLfoInfo->eq2freq) * l;
1244                freq3 += ((lfo->suEq3FreqOnCC.Active() ? lfo->suEq3FreqOnCC.GetLevel() : 0) + lfo->pLfoInfo->eq3freq) * l;
1245                
1246                bw1 += ((lfo->suEq1BwOnCC.Active() ? lfo->suEq1BwOnCC.GetLevel() : 0) + lfo->pLfoInfo->eq1bw) * l;
1247                bw2 += ((lfo->suEq2BwOnCC.Active() ? lfo->suEq2BwOnCC.GetLevel() : 0) + lfo->pLfoInfo->eq2bw) * l;
1248                bw3 += ((lfo->suEq3BwOnCC.Active() ? lfo->suEq3BwOnCC.GetLevel() : 0) + lfo->pLfoInfo->eq3bw) * l;
1249            }
1250                    
1251          float bw = (suEq1BwOnCC.Active() ? suEq1BwOnCC.GetLevel() : 0) + pRegion->eq1_bw;          pEqSupport->SetGain(0, dB1);
1252          pEqSupport->SetBandwidth(0, bw);          pEqSupport->SetGain(1, dB2);
1253            pEqSupport->SetGain(2, dB3);
1254                    
1255          bw = (suEq2BwOnCC.Active() ? suEq2BwOnCC.GetLevel() : 0) + pRegion->eq2_bw;          pEqSupport->SetFreq(0, freq1);
1256          pEqSupport->SetBandwidth(1, bw);          pEqSupport->SetFreq(1, freq2);
1257            pEqSupport->SetFreq(2, freq3);
1258                    
1259          bw = (suEq3BwOnCC.Active() ? suEq3BwOnCC.GetLevel() : 0) + pRegion->eq3_bw;          pEqSupport->SetBandwidth(0, bw1);
1260          pEqSupport->SetBandwidth(2, bw);          pEqSupport->SetBandwidth(1, bw2);
1261            pEqSupport->SetBandwidth(2, bw3);
1262        }
1263        
1264        EqUnitSupport::EqUnitSupport(SfzSignalUnitRack* pRack, Voice* pVoice)
1265            : suEq1GainOnCC(pRack), suEq2GainOnCC(pRack), suEq3GainOnCC(pRack),
1266              suEq1FreqOnCC(pRack), suEq2FreqOnCC(pRack), suEq3FreqOnCC(pRack),
1267              suEq1BwOnCC(pRack), suEq2BwOnCC(pRack), suEq3BwOnCC(pRack)
1268        {
1269            SetVoice(pVoice);
1270        }
1271        
1272        void EqUnitSupport::SetVoice(Voice* pVoice) {
1273            suEq1GainOnCC.pVoice = suEq2GainOnCC.pVoice = suEq3GainOnCC.pVoice = pVoice;
1274            suEq1FreqOnCC.pVoice = suEq2FreqOnCC.pVoice = suEq3FreqOnCC.pVoice = pVoice;
1275            suEq1BwOnCC.pVoice = suEq2BwOnCC.pVoice = suEq3BwOnCC.pVoice = pVoice;
1276        }
1277        
1278        void EqUnitSupport::ImportUnits(SfzSignalUnitRack* pRack) {
1279            if (suEq1GainOnCC.HasCCs()) pRack->Units.add(&suEq1GainOnCC);
1280            if (suEq2GainOnCC.HasCCs()) pRack->Units.add(&suEq2GainOnCC);
1281            if (suEq3GainOnCC.HasCCs()) pRack->Units.add(&suEq3GainOnCC);
1282            if (suEq1FreqOnCC.HasCCs()) pRack->Units.add(&suEq1FreqOnCC);
1283            if (suEq2FreqOnCC.HasCCs()) pRack->Units.add(&suEq2FreqOnCC);
1284            if (suEq3FreqOnCC.HasCCs()) pRack->Units.add(&suEq3FreqOnCC);
1285            if (suEq1BwOnCC.HasCCs()) pRack->Units.add(&suEq1BwOnCC);
1286            if (suEq2BwOnCC.HasCCs()) pRack->Units.add(&suEq2BwOnCC);
1287            if (suEq3BwOnCC.HasCCs()) pRack->Units.add(&suEq3BwOnCC);
1288        }
1289        
1290        void EqUnitSupport::ResetUnits() {
1291            suEq1GainOnCC.RemoveAllCCs();
1292            suEq2GainOnCC.RemoveAllCCs();
1293            suEq3GainOnCC.RemoveAllCCs();
1294            suEq1FreqOnCC.RemoveAllCCs();
1295            suEq2FreqOnCC.RemoveAllCCs();
1296            suEq3FreqOnCC.RemoveAllCCs();
1297            suEq1BwOnCC.RemoveAllCCs();
1298            suEq2BwOnCC.RemoveAllCCs();
1299            suEq3BwOnCC.RemoveAllCCs();
1300        }
1301        
1302        void EqUnitSupport::InitCCLists(Pool<CCSignalUnit::CC>* pCCPool, Pool<Smoother>* pSmootherPool) {
1303            suEq1GainOnCC.InitCCList(pCCPool, pSmootherPool);
1304            suEq2GainOnCC.InitCCList(pCCPool, pSmootherPool);
1305            suEq3GainOnCC.InitCCList(pCCPool, pSmootherPool);
1306            suEq1FreqOnCC.InitCCList(pCCPool, pSmootherPool);
1307            suEq2FreqOnCC.InitCCList(pCCPool, pSmootherPool);
1308            suEq3FreqOnCC.InitCCList(pCCPool, pSmootherPool);
1309            suEq1BwOnCC.InitCCList(pCCPool, pSmootherPool);
1310            suEq2BwOnCC.InitCCList(pCCPool, pSmootherPool);
1311            suEq3BwOnCC.InitCCList(pCCPool, pSmootherPool);
1312      }      }
1313            
1314  }} // namespace LinuxSampler::sfz  }} // namespace LinuxSampler::sfz

Legend:
Removed from v.2296  
changed lines
  Added in v.3561

  ViewVC Help
Powered by ViewVC