/[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 2382 by persson, Sun Dec 2 16:30:42 2012 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 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 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 248  namespace LinuxSampler { namespace sfz { Line 248  namespace LinuxSampler { namespace sfz {
248                    
249          EG.trigger (          EG.trigger (
250              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,
251              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
252          );          );
253      }      }
254            
# Line 287  namespace LinuxSampler { namespace sfz { Line 287  namespace LinuxSampler { namespace sfz {
287                            
288              if (f != 0) {              if (f != 0) {
289                  suFadeEG.uiDelayTrigger = pLfoInfo->delay * GetSampleRate();                  suFadeEG.uiDelayTrigger = pLfoInfo->delay * GetSampleRate();
290                  suFadeEG.EG.trigger(0, f, 0, 0, 1000, 0, GetSampleRate());                  suFadeEG.EG.trigger(0, f, 0, 0, 1000, 0, GetSampleRate(), false);
291              }              }
292          }          }
293      }      }
# Line 311  namespace LinuxSampler { namespace sfz { Line 311  namespace LinuxSampler { namespace sfz {
311            
312            
313      LFOv2Unit::LFOv2Unit(SfzSignalUnitRack* rack)      LFOv2Unit::LFOv2Unit(SfzSignalUnitRack* rack)
314          : 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),
315            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),
316            suVolOnCC(rack), suPitchOnCC(rack), suPanOnCC(rack), suCutoffOnCC(rack), suResOnCC(rack)            suVolOnCC(rack), suPitchOnCC(rack), suPanOnCC(rack), suCutoffOnCC(rack), suResOnCC(rack)
317      {      {
# Line 488  namespace LinuxSampler { namespace sfz { Line 488  namespace LinuxSampler { namespace sfz {
488                    
489      }      }
490            
491        float EndpointUnit::GetInfluence(::sfz::Array< ::sfz::optional<float> >& cc) {
492            float f = 0;
493            for (int i = 0; i < 128; i++) {
494                if (cc[i]) {
495                    f += (pVoice->GetControllerValue(i) / 127.0f) * (*cc[i]);
496                }
497            }
498            return f;
499        }
500        
501        float EndpointUnit::GetInfluence(::sfz::Array< ::sfz::optional<int> >& cc) {
502            float f = 0;
503            for (int i = 0; i < 128; i++) {
504                if (cc[i]) {
505                    f += (pVoice->GetControllerValue(i) / 127.0f) * (*cc[i]);
506                }
507            }
508            return f;
509        }
510        
511      SfzSignalUnitRack* const EndpointUnit::GetRack() {      SfzSignalUnitRack* const EndpointUnit::GetRack() {
512          return static_cast<SfzSignalUnitRack* const>(pRack);          return static_cast<SfzSignalUnitRack* const>(pRack);
513      }      }
514            
515      void EndpointUnit::Trigger() {      void EndpointUnit::Trigger() {
516            uiDelayTrigger = (uint)GetInfluence(pVoice->pRegion->delay_samples_oncc);
517            if (pVoice->pRegion->delay_samples) uiDelayTrigger += *pVoice->pRegion->delay_samples;
518            
519            if (pVoice->pRegion->delay) {
520                /* here we use the device sample rate */
521                uiDelayTrigger += (uint)( (*pVoice->pRegion->delay) * pVoice->GetSampleRate() );
522            }
523            
524            if (pVoice->pRegion->delay_random) {
525                float r = pVoice->GetEngine()->Random();
526                uiDelayTrigger += (uint)( r * (*pVoice->pRegion->delay_random) * pVoice->GetSampleRate() );
527            }
528            
529            uiDelayTrigger += (uint)(GetInfluence(pVoice->pRegion->delay_oncc) * pVoice->GetSampleRate());
530            
531          float xfInVelCoeff = 1;          float xfInVelCoeff = 1;
532                    
533          if (pVoice->MIDIVelocity <= pVoice->pRegion->xfin_lovel) {          if (pVoice->MIDIVelocity <= pVoice->pRegion->xfin_lovel) {
# Line 564  namespace LinuxSampler { namespace sfz { Line 599  namespace LinuxSampler { namespace sfz {
599      }      }
600            
601      bool EndpointUnit::Active() {      bool EndpointUnit::Active() {
602            if (pRack->isReleaseStageEntered() && uiDelayTrigger) {
603                return false; // The key was released before the delay end, so the voice won't play at all.
604            }
605            
606          if (GetRack()->suVolEG.Active()) return true;          if (GetRack()->suVolEG.Active()) return true;
607                    
608          bool b = false;          bool b = false;
# Line 732  namespace LinuxSampler { namespace sfz { Line 771  namespace LinuxSampler { namespace sfz {
771              pan += lfo->GetLevel() * (lfo->pLfoInfo->pan + f);              pan += lfo->GetLevel() * (lfo->pLfoInfo->pan + f);
772          }          }
773                    
         if(pan < -100) return -100;  
         if(pan >  100) return  100;  
           
774          return pan;          return pan;
775      }      }
776            
777            
778      SfzSignalUnitRack::SfzSignalUnitRack(Voice* voice)      SfzSignalUnitRack::SfzSignalUnitRack(Voice* voice)
779          : SignalUnitRack(MaxUnitCount), pVoice(voice), suEndpoint(this), suVolEG(this), suFilEG(this), suPitchEG(this),          : SignalUnitRack(MaxUnitCount), EqUnitSupport(this, voice), pVoice(voice),
780          EGs(maxEgCount), volEGs(maxEgCount), pitchEGs(maxEgCount), filEGs(maxEgCount), resEGs(maxEgCount), panEGs(maxEgCount),          suEndpoint(this), suVolEG(this), suFilEG(this), suPitchEG(this),
781          suEq1GainOnCC(this), suEq2GainOnCC(this), suEq3GainOnCC(this),          EGs(maxEgCount), volEGs(maxEgCount), pitchEGs(maxEgCount), filEGs(maxEgCount),
782          suEq1FreqOnCC(this), suEq2FreqOnCC(this), suEq3FreqOnCC(this),          resEGs(maxEgCount), panEGs(maxEgCount), eqEGs(maxEgCount),
         suEq1BwOnCC(this), suEq2BwOnCC(this), suEq3BwOnCC(this),  
