/[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 2236 by iliev, Thu Aug 11 18:25:45 2011 UTC revision 2237 by iliev, Fri Aug 12 13:07:05 2011 UTC
# Line 119  namespace LinuxSampler { namespace sfz { Line 119  namespace LinuxSampler { namespace sfz {
119            
120            
121      EGv2Unit::EGv2Unit(SfzSignalUnitRack* rack)      EGv2Unit::EGv2Unit(SfzSignalUnitRack* rack)
122          : EGUnit< ::LinuxSampler::sfz::EG>(rack),          : EGUnit< ::LinuxSampler::sfz::EG>(rack), suAmpOnCC(rack), suVolOnCC(rack),
123            suAmpOnCC(rack), suVolOnCC(rack), suPitchOnCC(rack), suCutoffOnCC(rack), suResOnCC(rack)            suPitchOnCC(rack), suCutoffOnCC(rack), suResOnCC(rack), suPanOnCC(rack)
124      { }      { }
125            
126      void EGv2Unit::Trigger() {      void EGv2Unit::Trigger() {
# Line 385  namespace LinuxSampler { namespace sfz { Line 385  namespace LinuxSampler { namespace sfz {
385       }       }
386    
387    
388      EndpointUnit::EndpointUnit(SfzSignalUnitRack* rack): EndpointSignalUnit(rack), suXFInCC(rack), suXFOutCC(rack) {      EndpointUnit::EndpointUnit(SfzSignalUnitRack* rack)
389            : EndpointSignalUnit(rack), suXFInCC(rack), suXFOutCC(rack), suPanOnCC(rack), pitchVeltrackRatio(0)
390        {
391                    
392      }      }
393            
# Line 458  namespace LinuxSampler { namespace sfz { Line 460  namespace LinuxSampler { namespace sfz {
460                    
461          suXFInCC.SetCrossFadeCCs(pVoice->pRegion->xfin_locc, pVoice->pRegion->xfin_hicc);          suXFInCC.SetCrossFadeCCs(pVoice->pRegion->xfin_locc, pVoice->pRegion->xfin_hicc);
462          suXFOutCC.SetCrossFadeCCs(pVoice->pRegion->xfout_locc, pVoice->pRegion->xfout_hicc);          suXFOutCC.SetCrossFadeCCs(pVoice->pRegion->xfout_locc, pVoice->pRegion->xfout_hicc);
463            
464            suPanOnCC.SetCCs(pVoice->pRegion->pan_oncc);
465            
466            pitchVeltrackRatio = RTMath::CentsToFreqRatioUnlimited((pVoice->MIDIVelocity / 127.0f) * pVoice->pRegion->pitch_veltrack);
467      }      }
468            
469      bool EndpointUnit::Active() {      bool EndpointUnit::Active() {
# Line 577  namespace LinuxSampler { namespace sfz { Line 583  namespace LinuxSampler { namespace sfz {
583              p *= RTMath::CentsToFreqRatioUnlimited(lfo->GetLevel() * (lfo->pLfoInfo->pitch + f));              p *= RTMath::CentsToFreqRatioUnlimited(lfo->GetLevel() * (lfo->pLfoInfo->pitch + f));
584          }          }
585                    
586          return p;          return p * pitchVeltrackRatio;
587      }      }
588            
589      float EndpointUnit::GetResonance() {      float EndpointUnit::GetResonance() {
# Line 603  namespace LinuxSampler { namespace sfz { Line 609  namespace LinuxSampler { namespace sfz {
609      }      }
610            
611      float EndpointUnit::GetPan() {      float EndpointUnit::GetPan() {
612          float pan = 0;          float pan = suPanOnCC.Active() ? suPanOnCC.GetLevel() : 0;
613            
614            for (int i = 0; i < GetRack()->panEGs.size(); i++) {
615                EGv2Unit* eg = GetRack()->panEGs[i];
616                if (!eg->Active()) continue;
617                
618                float f = eg->suPanOnCC.Active() ? eg->suPanOnCC.GetLevel() : 0;
619                
620                if (eg->pEGInfo->pan_curve >= 0 && eg->pEGInfo->pan_curve < suPanOnCC.GetCurveCount()) {
621                    uint8_t val = eg->GetLevel() * 127;
622                    if (val > 127) val = 127;
623                    pan += eg->pEGInfo->pan * suPanOnCC.GetCurve(eg->pEGInfo->pan_curve)->v[val] +  eg->GetLevel() * f;
624                } else {
625                    pan += eg->GetLevel() * (eg->pEGInfo->pan + f);
626                }
627            }
628                    
629          for (int i = 0; i < GetRack()->panLFOs.size(); i++) {          for (int i = 0; i < GetRack()->panLFOs.size(); i++) {
630              LFOv2Unit* lfo = GetRack()->panLFOs[i];              LFOv2Unit* lfo = GetRack()->panLFOs[i];
# Line 622  namespace LinuxSampler { namespace sfz { Line 643  namespace LinuxSampler { namespace sfz {
643            
644      SfzSignalUnitRack::SfzSignalUnitRack(Voice* voice)      SfzSignalUnitRack::SfzSignalUnitRack(Voice* voice)
645          : SignalUnitRack(MaxUnitCount), pVoice(voice), suEndpoint(this), suVolEG(this), suFilEG(this), suPitchEG(this),          : SignalUnitRack(MaxUnitCount), pVoice(voice), suEndpoint(this), suVolEG(this), suFilEG(this), suPitchEG(this),
646          EGs(maxEgCount), volEGs(maxEgCount), pitchEGs(maxEgCount), filEGs(maxEgCount), resEGs(maxEgCount), suVolOnCC(this),          EGs(maxEgCount), volEGs(maxEgCount), pitchEGs(maxEgCount), filEGs(maxEgCount), resEGs(maxEgCount), panEGs(maxEgCount), suVolOnCC(this),
647          suAmpLFO(this), suPitchLFO(this), suFilLFO(this),          suAmpLFO(this), suPitchLFO(this), suFilLFO(this),
648          LFOs(maxLfoCount), volLFOs(maxLfoCount), pitchLFOs(maxLfoCount),          LFOs(maxLfoCount), volLFOs(maxLfoCount), pitchLFOs(maxLfoCount),
649          filLFOs(maxLfoCount), resLFOs(maxLfoCount), panLFOs(maxLfoCount)          filLFOs(maxLfoCount), resLFOs(maxLfoCount), panLFOs(maxLfoCount)
650      {      {
651          suEndpoint.pVoice = suEndpoint.suXFInCC.pVoice = suEndpoint.suXFOutCC.pVoice = voice;          suEndpoint.pVoice = suEndpoint.suXFInCC.pVoice = suEndpoint.suXFOutCC.pVoice = suEndpoint.suPanOnCC.pVoice = voice;
652          suVolEG.pVoice = suFilEG.pVoice = suPitchEG.pVoice = voice;          suVolEG.pVoice = suFilEG.pVoice = suPitchEG.pVoice = voice;
653          suAmpLFO.pVoice = suPitchLFO.pVoice = suFilLFO.pVoice = suVolOnCC.pVoice = voice;          suAmpLFO.pVoice = suPitchLFO.pVoice = suFilLFO.pVoice = suVolOnCC.pVoice = voice;
654          suPitchLFO.suDepthOnCC.pVoice = suPitchLFO.suFadeEG.pVoice = suPitchLFO.suFreqOnCC.pVoice = voice;          suPitchLFO.suDepthOnCC.pVoice = suPitchLFO.suFadeEG.pVoice = suPitchLFO.suFreqOnCC.pVoice = voice;
# Line 642  namespace LinuxSampler { namespace sfz { Line 663  namespace LinuxSampler { namespace sfz {
663              EGs[i]->suPitchOnCC.pVoice = voice;              EGs[i]->suPitchOnCC.pVoice = voice;
664              EGs[i]->suCutoffOnCC.pVoice = voice;              EGs[i]->suCutoffOnCC.pVoice = voice;
665              EGs[i]->suResOnCC.pVoice = voice;              EGs[i]->suResOnCC.pVoice = voice;
666                EGs[i]->suPanOnCC.pVoice = voice;
667          }          }
668                    
669          for (int i = 0; i < LFOs.capacity(); i++) {          for (int i = 0; i < LFOs.capacity(); i++) {
# Line 673  namespace LinuxSampler { namespace sfz { Line 695  namespace LinuxSampler { namespace sfz {
695          pitchEGs.clear();          pitchEGs.clear();
696          filEGs.clear();          filEGs.clear();
697          resEGs.clear();          resEGs.clear();
698            panEGs.clear();
699                    
700          LFOs.clear();          LFOs.clear();
701          volLFOs.clear();          volLFOs.clear();
# Line 697  namespace LinuxSampler { namespace sfz { Line 720  namespace LinuxSampler { namespace sfz {
720                  EGs[EGs.size() - 1]->suPitchOnCC.SetCCs(pRegion->eg[i].pitch_oncc);                  EGs[EGs.size() - 1]->suPitchOnCC.SetCCs(pRegion->eg[i].pitch_oncc);
721                  EGs[EGs.size() - 1]->suCutoffOnCC.SetCCs(pRegion->eg[i].cutoff_oncc);                  EGs[EGs.size() - 1]->suCutoffOnCC.SetCCs(pRegion->eg[i].cutoff_oncc);
722                  EGs[EGs.size() - 1]->suResOnCC.SetCCs(pRegion->eg[i].resonance_oncc);                  EGs[EGs.size() - 1]->suResOnCC.SetCCs(pRegion->eg[i].resonance_oncc);
723                    EGs[EGs.size() - 1]->suPanOnCC.SetCCs(pRegion->eg[i].pan_oncc);
724              } else { std::cerr << "Maximum number of EGs reached!" << std::endl; break; }              } else { std::cerr << "Maximum number of EGs reached!" << std::endl; break; }
725                            
726              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 720  namespace LinuxSampler { namespace sfz { Line 744  namespace LinuxSampler { namespace sfz {
744                  if(pitchEGs.size() < pitchEGs.capacity()) pitchEGs.add(EGs[EGs.size() - 1]);                  if(pitchEGs.size() < pitchEGs.capacity()) pitchEGs.add(EGs[EGs.size() - 1]);
745                  else std::cerr << "Maximum number of EGs reached!" << std::endl;                  else std::cerr << "Maximum number of EGs reached!" << std::endl;
746              }              }
747                
748                if (pRegion->eg[i].pan != 0 || !pRegion->eg[i].pan_oncc.empty()) {
749                    if(panEGs.size() < panEGs.capacity()) panEGs.add(EGs[EGs.size() - 1]);
750                    else std::cerr << "Maximum number of EGs reached!" << std::endl;
751                }
752          }          }
753                    
754          if (pRegion->ampeg_sustain == -1) {          if (pRegion->ampeg_sustain == -1) {
# Line 808  namespace LinuxSampler { namespace sfz { Line 837  namespace LinuxSampler { namespace sfz {
837              Units.add(&(EGs[i]->suPitchOnCC));              Units.add(&(EGs[i]->suPitchOnCC));
838              Units.add(&(EGs[i]->suCutoffOnCC));              Units.add(&(EGs[i]->suCutoffOnCC));
839              Units.add(&(EGs[i]->suResOnCC));              Units.add(&(EGs[i]->suResOnCC));
840                Units.add(&(EGs[i]->suPanOnCC));
841          }          }
842                    
843          for (int i = 0; i < LFOs.size(); i++) {          for (int i = 0; i < LFOs.size(); i++) {
# Line 824  namespace LinuxSampler { namespace sfz { Line 854  namespace LinuxSampler { namespace sfz {
854          Units.add(&suEndpoint);          Units.add(&suEndpoint);
855          Units.add(&suEndpoint.suXFInCC);          Units.add(&suEndpoint.suXFInCC);
856          Units.add(&suEndpoint.suXFOutCC);          Units.add(&suEndpoint.suXFOutCC);
857            Units.add(&suEndpoint.suPanOnCC);
858                    
859          SignalUnitRack::Trigger();          SignalUnitRack::Trigger();
860      }      }

Legend:
Removed from v.2236  
changed lines
  Added in v.2237

  ViewVC Help
Powered by ViewVC