/[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 2229 by iliev, Thu Aug 4 19:02:36 2011 UTC revision 2235 by iliev, Wed Aug 10 19:40:39 2011 UTC
# Line 44  namespace LinuxSampler { namespace sfz { Line 44  namespace LinuxSampler { namespace sfz {
44      }      }
45            
46            
47        EGv2Unit::EGv2Unit(SfzSignalUnitRack* rack)
48            : EGUnit< ::LinuxSampler::sfz::EG>(rack),
49              suAmpOnCC(rack), suVolOnCC(rack), suPitchOnCC(rack), suCutoffOnCC(rack), suResOnCC(rack)
50        { }
51        
52      void EGv2Unit::Trigger() {      void EGv2Unit::Trigger() {
53          egInfo = *pEGInfo;          egInfo = *pEGInfo;
54          for (int i = 0; i < egInfo.node.size(); i++) {          for (int i = 0; i < egInfo.node.size(); i++) {
# Line 134  namespace LinuxSampler { namespace sfz { Line 139  namespace LinuxSampler { namespace sfz {
139            
140      LFOUnit::LFOUnit(SfzSignalUnitRack* rack)      LFOUnit::LFOUnit(SfzSignalUnitRack* rack)
141          : SfzSignalUnit(rack), pLfoInfo(NULL), pLFO(NULL),          : SfzSignalUnit(rack), pLfoInfo(NULL), pLFO(NULL),
142            suFadeEG(rack), suFreqOnCC(rack, this)            suFadeEG(rack), suFreqOnCC(rack, this), suDepthOnCC(rack)
143      { }      { }
144            
145      LFOUnit::LFOUnit(const LFOUnit& Unit)      LFOUnit::LFOUnit(const LFOUnit& Unit)
146          : SfzSignalUnit(Unit), suFadeEG(static_cast<SfzSignalUnitRack*>(Unit.pRack)),          : SfzSignalUnit(Unit), suFadeEG(static_cast<SfzSignalUnitRack*>(Unit.pRack)),
147            suFreqOnCC(static_cast<SfzSignalUnitRack*>(Unit.pRack), this)            suFreqOnCC(static_cast<SfzSignalUnitRack*>(Unit.pRack), this),
148              suDepthOnCC(static_cast<SfzSignalUnitRack*>(Unit.pRack))
149      {      {
150          Copy(Unit);          Copy(Unit);
151      }      }
# Line 158  namespace LinuxSampler { namespace sfz { Line 164  namespace LinuxSampler { namespace sfz {
164          Level = 0;          Level = 0;
165                    
166          // set the delay trigger          // set the delay trigger
167          uiDelayTrigger = pLfoInfo->delay * GetSampleRate();          uiDelayTrigger = (pLfoInfo->delay + GetInfluence(pLfoInfo->delay_oncc)) * GetSampleRate();
168          if(pLfoInfo->fade != 0 || !pLfoInfo->fade_oncc.empty()) {          if(pLfoInfo->fade != 0 || !pLfoInfo->fade_oncc.empty()) {
169              float f = pLfoInfo->fade;              float f = pLfoInfo->fade;
170              f += GetInfluence(pLfoInfo->fade_oncc);              f += GetInfluence(pLfoInfo->fade_oncc);
# Line 190  namespace LinuxSampler { namespace sfz { Line 196  namespace LinuxSampler { namespace sfz {
196      LFOv2Unit::LFOv2Unit(SfzSignalUnitRack* rack)      LFOv2Unit::LFOv2Unit(SfzSignalUnitRack* rack)
197          : 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),
198            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),
199            suPitchOnCC(rack)            suVolOnCC(rack), suPitchOnCC(rack), suPanOnCC(rack), suCutoffOnCC(rack), suResOnCC(rack)
200      {      {
201          lfos.add(&lfo0);          lfos.add(&lfo0);
202          lfos.add(&lfo1);          lfos.add(&lfo1);
# Line 256  namespace LinuxSampler { namespace sfz { Line 262  namespace LinuxSampler { namespace sfz {
262      void CCUnit::Trigger() {      void CCUnit::Trigger() {
263          for (int i = 0; i < Ctrls.size(); i++) {          for (int i = 0; i < Ctrls.size(); i++) {
264              Ctrls[i].Value = pVoice->GetControllerValue(Ctrls[i].Controller);              Ctrls[i].Value = pVoice->GetControllerValue(Ctrls[i].Controller);
265                if (Ctrls[i].pSmoother != NULL) Ctrls[i].pSmoother->setValue(Ctrls[i].Value);
266          }          }
267          CCSignalUnit::Trigger();          CCSignalUnit::Trigger();
268      }      }
# Line 270  namespace LinuxSampler { namespace sfz { Line 277  namespace LinuxSampler { namespace sfz {
277       void CCUnit::SetCCs(ArrayList< ::sfz::CC>& cc) {       void CCUnit::SetCCs(ArrayList< ::sfz::CC>& cc) {
278           RemoveAllCCs();           RemoveAllCCs();
279           for (int i = 0; i < cc.size(); i++) {           for (int i = 0; i < cc.size(); i++) {
280               if (cc[i].Influence != 0) AddCC(cc[i].Controller, cc[i].Influence);               if (cc[i].Influence != 0) {
281                     short int curve = cc[i].Curve;
282                     if (curve >= GetCurveCount()) curve = -1;
283                     AddSmoothCC(cc[i].Controller, cc[i].Influence, curve, cc[i].Smooth);
284                 }
285             }
286         }
287        
288         void CCUnit::AddSmoothCC(uint8_t Controller, float Influence, short int Curve, float Smooth) {
289             AddCC(Controller, Influence, Curve);
290         }
291        
292         int CCUnit::GetCurveCount() {
293             return pVoice->pRegion->GetInstrument()->curves.size();
294         }
295        
296         ::sfz::Curve* CCUnit::GetCurve(int idx) {
297             return &pVoice->pRegion->GetInstrument()->curves[idx];
298         }
299        
300         double CCUnit::GetSampleRate() {
301            return pVoice->GetSampleRate() / CONFIG_DEFAULT_SUBFRAGMENT_SIZE;
302        }
303        
304         void SmoothCCUnit::AddSmoothCC(uint8_t Controller, float Influence, short int Curve, float Smooth) {
305             if (Smooth > 0) {
306                 Smoothers[Controller].trigger(Smooth / 1000.0f, GetSampleRate());
307                 AddCC(Controller, Influence, Curve, &Smoothers[Controller]);
308             } else {
309                 AddCC(Controller, Influence, Curve);
310           }           }
311       }       }
312    
# Line 304  namespace LinuxSampler { namespace sfz { Line 340  namespace LinuxSampler { namespace sfz {
340          for (int i = 0; i < GetRack()->volEGs.size(); i++) {          for (int i = 0; i < GetRack()->volEGs.size(); i++) {
341              EGv2Unit* eg = GetRack()->volEGs[i];              EGv2Unit* eg = GetRack()->volEGs[i];
342              if (!eg->Active()) continue;              if (!eg->Active()) continue;
             vol += eg->GetLevel() * (eg->pEGInfo->amplitude / 100.0f);  
343                            
344                float dB = eg->suVolOnCC.Active() ? eg->suVolOnCC.GetLevel() : -200;
345                if (dB < -144) dB = eg->pEGInfo->volume;
346                else if (eg->pEGInfo->volume >= -144) dB += eg->pEGInfo->volume;
347                
348                float amp = eg->suAmpOnCC.Active() ? eg->suAmpOnCC.GetLevel() : 0;
349                amp = (amp + eg->pEGInfo->amplitude) / 100.0f;
350                
351                if (dB >= -144) {
352                    if (amp == 0 && eg->suAmpOnCC.GetCCCount() == 0) amp = 1.0f;
353                    amp *= ::sf2::ToRatio(dB * 10.0);
354                }
355                
356                vol += amp * eg->GetLevel();
357          }          }
358                    
359          AmpLFOUnit* u = &(GetRack()->suAmpLFO);          AmpLFOUnit* u = &(GetRack()->suAmpLFO);
360          vol *= u->Active() ? ::sf2::ToRatio((u->GetLevel() * u->pLfoInfo->volume) * 10.0) : 1;          CCSignalUnit* u2 = &(GetRack()->suAmpLFO.suDepthOnCC);
361            float f = u2->Active() ? u2->GetLevel() : 0;
362            vol *= u->Active() ? ::sf2::ToRatio((u->GetLevel() * (u->pLfoInfo->volume + f) * 10.0)) : 1;
363            
364            vol *= ::sf2::ToRatio(GetRack()->suVolOnCC.GetLevel() * 10.0);
365            
366            for (int i = 0; i < GetRack()->volLFOs.size(); i++) {
367                LFOv2Unit* lfo = GetRack()->volLFOs[i];
368                if (!lfo->Active()) continue;
369                
370                float f = lfo->suVolOnCC.Active() ? lfo->suVolOnCC.GetLevel() : 0;
371                vol *= ::sf2::ToRatio(lfo->GetLevel() * (lfo->pLfoInfo->volume + f) * 10.0);
372            }
373                    
374          return vol;          return vol;
375      }      }
# Line 318  namespace LinuxSampler { namespace sfz { Line 378  namespace LinuxSampler { namespace sfz {
378          float val;          float val;
379                    
380          FilLFOUnit* u = &(GetRack()->suFilLFO);          FilLFOUnit* u = &(GetRack()->suFilLFO);
381          val = u->Active() ? RTMath::CentsToFreqRatioUnlimited(u->GetLevel() * u->pLfoInfo->cutoff) : 1;          CCSignalUnit* u1 = &(GetRack()->suFilLFO.suDepthOnCC);
382            float f = u1->Active() ? u1->GetLevel() : 0;
383            val = u->Active() ? RTMath::CentsToFreqRatioUnlimited(u->GetLevel() * (u->pLfoInfo->cutoff + f)) : 1;
384                    
385          FilEGUnit* u2 = &(GetRack()->suFilEG);          FilEGUnit* u2 = &(GetRack()->suFilEG);
386          val *= u2->Active() ? RTMath::CentsToFreqRatioUnlimited(u2->GetLevel() * u2->depth) : 1;          val *= u2->Active() ? RTMath::CentsToFreqRatioUnlimited(u2->GetLevel() * u2->depth) : 1;
387                    
388            for (int i = 0; i < GetRack()->filEGs.size(); i++) {
389                EGv2Unit* eg = GetRack()->filEGs[i];
390                if (!eg->Active()) continue;
391                
392                float f = eg->suCutoffOnCC.Active() ? eg->suCutoffOnCC.GetLevel() : 0;
393                f = eg->GetLevel() * (eg->pEGInfo->cutoff + f);
394                val *= RTMath::CentsToFreqRatioUnlimited(f);
395            }
396            
397          for (int i = 0; i < GetRack()->filLFOs.size(); i++) {          for (int i = 0; i < GetRack()->filLFOs.size(); i++) {
398              LFOv2Unit* lfo = GetRack()->filLFOs[i];              LFOv2Unit* lfo = GetRack()->filLFOs[i];
399              if (!lfo->Active()) continue;              if (!lfo->Active()) continue;
400                            
401              float f = lfo->GetLevel() * lfo->pLfoInfo->cutoff;              float f = lfo->suCutoffOnCC.Active() ? lfo->suCutoffOnCC.GetLevel() : 0;
402                f = lfo->GetLevel() * (lfo->pLfoInfo->cutoff + f);
403              val *= RTMath::CentsToFreqRatioUnlimited(f);              val *= RTMath::CentsToFreqRatioUnlimited(f);
404          }          }
405                    
406          return val;          return val;
407      }      }
408            
409        float EndpointUnit::CalculateFilterCutoff(float cutoff) {
410             cutoff *= GetFilterCutoff();
411             float maxCutoff = 0.49 * pVoice->GetSampleRate();
412             return cutoff > maxCutoff ? maxCutoff : cutoff;
413        }
414        
415      float EndpointUnit::GetPitch() {      float EndpointUnit::GetPitch() {
416          double p;          double p;
417          EGv1Unit* u = &(GetRack()->suPitchEG);          EGv1Unit* u = &(GetRack()->suPitchEG);
418          p = u->Active() ? RTMath::CentsToFreqRatioUnlimited(u->GetLevel() * u->depth) : 1;          p = u->Active() ? RTMath::CentsToFreqRatioUnlimited(u->GetLevel() * u->depth) : 1;
419                    
420            for (int i = 0; i < GetRack()->pitchEGs.size(); i++) {
421                EGv2Unit* eg = GetRack()->pitchEGs[i];
422                if (!eg->Active()) continue;
423                
424                float f = eg->suPitchOnCC.Active() ? eg->suPitchOnCC.GetLevel() : 0;
425                p *= RTMath::CentsToFreqRatioUnlimited(eg->GetLevel() * (eg->pEGInfo->pitch + f));
426            }
427            
428          PitchLFOUnit* u2 = &(GetRack()->suPitchLFO);          PitchLFOUnit* u2 = &(GetRack()->suPitchLFO);
429          CCSignalUnit* u3 = &(GetRack()->suPitchLFO.suDepthCC);          CCSignalUnit* u3 = &(GetRack()->suPitchLFO.suDepthOnCC);
430          float f = u3->Active() ? u3->GetLevel() : 0;          float f = u3->Active() ? u3->GetLevel() : 0;
431          p *= u2->Active() ? RTMath::CentsToFreqRatioUnlimited(u2->GetLevel() * (u2->pLfoInfo->pitch + f)) : 1;          p *= u2->Active() ? RTMath::CentsToFreqRatioUnlimited(u2->GetLevel() * (u2->pLfoInfo->pitch + f)) : 1;
432                    
# Line 358  namespace LinuxSampler { namespace sfz { Line 444  namespace LinuxSampler { namespace sfz {
444      float EndpointUnit::GetResonance() {      float EndpointUnit::GetResonance() {
445           float val = 0;           float val = 0;
446                    
447            for (int i = 0; i < GetRack()->resEGs.size(); i++) {
448                EGv2Unit* eg = GetRack()->resEGs[i];
449                if (!eg->Active()) continue;
450                
451                float f = eg->suResOnCC.Active() ? eg->suResOnCC.GetLevel() : 0;
452                val += eg->GetLevel() * (eg->pEGInfo->resonance + f);
453            }
454            
455          for (int i = 0; i < GetRack()->resLFOs.size(); i++) {          for (int i = 0; i < GetRack()->resLFOs.size(); i++) {
456              LFOv2Unit* lfo = GetRack()->resLFOs[i];              LFOv2Unit* lfo = GetRack()->resLFOs[i];
457              if (!lfo->Active()) continue;              if (!lfo->Active()) continue;
458                            
459              val += lfo->GetLevel() * lfo->pLfoInfo->resonance;              float f = lfo->suResOnCC.Active() ? lfo->suResOnCC.GetLevel() : 0;
460                val += lfo->GetLevel() * (lfo->pLfoInfo->resonance + f);
461          }          }
462                    
463          return val;          return val;
# Line 375  namespace LinuxSampler { namespace sfz { Line 470  namespace LinuxSampler { namespace sfz {
470              LFOv2Unit* lfo = GetRack()->panLFOs[i];              LFOv2Unit* lfo = GetRack()->panLFOs[i];
471              if (!lfo->Active()) continue;              if (!lfo->Active()) continue;
472                            
473              pan += lfo->GetLevel() * lfo->pLfoInfo->pan;              float f = lfo->suPanOnCC.Active() ? lfo->suPanOnCC.GetLevel() : 0;
474                pan += lfo->GetLevel() * (lfo->pLfoInfo->pan + f);
475          }          }
476                    
477          if(pan < -100) return -100;          if(pan < -100) return -100;
# Line 387  namespace LinuxSampler { namespace sfz { Line 483  namespace LinuxSampler { namespace sfz {
483            
484      SfzSignalUnitRack::SfzSignalUnitRack(Voice* voice)      SfzSignalUnitRack::SfzSignalUnitRack(Voice* voice)
485          : SignalUnitRack(MaxUnitCount), pVoice(voice), suEndpoint(this), suVolEG(this), suFilEG(this), suPitchEG(this),          : SignalUnitRack(MaxUnitCount), pVoice(voice), suEndpoint(this), suVolEG(this), suFilEG(this), suPitchEG(this),
486          EGs(maxEgCount), volEGs(maxEgCount), pitchEGs(maxEgCount),          EGs(maxEgCount), volEGs(maxEgCount), pitchEGs(maxEgCount), filEGs(maxEgCount), resEGs(maxEgCount), suVolOnCC(this),
487          suAmpLFO(this), suPitchLFO(this), suFilLFO(this),          suAmpLFO(this), suPitchLFO(this), suFilLFO(this),
488          LFOs(maxLfoCount), pitchLFOs(maxLfoCount), filLFOs(maxLfoCount), resLFOs(maxLfoCount), panLFOs(maxLfoCount)          LFOs(maxLfoCount), volLFOs(maxLfoCount), pitchLFOs(maxLfoCount),
489            filLFOs(maxLfoCount), resLFOs(maxLfoCount), panLFOs(maxLfoCount)
490      {      {
491          suEndpoint.pVoice = suVolEG.pVoice = suFilEG.pVoice = suPitchEG.pVoice = voice;          suEndpoint.pVoice = suVolEG.pVoice = suFilEG.pVoice = suPitchEG.pVoice = voice;
492          suAmpLFO.pVoice = suPitchLFO.pVoice = suFilLFO.pVoice = voice;          suAmpLFO.pVoice = suPitchLFO.pVoice = suFilLFO.pVoice = suVolOnCC.pVoice = voice;
493          suPitchLFO.suDepthCC.pVoice = suPitchLFO.suFadeEG.pVoice = suPitchLFO.suFreqOnCC.pVoice = voice;          suPitchLFO.suDepthOnCC.pVoice = suPitchLFO.suFadeEG.pVoice = suPitchLFO.suFreqOnCC.pVoice = voice;
494          suFilLFO.suFadeEG.pVoice = suFilLFO.suFreqOnCC.pVoice = voice;          suFilLFO.suFadeEG.pVoice = suFilLFO.suDepthOnCC.pVoice = suFilLFO.suFreqOnCC.pVoice = voice;
495          suAmpLFO.suFadeEG.pVoice = suAmpLFO.suFreqOnCC.pVoice = voice;          suAmpLFO.suFadeEG.pVoice = suAmpLFO.suDepthOnCC.pVoice = suAmpLFO.suFreqOnCC.pVoice = voice;
496                    
497          for (int i = 0; i < EGs.capacity(); i++) {          for (int i = 0; i < EGs.capacity(); i++) {
498              EGs[i] = new EGv2Unit(this);              EGs[i] = new EGv2Unit(this);
499              EGs[i]->pVoice = voice;              EGs[i]->pVoice = voice;
500                EGs[i]->suAmpOnCC.pVoice = voice;
501                EGs[i]->suVolOnCC.pVoice = voice;
502                EGs[i]->suPitchOnCC.pVoice = voice;
503                EGs[i]->suCutoffOnCC.pVoice = voice;
504                EGs[i]->suResOnCC.pVoice = voice;
505          }          }
506                    
507          for (int i = 0; i < LFOs.capacity(); i++) {          for (int i = 0; i < LFOs.capacity(); i++) {
508              LFOs[i] = new LFOv2Unit(this);              LFOs[i] = new LFOv2Unit(this);
509              LFOs[i]->pVoice = voice;              LFOs[i]->pVoice = voice;
510              LFOs[i]->suFadeEG.pVoice = voice;              LFOs[i]->suFadeEG.pVoice = voice;
511                LFOs[i]->suVolOnCC.pVoice = voice;
512              LFOs[i]->suPitchOnCC.pVoice = voice;              LFOs[i]->suPitchOnCC.pVoice = voice;
513              LFOs[i]->suFreqOnCC.pVoice = voice;              LFOs[i]->suFreqOnCC.pVoice = voice;
514                LFOs[i]->suPanOnCC.pVoice = voice;
515                LFOs[i]->suCutoffOnCC.pVoice = voice;
516                LFOs[i]->suResOnCC.pVoice = voice;
517          }          }
518      }      }
519            
# Line 425  namespace LinuxSampler { namespace sfz { Line 531  namespace LinuxSampler { namespace sfz {
531          EGs.clear();          EGs.clear();
532          volEGs.clear();          volEGs.clear();
533          pitchEGs.clear();          pitchEGs.clear();
534            filEGs.clear();
535            resEGs.clear();
536                    
537          LFOs.clear();          LFOs.clear();
538            volLFOs.clear();
539          pitchLFOs.clear();          pitchLFOs.clear();
540          filLFOs.clear();          filLFOs.clear();
541          resLFOs.clear();          resLFOs.clear();
# Line 434  namespace LinuxSampler { namespace sfz { Line 543  namespace LinuxSampler { namespace sfz {
543                    
544          ::sfz::Region* const pRegion = pVoice->pRegion;          ::sfz::Region* const pRegion = pVoice->pRegion;
545                    
546            suVolOnCC.SetCCs(pRegion->volume_oncc);
547            
548          for (int i = 0; i < pRegion->eg.size(); i++) {          for (int i = 0; i < pRegion->eg.size(); i++) {
549              if (pRegion->eg[i].node.size() == 0) continue;              if (pRegion->eg[i].node.size() == 0) continue;
550                            
# Line 441  namespace LinuxSampler { namespace sfz { Line 552  namespace LinuxSampler { namespace sfz {
552                  EGv2Unit eg(this);                  EGv2Unit eg(this);
553                  eg.pEGInfo = &(pRegion->eg[i]);                  eg.pEGInfo = &(pRegion->eg[i]);
554                  EGs.increment()->Copy(eg);                  EGs.increment()->Copy(eg);
555                    EGs[EGs.size() - 1]->suAmpOnCC.SetCCs(pRegion->eg[i].amplitude_oncc);
556                    EGs[EGs.size() - 1]->suVolOnCC.SetCCs(pRegion->eg[i].volume_oncc);
557                    EGs[EGs.size() - 1]->suPitchOnCC.SetCCs(pRegion->eg[i].pitch_oncc);
558                    EGs[EGs.size() - 1]->suCutoffOnCC.SetCCs(pRegion->eg[i].cutoff_oncc);
559                    EGs[EGs.size() - 1]->suResOnCC.SetCCs(pRegion->eg[i].resonance_oncc);
560              } else { std::cerr << "Maximum number of EGs reached!" << std::endl; break; }              } else { std::cerr << "Maximum number of EGs reached!" << std::endl; break; }
561                            
562              if (pRegion->eg[i].amplitude > 0) {              if ( pRegion->eg[i].amplitude > 0 || !pRegion->eg[i].amplitude_oncc.empty() ||
563                     pRegion->eg[i].volume > -145 || !pRegion->eg[i].volume_oncc.empty()
564                ) {
565                  if(volEGs.size() < volEGs.capacity()) volEGs.add(EGs[EGs.size() - 1]);                  if(volEGs.size() < volEGs.capacity()) volEGs.add(EGs[EGs.size() - 1]);
566                  else std::cerr << "Maximum number of EGs reached!" << std::endl;                  else std::cerr << "Maximum number of EGs reached!" << std::endl;
567              }              }
568                
569                if (pRegion->eg[i].cutoff != 0 || !pRegion->eg[i].cutoff_oncc.empty()) {
570                    if(filEGs.size() < filEGs.capacity()) filEGs.add(EGs[EGs.size() - 1]);
571                    else std::cerr << "Maximum number of EGs reached!" << std::endl;
572                }
573                
574                if (pRegion->eg[i].resonance != 0 || !pRegion->eg[i].resonance_oncc.empty()) {
575                    if(resEGs.size() < resEGs.capacity()) resEGs.add(EGs[EGs.size() - 1]);
576                    else std::cerr << "Maximum number of EGs reached!" << std::endl;
577                }
578                
579                if (pRegion->eg[i].pitch != 0 || !pRegion->eg[i].pitch_oncc.empty()) {
580                    if(pitchEGs.size() < pitchEGs.capacity()) pitchEGs.add(EGs[EGs.size() - 1]);
581                    else std::cerr << "Maximum number of EGs reached!" << std::endl;
582                }
583          }          }
584                    
585          if (pRegion->ampeg_sustain == -1) {          if (pRegion->ampeg_sustain == -1) {
# Line 462  namespace LinuxSampler { namespace sfz { Line 595  namespace LinuxSampler { namespace sfz {
595                  LFOv2Unit lfo(this);                  LFOv2Unit lfo(this);
596                  lfo.pLfoInfo = &(pRegion->lfos[i]);                  lfo.pLfoInfo = &(pRegion->lfos[i]);
597                  LFOs.increment()->Copy(lfo);                  LFOs.increment()->Copy(lfo);
598                    LFOs[LFOs.size() - 1]->suVolOnCC.SetCCs(pRegion->lfos[i].volume_oncc);
599                  LFOs[LFOs.size() - 1]->suPitchOnCC.SetCCs(pRegion->lfos[i].pitch_oncc);                  LFOs[LFOs.size() - 1]->suPitchOnCC.SetCCs(pRegion->lfos[i].pitch_oncc);
600                  LFOs[LFOs.size() - 1]->suFreqOnCC.SetCCs(pRegion->lfos[i].freq_oncc);                  LFOs[LFOs.size() - 1]->suFreqOnCC.SetCCs(pRegion->lfos[i].freq_oncc);
601                    LFOs[LFOs.size() - 1]->suPanOnCC.SetCCs(pRegion->lfos[i].pan_oncc);
602                    LFOs[LFOs.size() - 1]->suCutoffOnCC.SetCCs(pRegion->lfos[i].cutoff_oncc);
603                    LFOs[LFOs.size() - 1]->suResOnCC.SetCCs(pRegion->lfos[i].resonance_oncc);
604              } else { std::cerr << "Maximum number of LFOs reached!" << std::endl; break; }              } else { std::cerr << "Maximum number of LFOs reached!" << std::endl; break; }
605                            
606                if (pRegion->lfos[i].volume != 0 || !pRegion->lfos[i].volume_oncc.empty()) {
607                    if(volLFOs.size() < volLFOs.capacity()) volLFOs.add(LFOs[LFOs.size() - 1]);
608                    else std::cerr << "Maximum number of LFOs reached!" << std::endl;
609                }
610                
611              if (pRegion->lfos[i].pitch != 0 || !pRegion->lfos[i].pitch_oncc.empty()) {              if (pRegion->lfos[i].pitch != 0 || !pRegion->lfos[i].pitch_oncc.empty()) {
612                  if(pitchLFOs.size() < pitchLFOs.capacity()) pitchLFOs.add(LFOs[LFOs.size() - 1]);                  if(pitchLFOs.size() < pitchLFOs.capacity()) pitchLFOs.add(LFOs[LFOs.size() - 1]);
613                  else std::cerr << "Maximum number of LFOs reached!" << std::endl;                  else std::cerr << "Maximum number of LFOs reached!" << std::endl;
614              }              }
615                            
616              if (pRegion->lfos[i].cutoff != 0) {              if (pRegion->lfos[i].cutoff != 0 || !pRegion->lfos[i].cutoff_oncc.empty()) {
617                  if(filLFOs.size() < filLFOs.capacity()) filLFOs.add(LFOs[LFOs.size() - 1]);                  if(filLFOs.size() < filLFOs.capacity()) filLFOs.add(LFOs[LFOs.size() - 1]);
618                  else std::cerr << "Maximum number of LFOs reached!" << std::endl;                  else std::cerr << "Maximum number of LFOs reached!" << std::endl;
619              }              }
620                            
621              if (pRegion->lfos[i].resonance != 0) {              if (pRegion->lfos[i].resonance != 0 || !pRegion->lfos[i].resonance_oncc.empty()) {
622                  if(resLFOs.size() < resLFOs.capacity()) resLFOs.add(LFOs[LFOs.size() - 1]);                  if(resLFOs.size() < resLFOs.capacity()) resLFOs.add(LFOs[LFOs.size() - 1]);
623                  else std::cerr << "Maximum number of LFOs reached!" << std::endl;                  else std::cerr << "Maximum number of LFOs reached!" << std::endl;
624              }              }
625                            
626              if (pRegion->lfos[i].pan != 0) {              if (pRegion->lfos[i].pan != 0 || !pRegion->lfos[i].pan_oncc.empty()) {
627                  if(panLFOs.size() < panLFOs.capacity()) panLFOs.add(LFOs[LFOs.size() - 1]);                  if(panLFOs.size() < panLFOs.capacity()) panLFOs.add(LFOs[LFOs.size() - 1]);
628                  else std::cerr << "Maximum number of LFOs reached!" << std::endl;                  else std::cerr << "Maximum number of LFOs reached!" << std::endl;
629              }              }
630          }          }
631                    
632          suPitchLFO.suDepthCC.SetCCs(pRegion->pitchlfo_depthcc);          suPitchLFO.suDepthOnCC.SetCCs(pRegion->pitchlfo_depthcc);
633          suPitchLFO.suFreqOnCC.SetCCs(pRegion->pitchlfo_freqcc);          suPitchLFO.suFreqOnCC.SetCCs(pRegion->pitchlfo_freqcc);
634                    
635            suFilLFO.suDepthOnCC.SetCCs(pRegion->fillfo_depthcc);
636          suFilLFO.suFreqOnCC.SetCCs(pRegion->fillfo_freqcc);          suFilLFO.suFreqOnCC.SetCCs(pRegion->fillfo_freqcc);
637                    
638            suAmpLFO.suDepthOnCC.SetCCs(pRegion->amplfo_depthcc);
639          suAmpLFO.suFreqOnCC.SetCCs(pRegion->amplfo_freqcc);          suAmpLFO.suFreqOnCC.SetCCs(pRegion->amplfo_freqcc);
640                    
641          Units.clear();          Units.clear();
642                    
643            Units.add(&suVolOnCC);
644            
645          Units.add(&suVolEG);          Units.add(&suVolEG);
646          Units.add(&suFilEG);          Units.add(&suFilEG);
647          Units.add(&suPitchEG);          Units.add(&suPitchEG);
648                    
649          Units.add(&suPitchLFO.suFreqOnCC); // Don't change order! (should be triggered before the LFO)          Units.add(&suPitchLFO.suFreqOnCC); // Don't change order! (should be triggered before the LFO)
650          Units.add(&suPitchLFO);          Units.add(&suPitchLFO);
651          Units.add(&suPitchLFO.suDepthCC);          Units.add(&suPitchLFO.suDepthOnCC);
652          Units.add(&suPitchLFO.suFadeEG);          Units.add(&suPitchLFO.suFadeEG);
653                    
654          Units.add(&suAmpLFO.suFreqOnCC); // Don't change order! (should be triggered before the LFO)          Units.add(&suAmpLFO.suFreqOnCC); // Don't change order! (should be triggered before the LFO)
655            Units.add(&suAmpLFO.suDepthOnCC);
656          Units.add(&suAmpLFO);          Units.add(&suAmpLFO);
657          Units.add(&suAmpLFO.suFadeEG);          Units.add(&suAmpLFO.suFadeEG);
658                    
659          Units.add(&suFilLFO.suFreqOnCC); // Don't change order! (should be triggered before the LFO)          Units.add(&suFilLFO.suFreqOnCC); // Don't change order! (should be triggered before the LFO)
660            Units.add(&suFilLFO.suDepthOnCC);
661          Units.add(&suFilLFO);          Units.add(&suFilLFO);
662          Units.add(&suFilLFO.suFadeEG);          Units.add(&suFilLFO.suFadeEG);
663                    
664          for (int i = 0; i < EGs.size(); i++) {          for (int i = 0; i < EGs.size(); i++) {
665              Units.add(EGs[i]);              Units.add(EGs[i]);
666                Units.add(&(EGs[i]->suAmpOnCC));
667                Units.add(&(EGs[i]->suVolOnCC));
668                Units.add(&(EGs[i]->suPitchOnCC));
669                Units.add(&(EGs[i]->suCutoffOnCC));
670                Units.add(&(EGs[i]->suResOnCC));
671          }          }
672                    
673          for (int i = 0; i < LFOs.size(); i++) {          for (int i = 0; i < LFOs.size(); i++) {
674              Units.add(&(LFOs[i]->suFreqOnCC)); // Don't change order! (should be triggered before the LFO)              Units.add(&(LFOs[i]->suFreqOnCC)); // Don't change order! (should be triggered before the LFO)
675              Units.add(LFOs[i]);              Units.add(LFOs[i]);
676              Units.add(&(LFOs[i]->suFadeEG));              Units.add(&(LFOs[i]->suFadeEG));
677                Units.add(&(LFOs[i]->suVolOnCC));
678              Units.add(&(LFOs[i]->suPitchOnCC));              Units.add(&(LFOs[i]->suPitchOnCC));
679                Units.add(&(LFOs[i]->suPanOnCC));
680                Units.add(&(LFOs[i]->suCutoffOnCC));
681                Units.add(&(LFOs[i]->suResOnCC));
682          }          }
683                    
684          Units.add(&suEndpoint);          Units.add(&suEndpoint);

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

  ViewVC Help
Powered by ViewVC