783          suVolOnCC(this), suPitchOnCC(this), suCutoffOnCC(this), suResOnCC(this),          suVolOnCC(this), suPitchOnCC(this), suCutoffOnCC(this), suResOnCC(this),
784          suAmpLFO(this), suPitchLFO(this), suFilLFO(this),          suAmpLFO(this), suPitchLFO(this), suFilLFO(this),
785          LFOs(maxLfoCount), volLFOs(maxLfoCount), pitchLFOs(maxLfoCount),          LFOs(maxLfoCount), volLFOs(maxLfoCount), pitchLFOs(maxLfoCount),
786          filLFOs(maxLfoCount), resLFOs(maxLfoCount), panLFOs(maxLfoCount)          filLFOs(maxLfoCount), resLFOs(maxLfoCount), panLFOs(maxLfoCount), eqLFOs(maxLfoCount)
787      {      {
788          suEndpoint.pVoice = suEndpoint.suXFInCC.pVoice = suEndpoint.suXFOutCC.pVoice = suEndpoint.suPanOnCC.pVoice = voice;          suEndpoint.pVoice = suEndpoint.suXFInCC.pVoice = suEndpoint.suXFOutCC.pVoice = suEndpoint.suPanOnCC.pVoice = voice;
789          suVolEG.pVoice = suFilEG.pVoice = suPitchEG.pVoice = voice;          suVolEG.pVoice = suFilEG.pVoice = suPitchEG.pVoice = voice;
790          suAmpLFO.pVoice = suPitchLFO.pVoice = suFilLFO.pVoice = voice;          suAmpLFO.pVoice = suPitchLFO.pVoice = suFilLFO.pVoice = voice;
791                    
         suEq1GainOnCC.pVoice = suEq2GainOnCC.pVoice = suEq3GainOnCC.pVoice = voice;  
         suEq1FreqOnCC.pVoice = suEq2FreqOnCC.pVoice = suEq3FreqOnCC.pVoice = voice;  
         suEq1BwOnCC.pVoice = suEq2BwOnCC.pVoice = suEq3BwOnCC.pVoice = voice;  
           
792          suVolOnCC.pVoice = suPitchOnCC.pVoice = suCutoffOnCC.pVoice = suResOnCC.pVoice = voice;          suVolOnCC.pVoice = suPitchOnCC.pVoice = suCutoffOnCC.pVoice = suResOnCC.pVoice = voice;
793          suPitchLFO.suDepthOnCC.pVoice = suPitchLFO.suFadeEG.pVoice = suPitchLFO.suFreqOnCC.pVoice = voice;          suPitchLFO.suDepthOnCC.pVoice = suPitchLFO.suFadeEG.pVoice = suPitchLFO.suFreqOnCC.pVoice = voice;
794          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 803  namespace LinuxSampler { namespace sfz {
803              EGs[i]->suCutoffOnCC.pVoice = voice;              EGs[i]->suCutoffOnCC.pVoice = voice;
804              EGs[i]->suResOnCC.pVoice = voice;              EGs[i]->suResOnCC.pVoice = voice;
805              EGs[i]->suPanOnCC.pVoice = voice;              EGs[i]->suPanOnCC.pVoice = voice;
806                EGs[i]->SetVoice(voice); // class EqUnitSupport
807          }          }
808                    
809          for (int i = 0; i < LFOs.capacity(); i++) {          for (int i = 0; i < LFOs.capacity(); i++) {
# Line 786  namespace LinuxSampler { namespace sfz { Line 818  namespace LinuxSampler { namespace sfz {
818              LFOs[i]->suPanOnCC.pVoice = voice;              LFOs[i]->suPanOnCC.pVoice = voice;
819              LFOs[i]->suCutoffOnCC.pVoice = voice;              LFOs[i]->suCutoffOnCC.pVoice = voice;
820              LFOs[i]->suResOnCC.pVoice = voice;              LFOs[i]->suResOnCC.pVoice = voice;
821                LFOs[i]->SetVoice(voice); // class EqUnitSupport
822          }          }
823      }      }
824            
# Line 803  namespace LinuxSampler { namespace sfz { Line 836  namespace LinuxSampler { namespace sfz {
836          Pool<CCSignalUnit::CC>* pCCPool = pVoice->pEngine->pCCPool;          Pool<CCSignalUnit::CC>* pCCPool = pVoice->pEngine->pCCPool;
837          Pool<Smoother>* pSmootherPool = pVoice->pEngine->pSmootherPool;          Pool<Smoother>* pSmootherPool = pVoice->pEngine->pSmootherPool;
838                    
839          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);  
840                    
841          suVolOnCC.InitCCList(pCCPool, pSmootherPool);          suVolOnCC.InitCCList(pCCPool, pSmootherPool);
842          suPitchOnCC.InitCCList(pCCPool, pSmootherPool);          suPitchOnCC.InitCCList(pCCPool, pSmootherPool);
# Line 834  namespace LinuxSampler { namespace sfz { Line 859  namespace LinuxSampler { namespace sfz {
859              EGs[i]->suCutoffOnCC.InitCCList(pCCPool, pSmootherPool);              EGs[i]->suCutoffOnCC.InitCCList(pCCPool, pSmootherPool);
860              EGs[i]->suResOnCC.InitCCList(pCCPool, pSmootherPool);              EGs[i]->suResOnCC.InitCCList(pCCPool, pSmootherPool);
861              EGs[i]->suPanOnCC.InitCCList(pCCPool, pSmootherPool);              EGs[i]->suPanOnCC.InitCCList(pCCPool, pSmootherPool);
862                EGs[i]->InitCCLists(pCCPool, pSmootherPool); // class EqUnitSupport
863          }          }
864                    
865          for (int i = 0; i < LFOs.capacity(); i++) {          for (int i = 0; i < LFOs.capacity(); i++) {
# Line 845  namespace LinuxSampler { namespace sfz { Line 871  namespace LinuxSampler { namespace sfz {
871              LFOs[i]->suPanOnCC.InitCCList(pCCPool, pSmootherPool);              LFOs[i]->suPanOnCC.InitCCList(pCCPool, pSmootherPool);
872              LFOs[i]->suCutoffOnCC.InitCCList(pCCPool, pSmootherPool);              LFOs[i]->suCutoffOnCC.InitCCList(pCCPool, pSmootherPool);
873              LFOs[i]->suResOnCC.InitCCList(pCCPool, pSmootherPool);              LFOs[i]->suResOnCC.InitCCList(pCCPool, pSmootherPool);
874                LFOs[i]->InitCCLists(pCCPool, pSmootherPool); // class EqUnitSupport
875          }          }
876      }      }
877            
# Line 855  namespace LinuxSampler { namespace sfz { Line 882  namespace LinuxSampler { namespace sfz {
882          filEGs.clear();          filEGs.clear();
883          resEGs.clear();          resEGs.clear();
884          panEGs.clear();          panEGs.clear();
885            eqEGs.clear();
886                    
887          LFOs.clear();          LFOs.clear();
888          volLFOs.clear();          volLFOs.clear();
# Line 862  namespace LinuxSampler { namespace sfz { Line 890  namespace LinuxSampler { namespace sfz {
890          filLFOs.clear();          filLFOs.clear();
891          resLFOs.clear();          resLFOs.clear();
892          panLFOs.clear();          panLFOs.clear();
893            eqLFOs.clear();
894                    
895          ::sfz::Region* const pRegion = pVoice->pRegion;          ::sfz::Region* const pRegion = pVoice->pRegion;
896                    
         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();  
           
