/[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 2234 by iliev, Mon Aug 8 18:46:19 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 335  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);
# Line 368  namespace LinuxSampler { namespace sfz { Line 385  namespace LinuxSampler { namespace sfz {
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;
# Line 380  namespace LinuxSampler { namespace sfz { Line 406  namespace LinuxSampler { namespace sfz {
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.suDepthOnCC);          CCSignalUnit* u3 = &(GetRack()->suPitchLFO.suDepthOnCC);
430          float f = u3->Active() ? u3->GetLevel() : 0;          float f = u3->Active() ? u3->GetLevel() : 0;
# Line 404  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;
# Line 435  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), suVolOnCC(this),          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), volLFOs(maxLfoCount), pitchLFOs(maxLfoCount),          LFOs(maxLfoCount), volLFOs(maxLfoCount), pitchLFOs(maxLfoCount),
489          filLFOs(maxLfoCount), resLFOs(maxLfoCount), panLFOs(maxLfoCount)          filLFOs(maxLfoCount), resLFOs(maxLfoCount), panLFOs(maxLfoCount)
# Line 449  namespace LinuxSampler { namespace sfz { Line 497  namespace LinuxSampler { namespace sfz {
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++) {
# Line 478  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();          volLFOs.clear();
# Line 497  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 586  namespace LinuxSampler { namespace sfz { Line 663  namespace LinuxSampler { namespace sfz {
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++) {

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

  ViewVC Help
Powered by ViewVC