/[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 2218 by iliev, Thu Jul 28 08:05:57 2011 UTC revision 2219 by iliev, Thu Jul 28 12:35:49 2011 UTC
# Line 51  namespace LinuxSampler { namespace sfz { Line 51  namespace LinuxSampler { namespace sfz {
51      void EGv2Unit::Trigger() {      void EGv2Unit::Trigger() {
52          EG.trigger(*pEGInfo, GetSampleRate(), pVoice->MIDIVelocity);          EG.trigger(*pEGInfo, GetSampleRate(), pVoice->MIDIVelocity);
53      }      }
54        
55    
56        void LFOUnit::Increment() {
57            if (DelayStage()) return;
58            
59            SignalUnit::Increment();
60            
61            Level = lfo.render();
62        }
63        
64        void LFOUnit::Trigger() {
65            //reset
66            Level = 0;
67            
68            // set the delay trigger
69             uiDelayTrigger = pLfoInfo->delay * GetSampleRate();
70        }
71        
72        void LFOv2Unit::Trigger() {
73            LFOUnit::Trigger();
74            
75            lfo.trigger (
76                pLfoInfo->freq,
77                start_level_mid,
78                1, 0, false, GetSampleRate()
79            );
80            lfo.update(0);
81        }
82    
83    
84      EndpointUnit::EndpointUnit(SfzSignalUnitRack* rack): EndpointSignalUnit(rack) {      EndpointUnit::EndpointUnit(SfzSignalUnitRack* rack): EndpointSignalUnit(rack) {
# Line 89  namespace LinuxSampler { namespace sfz { Line 117  namespace LinuxSampler { namespace sfz {
117      }      }
118            
119      float EndpointUnit::GetFilterCutoff() {      float EndpointUnit::GetFilterCutoff() {
120          return 1;          float val = 1;
121            
122            for (int i = 0; i < GetRack()->filLFOs.size(); i++) {
123                LFOv2Unit* lfo = GetRack()->filLFOs[i];
124                if (!lfo->Active()) continue;
125                
126                float f = lfo->GetLevel() * lfo->pLfoInfo->cutoff;
127                val *= RTMath::CentsToFreqRatioUnlimited(f);
128            }
129            
130            return val;
131      }      }
132            
133      float EndpointUnit::GetPitch() {      float EndpointUnit::GetPitch() {
# Line 97  namespace LinuxSampler { namespace sfz { Line 135  namespace LinuxSampler { namespace sfz {
135      }      }
136            
137      float EndpointUnit::GetResonance() {      float EndpointUnit::GetResonance() {
138          return 1;           float val = 0;
139            
140            for (int i = 0; i < GetRack()->resLFOs.size(); i++) {
141                LFOv2Unit* lfo = GetRack()->resLFOs[i];
142                if (!lfo->Active()) continue;
143                
144                val += lfo->GetLevel() * lfo->pLfoInfo->resonance;
145            }
146            
147            return val;
148        }
149        
150        float EndpointUnit::GetPan() {
151            float pan = 0;
152            
153            for (int i = 0; i < GetRack()->panLFOs.size(); i++) {
154                LFOv2Unit* lfo = GetRack()->panLFOs[i];
155                if (!lfo->Active()) continue;
156                
157                pan += lfo->GetLevel() * lfo->pLfoInfo->pan;
158            }
159            
160            if(pan < -100) return -100;
161            if(pan >  100) return  100;
162            
163            return pan;
164      }      }
165            
166            
167      SfzSignalUnitRack::SfzSignalUnitRack(Voice* voice)      SfzSignalUnitRack::SfzSignalUnitRack(Voice* voice)
168          : SignalUnitRack(MaxUnitCount), pVoice(voice), suEndpoint(this), suVolEG(this),          : SignalUnitRack(MaxUnitCount), pVoice(voice), suEndpoint(this), suVolEG(this),
169          EGs(maxEgCount), volEGs(maxEgCount), pitchEGs(maxEgCount)          EGs(maxEgCount), volEGs(maxEgCount), pitchEGs(maxEgCount),
170            LFOs(maxLfoCount), filLFOs(maxLfoCount), resLFOs(maxLfoCount), panLFOs(maxLfoCount)
171      {      {
172          suEndpoint.pVoice = suVolEG.pVoice = voice;          suEndpoint.pVoice = suVolEG.pVoice = voice;
173                    
# Line 111  namespace LinuxSampler { namespace sfz { Line 175  namespace LinuxSampler { namespace sfz {
175              EGs[i] = new EGv2Unit(this);              EGs[i] = new EGv2Unit(this);
176              EGs[i]->pVoice = voice;              EGs[i]->pVoice = voice;
177          }          }
178            
179            for (int i = 0; i < LFOs.capacity(); i++) {
180                LFOs[i] = new LFOv2Unit(this);
181                LFOs[i]->pVoice = voice;
182            }
183      }      }
184            
185      SfzSignalUnitRack::~SfzSignalUnitRack() {      SfzSignalUnitRack::~SfzSignalUnitRack() {
186          for (int i = 0; i < maxEgCount; i++) {          for (int i = 0; i < EGs.capacity(); i++) {
187              delete EGs[i]; EGs[i] = NULL;              delete EGs[i]; EGs[i] = NULL;
188          }          }
189            
190            for (int i = 0; i < LFOs.capacity(); i++) {
191                delete LFOs[i]; LFOs[i] = NULL;
192            }
193      }      }
194            
195      void SfzSignalUnitRack::Trigger() {      void SfzSignalUnitRack::Trigger() {
# Line 124  namespace LinuxSampler { namespace sfz { Line 197  namespace LinuxSampler { namespace sfz {
197          volEGs.clear();          volEGs.clear();
198          pitchEGs.clear();          pitchEGs.clear();
199                    
200            LFOs.clear();
201            filLFOs.clear();
202            resLFOs.clear();
203            panLFOs.clear();
204            
205          ::sfz::Region* const pRegion = pVoice->pRegion;          ::sfz::Region* const pRegion = pVoice->pRegion;
206                    
207          for (int i = 0 ; i < pRegion->eg.size() ; i++) {          for (int i = 0; i < pRegion->eg.size(); i++) {
208              if (pRegion->eg[i].node.size() == 0) continue;              if (pRegion->eg[i].node.size() == 0) continue;
209                            
210              if(EGs.size() < EGs.capacity()) {              if(EGs.size() < EGs.capacity()) {
# Line 135  namespace LinuxSampler { namespace sfz { Line 213  namespace LinuxSampler { namespace sfz {
213                  EGs.increment()->Copy(eg);                  EGs.increment()->Copy(eg);
214              } else { std::cerr << "Maximum number of EGs reached!" << std::endl; break; }              } else { std::cerr << "Maximum number of EGs reached!" << std::endl; break; }
215                            
               
               
216              if (pRegion->eg[i].amplitude > 0) {              if (pRegion->eg[i].amplitude > 0) {
217                  if(volEGs.size() < volEGs.capacity()) volEGs.add(EGs[EGs.size() - 1]);                  if(volEGs.size() < volEGs.capacity()) volEGs.add(EGs[EGs.size() - 1]);
218                  else std::cerr << "Maximum number of EGs reached!" << std::endl;                  else std::cerr << "Maximum number of EGs reached!" << std::endl;
# Line 148  namespace LinuxSampler { namespace sfz { Line 224  namespace LinuxSampler { namespace sfz {
224              else pRegion->ampeg_sustain = 100;              else pRegion->ampeg_sustain = 100;
225          }          }
226                    
227            // LFO
228            for (int i = 0; i < pRegion->lfos.size(); i++) {
229                if (pRegion->lfos[i].freq == -1) continue; // Not initialized
230                
231                if(LFOs.size() < LFOs.capacity()) {
232                    LFOv2Unit lfo(this);
233                    lfo.pLfoInfo = &(pRegion->lfos[i]);
234                    LFOs.increment()->Copy(lfo);
235                } else { std::cerr << "Maximum number of LFOs reached!" << std::endl; break; }
236                
237                if (pRegion->lfos[i].cutoff != 0) {
238                    if(filLFOs.size() < filLFOs.capacity()) filLFOs.add(LFOs[LFOs.size() - 1]);
239                    else std::cerr << "Maximum number of LFOs reached!" << std::endl;
240                }
241                
242                if (pRegion->lfos[i].resonance != 0) {
243                    if(resLFOs.size() < resLFOs.capacity()) resLFOs.add(LFOs[LFOs.size() - 1]);
244                    else std::cerr << "Maximum number of LFOs reached!" << std::endl;
245                }
246                
247                if (pRegion->lfos[i].pan != 0) {
248                    if(panLFOs.size() < panLFOs.capacity()) panLFOs.add(LFOs[LFOs.size() - 1]);
249                    else std::cerr << "Maximum number of LFOs reached!" << std::endl;
250                }
251            }
252            
253          Units.clear();          Units.clear();
254                    
255          Units.add(&suVolEG);          Units.add(&suVolEG);
256                    
257          for (int i = 0 ; i < EGs.size() ; i++) {          for (int i = 0; i < EGs.size(); i++) {
258              Units.add(EGs[i]);              Units.add(EGs[i]);
259          }          }
260                    
261            for (int i = 0; i < LFOs.size(); i++) {
262                Units.add(LFOs[i]);
263            }
264            
265          Units.add(&suEndpoint);          Units.add(&suEndpoint);
266                    
267          SignalUnitRack::Trigger();          SignalUnitRack::Trigger();

Legend:
Removed from v.2218  
changed lines
  Added in v.2219

  ViewVC Help
Powered by ViewVC