897          suVolOnCC.SetCCs(pRegion->volume_oncc);          suVolOnCC.SetCCs(pRegion->volume_oncc);
898          suPitchOnCC.SetCCs(pRegion->pitch_oncc);          suPitchOnCC.SetCCs(pRegion->pitch_oncc);
899          suCutoffOnCC.SetCCs(pRegion->cutoff_oncc);          suCutoffOnCC.SetCCs(pRegion->cutoff_oncc);
# Line 896  namespace LinuxSampler { namespace sfz { Line 912  namespace LinuxSampler { namespace sfz {
912                  EGs[EGs.size() - 1]->suCutoffOnCC.SetCCs(pRegion->eg[i].cutoff_oncc);                  EGs[EGs.size() - 1]->suCutoffOnCC.SetCCs(pRegion->eg[i].cutoff_oncc);
913                  EGs[EGs.size() - 1]->suResOnCC.SetCCs(pRegion->eg[i].resonance_oncc);                  EGs[EGs.size() - 1]->suResOnCC.SetCCs(pRegion->eg[i].resonance_oncc);
914                  EGs[EGs.size() - 1]->suPanOnCC.SetCCs(pRegion->eg[i].pan_oncc);                  EGs[EGs.size() - 1]->suPanOnCC.SetCCs(pRegion->eg[i].pan_oncc);
915                    if (pVoice->bEqSupport) {
916                        EGs[EGs.size() - 1]->suEq1FreqOnCC.SetCCs(pRegion->eg[i].eq1freq_oncc);
917                        EGs[EGs.size() - 1]->suEq2FreqOnCC.SetCCs(pRegion->eg[i].eq2freq_oncc);
918                        EGs[EGs.size() - 1]->suEq3FreqOnCC.SetCCs(pRegion->eg[i].eq3freq_oncc);
919                        EGs[EGs.size() - 1]->suEq1GainOnCC.SetCCs(pRegion->eg[i].eq1gain_oncc);
920                        EGs[EGs.size() - 1]->suEq2GainOnCC.SetCCs(pRegion->eg[i].eq2gain_oncc);
921                        EGs[EGs.size() - 1]->suEq3GainOnCC.SetCCs(pRegion->eg[i].eq3gain_oncc);
922                        EGs[EGs.size() - 1]->suEq1BwOnCC.SetCCs(pRegion->eg[i].eq1bw_oncc);
923                        EGs[EGs.size() - 1]->suEq2BwOnCC.SetCCs(pRegion->eg[i].eq2bw_oncc);
924                        EGs[EGs.size() - 1]->suEq3BwOnCC.SetCCs(pRegion->eg[i].eq3bw_oncc);
925                    }
926              } else { std::cerr << "Maximum number of EGs reached!" << std::endl; break; }              } else { std::cerr << "Maximum number of EGs reached!" << std::endl; break; }
927                            
928              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 951  namespace LinuxSampler { namespace sfz {
951                  if(panEGs.size() < panEGs.capacity()) panEGs.add(EGs[EGs.size() - 1]);                  if(panEGs.size() < panEGs.capacity()) panEGs.add(EGs[EGs.size() - 1]);
952                  else std::cerr << "Maximum number of EGs reached!" << std::endl;                  else std::cerr << "Maximum number of EGs reached!" << std::endl;
953              }              }
954                
955                if (pRegion->eg[i].HasEq()) {
956                    if(eqEGs.size() < eqEGs.capacity()) eqEGs.add(EGs[EGs.size() - 1]);
957                    else std::cerr << "Maximum number of EGs reached!" << std::endl;
958                }
959          }          }
960                    
961          if (pRegion->ampeg_sustain == -1) {          if (pRegion->ampeg_sustain == -1) {
# Line 948  namespace LinuxSampler { namespace sfz { Line 980  namespace LinuxSampler { namespace sfz {
980                  LFOs[LFOs.size() - 1]->suPanOnCC.SetCCs(pRegion->lfos[i].pan_oncc);                  LFOs[LFOs.size() - 1]->suPanOnCC.SetCCs(pRegion->lfos[i].pan_oncc);
981                  LFOs[LFOs.size() - 1]->suCutoffOnCC.SetCCs(pRegion->lfos[i].cutoff_oncc);                  LFOs[LFOs.size() - 1]->suCutoffOnCC.SetCCs(pRegion->lfos[i].cutoff_oncc);
982                  LFOs[LFOs.size() - 1]->suResOnCC.SetCCs(pRegion->lfos[i].resonance_oncc);                  LFOs[LFOs.size() - 1]->suResOnCC.SetCCs(pRegion->lfos[i].resonance_oncc);
983                    if (pVoice->bEqSupport) {
984                        LFOs[LFOs.size() - 1]->suEq1FreqOnCC.SetCCs(pRegion->lfos[i].eq1freq_oncc);
985                        LFOs[LFOs.size() - 1]->suEq2FreqOnCC.SetCCs(pRegion->lfos[i].eq2freq_oncc);
986                        LFOs[LFOs.size() - 1]->suEq3FreqOnCC.SetCCs(pRegion->lfos[i].eq3freq_oncc);
987                        LFOs[LFOs.size() - 1]->suEq1GainOnCC.SetCCs(pRegion->lfos[i].eq1gain_oncc);
988                        LFOs[LFOs.size() - 1]->suEq2GainOnCC.SetCCs(pRegion->lfos[i].eq2gain_oncc);
989                        LFOs[LFOs.size() - 1]->suEq3GainOnCC.SetCCs(pRegion->lfos[i].eq3gain_oncc);
990                        LFOs[LFOs.size() - 1]->suEq1BwOnCC.SetCCs(pRegion->lfos[i].eq1bw_oncc);
991                        LFOs[LFOs.size() - 1]->suEq2BwOnCC.SetCCs(pRegion->lfos[i].eq2bw_oncc);
992                        LFOs[LFOs.size() - 1]->suEq3BwOnCC.SetCCs(pRegion->lfos[i].eq3bw_oncc);
993                    }
994              } else { std::cerr << "Maximum number of LFOs reached!" << std::endl; break; }              } else { std::cerr << "Maximum number of LFOs reached!" << std::endl; break; }
995                            
996              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 1017  namespace LinuxSampler { namespace sfz {
1017                  if(panLFOs.size() < panLFOs.capacity()) panLFOs.add(LFOs[LFOs.size() - 1]);                  if(panLFOs.size() < panLFOs.capacity()) panLFOs.add(LFOs[LFOs.size() - 1]);
1018                  else std::cerr << "Maximum number of LFOs reached!" << std::endl;                  else std::cerr << "Maximum number of LFOs reached!" << std::endl;
1019              }              }
1020                
1021                if (pRegion->lfos[i].HasEq()) {
1022                    if(eqLFOs.size() < eqLFOs.capacity()) eqLFOs.add(LFOs[LFOs.size() - 1]);
1023                    else std::cerr << "Maximum number of LFOs reached!" << std::endl;
1024                }
1025            }
1026            
1027            if (!pVoice->bEqSupport) {
1028                bHasEq = false;
1029            } else {
1030                suEq1GainOnCC.SetCCs(pRegion->eq1_gain_oncc);
1031                suEq2GainOnCC.SetCCs(pRegion->eq2_gain_oncc);
1032                suEq3GainOnCC.SetCCs(pRegion->eq3_gain_oncc);
1033                suEq1FreqOnCC.SetCCs(pRegion->eq1_freq_oncc);
1034                suEq2FreqOnCC.SetCCs(pRegion->eq2_freq_oncc);
1035                suEq3FreqOnCC.SetCCs(pRegion->eq3_freq_oncc);
1036                suEq1BwOnCC.SetCCs(pRegion->eq1_bw_oncc);
1037                suEq2BwOnCC.SetCCs(pRegion->eq2_bw_oncc);
1038                suEq3BwOnCC.SetCCs(pRegion->eq3_bw_oncc);
1039            
1040                bHasEq = pRegion->eq1_gain || pRegion->eq2_gain || pRegion->eq3_gain ||
1041                         pRegion->eq1_vel2gain || pRegion->eq2_vel2gain || pRegion->eq3_vel2gain ||
1042                         suEq1GainOnCC.HasCCs() || suEq2GainOnCC.HasCCs() || suEq3GainOnCC.HasCCs() ||
1043                         eqEGs.size() > 0 || eqLFOs.size() > 0;
1044          }          }
1045                    
1046          suPitchLFO.suDepthOnCC.SetCCs(pRegion->pitchlfo_depthcc);          suPitchLFO.suDepthOnCC.SetCCs(pRegion->pitchlfo_depthcc);
# Line 987  namespace LinuxSampler { namespace sfz { Line 1054  namespace LinuxSampler { namespace sfz {
1054                    
1055          Units.clear();          Units.clear();
1056                    
1057          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);  
1058                    
1059          Units.add(&suVolOnCC);          Units.add(&suVolOnCC);
1060          Units.add(&suPitchOnCC);          Units.add(&suPitchOnCC);
# Line 1029  namespace LinuxSampler { namespace sfz { Line 1088  namespace LinuxSampler { namespace sfz {
1088              Units.add(&(EGs[i]->suCutoffOnCC));              Units.add(&(EGs[i]->suCutoffOnCC));
1089              Units.add(&(EGs[i]->suResOnCC));              Units.add(&(EGs[i]->suResOnCC));
1090              Units.add(&(EGs[i]->suPanOnCC));              Units.add(&(EGs[i]->suPanOnCC));
1091                EGs[i]->ImportUnits(this); // class EqUnitSupport
1092          }          }
1093                    
1094          for (int i = 0; i < LFOs.size(); i++) {          for (int i = 0; i < LFOs.size(); i++) {
# Line 1040  namespace LinuxSampler { namespace sfz { Line 1100  namespace LinuxSampler { namespace sfz {
1100              Units.add(&(LFOs[i]->suPanOnCC));              Units.add(&(LFOs[i]->suPanOnCC));
1101              Units.add(&(LFOs[i]->suCutoffOnCC));              Units.add(&(LFOs[i]->suCutoffOnCC));
1102              Units.add(&(LFOs[i]->suResOnCC));              Units.add(&(LFOs[i]->suResOnCC));
1103                LFOs[i]->ImportUnits(this); // class EqUnitSupport
1104          }          }
1105                    
1106          Units.add(&suEndpoint);          Units.add(&suEndpoint);
# Line 1061  namespace LinuxSampler { namespace sfz { Line 1122  namespace LinuxSampler { namespace sfz {
1122              volEGs[i]->EG.enterFadeOutStage();              volEGs[i]->EG.enterFadeOutStage();
1123          }          }
1124      }      }
1125        
1126        void SfzSignalUnitRack::EnterFadeOutStage(int maxFadeOutSteps) {
1127            suVolEG.EG.enterFadeOutStage(maxFadeOutSteps);
1128            for (int i = 0; i < volEGs.size(); i++) {
1129                volEGs[i]->EG.enterFadeOutStage(maxFadeOutSteps);
1130            }
1131        }
1132    
1133      void SfzSignalUnitRack::Reset() {      void SfzSignalUnitRack::Reset() {
1134          suEq1GainOnCC.RemoveAllCCs();          EqUnitSupport::ResetUnits();
         suEq2GainOnCC.RemoveAllCCs();  
         suEq3GainOnCC.RemoveAllCCs();  
         suEq1FreqOnCC.RemoveAllCCs();  
         suEq2FreqOnCC.RemoveAllCCs();  
         suEq3FreqOnCC.RemoveAllCCs();  
         suEq1BwOnCC.RemoveAllCCs();  
         suEq2BwOnCC.RemoveAllCCs();  
         suEq3BwOnCC.RemoveAllCCs();  
1135                    
1136          suVolOnCC.RemoveAllCCs();          suVolOnCC.RemoveAllCCs();
1137          suPitchOnCC.RemoveAllCCs();          suPitchOnCC.RemoveAllCCs();
# Line 1094  namespace LinuxSampler { namespace sfz { Line 1154  namespace LinuxSampler { namespace sfz {
1154              EGs[i]->suCutoffOnCC.RemoveAllCCs();              EGs[i]->suCutoffOnCC.RemoveAllCCs();
1155              EGs[i]->suResOnCC.RemoveAllCCs();              EGs[i]->suResOnCC.RemoveAllCCs();
1156              EGs[i]->suPanOnCC.RemoveAllCCs();              EGs[i]->suPanOnCC.RemoveAllCCs();
1157                EGs[i]->ResetUnits(); // class EqUnitSupport
1158          }          }
1159                    
1160          for (int i = 0; i < LFOs.capacity(); i++) {          for (int i = 0; i < LFOs.capacity(); i++) {
# Line 1105  namespace LinuxSampler { namespace sfz { Line 1166  namespace LinuxSampler { namespace sfz {
1166              LFOs[i]->suPanOnCC.RemoveAllCCs();              LFOs[i]->suPanOnCC.RemoveAllCCs();
1167              LFOs[i]->suCutoffOnCC.RemoveAllCCs();              LFOs[i]->suCutoffOnCC.RemoveAllCCs();
1168              LFOs[i]->suResOnCC.RemoveAllCCs();              LFOs[i]->suResOnCC.RemoveAllCCs();
1169                LFOs[i]->ResetUnits(); // class EqUnitSupport
1170            }
1171        }
1172    
1173        void SfzSignalUnitRack::CalculateFadeOutCoeff(float FadeOutTime, float SampleRate) {
1174            suVolEG.EG.CalculateFadeOutCoeff(FadeOutTime, SampleRate);
1175            for (int i = 0; i < EGs.capacity(); i++) {
1176                EGs[i]->EG.CalculateFadeOutCoeff(FadeOutTime, SampleRate);
1177          }          }
1178      }      }
1179            
# Line 1117  namespace LinuxSampler { namespace sfz { Line 1186  namespace LinuxSampler { namespace sfz {
1186                    
1187          ::sfz::Region* const pRegion = pVoice->pRegion;          ::sfz::Region* const pRegion = pVoice->pRegion;
1188                    
1189          float dB = (suEq1GainOnCC.Active() ? suEq1GainOnCC.GetLevel() : 0) + pRegion->eq1_gain;          float dB1 = (suEq1GainOnCC.Active() ? suEq1GainOnCC.GetLevel() : 0) + pRegion->eq1_gain;
1190          pEqSupport->SetGain(0, dB);          float dB2 = (suEq2GainOnCC.Active() ? suEq2GainOnCC.GetLevel() : 0) + pRegion->eq2_gain;
1191                    float dB3 = (suEq3GainOnCC.Active() ? suEq3GainOnCC.GetLevel() : 0) + pRegion->eq3_gain;
1192          dB = (suEq2GainOnCC.Active() ? suEq2GainOnCC.GetLevel() : 0) + pRegion->eq2_gain;          
1193          pEqSupport->SetGain(1, dB);          float freq1 = (suEq1FreqOnCC.Active() ? suEq1FreqOnCC.GetLevel() : 0) + pRegion->eq1_freq;
1194            float freq2 = (suEq2FreqOnCC.Active() ? suEq2FreqOnCC.GetLevel() : 0) + pRegion->eq2_freq;
1195            float freq3 = (suEq3FreqOnCC.Active() ? suEq3FreqOnCC.GetLevel() : 0) + pRegion->eq3_freq;
1196            
1197            float bw1 = (suEq1BwOnCC.Active() ? suEq1BwOnCC.GetLevel() : 0) + pRegion->eq1_bw;
1198            float bw2 = (suEq2BwOnCC.Active() ? suEq2BwOnCC.GetLevel() : 0) + pRegion->eq2_bw;
1199            float bw3 = (suEq3BwOnCC.Active() ? suEq3BwOnCC.GetLevel() : 0) + pRegion->eq3_bw;
1200            
1201            const float vel = pVoice->MIDIVelocity / 127.0f;
1202            
1203            dB1 += pRegion->eq1_vel2gain * vel;
1204            dB2 += pRegion->eq2_vel2gain * vel;
1205            dB3 += pRegion->eq3_vel2gain * vel;
1206            
1207            freq1 += pRegion->eq1_vel2freq * vel;
1208            freq2 += pRegion->eq2_vel2freq * vel;
1209            freq3 += pRegion->eq3_vel2freq * vel;
1210                    
1211          dB = (suEq3GainOnCC.Active() ? suEq3GainOnCC.GetLevel() : 0) + pRegion->eq3_gain;          for (int i = 0; i < eqEGs.size(); i++) {
1212          pEqSupport->SetGain(2, dB);              EGv2Unit* eg = eqEGs[i];
1213                        if (!eg->Active()) continue;
1214          float freq = (suEq1FreqOnCC.Active() ? suEq1FreqOnCC.GetLevel() : 0) + pRegion->eq1_freq;              
1215          pEqSupport->SetFreq(0, freq);              float l = eg->GetLevel();
1216                        dB1 += ((eg->suEq1GainOnCC.Active() ? eg->suEq1GainOnCC.GetLevel() : 0) + eg->pEGInfo->eq1gain) * l;
1217          freq = (suEq2FreqOnCC.Active() ? suEq2FreqOnCC.GetLevel() : 0) + pRegion->eq2_freq;              dB2 += ((eg->suEq2GainOnCC.Active() ? eg->suEq2GainOnCC.GetLevel() : 0) + eg->pEGInfo->eq2gain) * l;
1218          pEqSupport->SetFreq(1, freq);              dB3 += ((eg->suEq3GainOnCC.Active() ? eg->suEq3GainOnCC.GetLevel() : 0) + eg->pEGInfo->eq3gain) * l;
1219                
1220                freq1 += ((eg->suEq1FreqOnCC.Active() ? eg->suEq1FreqOnCC.GetLevel() : 0) + eg->pEGInfo->eq1freq) * l;
1221                freq2 += ((eg->suEq2FreqOnCC.Active() ? eg->suEq2FreqOnCC.GetLevel() : 0) + eg->pEGInfo->eq2freq) * l;
1222                freq3 += ((eg->suEq3FreqOnCC.Active() ? eg->suEq3FreqOnCC.GetLevel() : 0) + eg->pEGInfo->eq3freq) * l;
1223                
1224                bw1 += ((eg->suEq1BwOnCC.Active() ? eg->suEq1BwOnCC.GetLevel() : 0) + eg->pEGInfo->eq1bw) * l;
1225                bw2 += ((eg->suEq2BwOnCC.Active() ? eg->suEq2BwOnCC.GetLevel() : 0) + eg->pEGInfo->eq2bw) * l;
1226                bw3 += ((eg->suEq3BwOnCC.Active() ? eg->suEq3BwOnCC.GetLevel() : 0) + eg->pEGInfo->eq3bw) * l;
1227            }
1228                    
1229          freq = (suEq3FreqOnCC.Active() ? suEq3FreqOnCC.GetLevel() : 0) + pRegion->eq3_freq;          for (int i = 0; i < eqLFOs.size(); i++) {
1230          pEqSupport->SetFreq(2, freq);              LFOv2Unit* lfo = eqLFOs[i];
1231                if (!lfo->Active()) continue;
1232                
1233                float l = lfo->GetLevel();
1234                dB1 += ((lfo->suEq1GainOnCC.Active() ? lfo->suEq1GainOnCC.GetLevel() : 0) + lfo->pLfoInfo->eq1gain) * l;
1235                dB2 += ((lfo->suEq2GainOnCC.Active() ? lfo->suEq2GainOnCC.GetLevel() : 0) + lfo->pLfoInfo->eq2gain) * l;
1236                dB3 += ((lfo->suEq3GainOnCC.Active() ? lfo->suEq3GainOnCC.GetLevel() : 0) + lfo->pLfoInfo->eq3gain) * l;
1237                
1238                freq1 += ((lfo->suEq1FreqOnCC.Active() ? lfo->suEq1FreqOnCC.GetLevel() : 0) + lfo->pLfoInfo->eq1freq) * l;
1239                freq2 += ((lfo->suEq2FreqOnCC.Active() ? lfo->suEq2FreqOnCC.GetLevel() : 0) + lfo->pLfoInfo->eq2freq) * l;
1240                freq3 += ((lfo->suEq3FreqOnCC.Active() ? lfo->suEq3FreqOnCC.GetLevel() : 0) + lfo->pLfoInfo->eq3freq) * l;
1241                
1242                bw1 += ((lfo->suEq1BwOnCC.Active() ? lfo->suEq1BwOnCC.GetLevel() : 0) + lfo->pLfoInfo->eq1bw) * l;
1243                bw2 += ((lfo->suEq2BwOnCC.Active() ? lfo->suEq2BwOnCC.GetLevel() : 0) + lfo->pLfoInfo->eq2bw) * l;
1244                bw3 += ((lfo->suEq3BwOnCC.Active() ? lfo->suEq3BwOnCC.GetLevel() : 0) + lfo->pLfoInfo->eq3bw) * l;
1245            }
1246                    
1247          float bw = (suEq1BwOnCC.Active() ? suEq1BwOnCC.GetLevel() : 0) + pRegion->eq1_bw;          pEqSupport->SetGain(0, dB1);
1248          pEqSupport->SetBandwidth(0, bw);          pEqSupport->SetGain(1, dB2);
1249            pEqSupport->SetGain(2, dB3);
1250                    
1251          bw = (suEq2BwOnCC.Active() ? suEq2BwOnCC.GetLevel() : 0) + pRegion->eq2_bw;          pEqSupport->SetFreq(0, freq1);
1252          pEqSupport->SetBandwidth(1, bw);          pEqSupport->SetFreq(1, freq2);
1253            pEqSupport->SetFreq(2, freq3);
1254                    
1255          bw = (suEq3BwOnCC.Active() ? suEq3BwOnCC.GetLevel() : 0) + pRegion->eq3_bw;          pEqSupport->SetBandwidth(0, bw1);
1256          pEqSupport->SetBandwidth(2, bw);          pEqSupport->SetBandwidth(1, bw2);
1257            pEqSupport->SetBandwidth(2, bw3);
1258        }
1259        
1260        EqUnitSupport::EqUnitSupport(SfzSignalUnitRack* pRack, Voice* pVoice)
1261            : suEq1GainOnCC(pRack), suEq2GainOnCC(pRack), suEq3GainOnCC(pRack),
1262              suEq1FreqOnCC(pRack), suEq2FreqOnCC(pRack), suEq3FreqOnCC(pRack),
1263              suEq1BwOnCC(pRack), suEq2BwOnCC(pRack), suEq3BwOnCC(pRack)
1264        {
1265            SetVoice(pVoice);
1266        }
1267        
1268        void EqUnitSupport::SetVoice(Voice* pVoice) {
1269            suEq1GainOnCC.pVoice = suEq2GainOnCC.pVoice = suEq3GainOnCC.pVoice = pVoice;
1270            suEq1FreqOnCC.pVoice = suEq2FreqOnCC.pVoice = suEq3FreqOnCC.pVoice = pVoice;
1271            suEq1BwOnCC.pVoice = suEq2BwOnCC.pVoice = suEq3BwOnCC.pVoice = pVoice;
1272        }
1273        
1274        void EqUnitSupport::ImportUnits(SfzSignalUnitRack* pRack) {
1275            if (suEq1GainOnCC.HasCCs()) pRack->Units.add(&suEq1GainOnCC);
1276            if (suEq2GainOnCC.HasCCs()) pRack->Units.add(&suEq2GainOnCC);
1277            if (suEq3GainOnCC.HasCCs()) pRack->Units.add(&suEq3GainOnCC);
1278            if (suEq1FreqOnCC.HasCCs()) pRack->Units.add(&suEq1FreqOnCC);
1279            if (suEq2FreqOnCC.HasCCs()) pRack->Units.add(&suEq2FreqOnCC);
1280            if (suEq3FreqOnCC.HasCCs()) pRack->Units.add(&suEq3FreqOnCC);
1281            if (suEq1BwOnCC.HasCCs()) pRack->Units.add(&suEq1BwOnCC);
1282            if (suEq2BwOnCC.HasCCs()) pRack->Units.add(&suEq2BwOnCC);
1283            if (suEq3BwOnCC.HasCCs()) pRack->Units.add(&suEq3BwOnCC);
1284        }
1285        
1286        void EqUnitSupport::ResetUnits() {
1287            suEq1GainOnCC.RemoveAllCCs();
1288            suEq2GainOnCC.RemoveAllCCs();
1289            suEq3GainOnCC.RemoveAllCCs();
1290            suEq1FreqOnCC.RemoveAllCCs();
1291            suEq2FreqOnCC.RemoveAllCCs();
1292            suEq3FreqOnCC.RemoveAllCCs();
1293            suEq1BwOnCC.RemoveAllCCs();
1294            suEq2BwOnCC.RemoveAllCCs();
1295            suEq3BwOnCC.RemoveAllCCs();
1296        }
1297        
1298        void EqUnitSupport::InitCCLists(Pool<CCSignalUnit::CC>* pCCPool, Pool<Smoother>* pSmootherPool) {
1299            suEq1GainOnCC.InitCCList(pCCPool, pSmootherPool);
1300            suEq2GainOnCC.InitCCList(pCCPool, pSmootherPool);
1301            suEq3GainOnCC.InitCCList(pCCPool, pSmootherPool);
1302            suEq1FreqOnCC.InitCCList(pCCPool, pSmootherPool);
1303            suEq2FreqOnCC.InitCCList(pCCPool, pSmootherPool);
1304            suEq3FreqOnCC.InitCCList(pCCPool, pSmootherPool);
1305            suEq1BwOnCC.InitCCList(pCCPool, pSmootherPool);
1306            suEq2BwOnCC.InitCCList(pCCPool, pSmootherPool);
1307            suEq3BwOnCC.InitCCList(pCCPool, pSmootherPool);
1308      }      }
1309            
1310  }} // namespace LinuxSampler::sfz  }} // namespace LinuxSampler::sfz

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

  ViewVC Help
Powered by ViewVC