/[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 2220 by iliev, Thu Jul 28 15:47:51 2011 UTC
# Line 36  namespace LinuxSampler { namespace sfz { Line 36  namespace LinuxSampler { namespace sfz {
36            
37      void EGv1Unit::Trigger() {      void EGv1Unit::Trigger() {
38          ::sfz::Region* const pRegion = pVoice->pRegion;          ::sfz::Region* const pRegion = pVoice->pRegion;
39            
40          // the length of the decay and release curves are dependent on the velocity          // the length of the decay and release curves are dependent on the velocity
41          const double velrelease = 1 / pVoice->GetVelocityRelease(pVoice->MIDIVelocity);          const double velrelease = 1 / pVoice->GetVelocityRelease(pVoice->MIDIVelocity);
42    
43            // set the delay trigger
44            uiDelayTrigger = (pRegion->ampeg_delay + pRegion->ampeg_vel2delay * velrelease) * GetSampleRate();
45            
46          EG.trigger(uint(pRegion->ampeg_start * 10),          EG.trigger(uint(pRegion->ampeg_start * 10),
47                     std::max(0.0, pRegion->ampeg_attack + pRegion->ampeg_vel2attack * velrelease),                     std::max(0.0, pRegion->ampeg_attack + pRegion->ampeg_vel2attack * velrelease),
48                     std::max(0.0, pRegion->ampeg_hold + pRegion->ampeg_vel2hold * velrelease),                     std::max(0.0, pRegion->ampeg_hold + pRegion->ampeg_vel2hold * velrelease),
# Line 48  namespace LinuxSampler { namespace sfz { Line 52  namespace LinuxSampler { namespace sfz {
52                     GetSampleRate());                     GetSampleRate());
53      }      }
54            
55        
56      void EGv2Unit::Trigger() {      void EGv2Unit::Trigger() {
57          EG.trigger(*pEGInfo, GetSampleRate(), pVoice->MIDIVelocity);          EG.trigger(*pEGInfo, GetSampleRate(), pVoice->MIDIVelocity);
58      }      }
59        
60        
61        void PitchEGUnit::Trigger() {
62            ::sfz::Region* const pRegion = pVoice->pRegion;
63            depth = pRegion->pitcheg_depth;
64            
65            // the length of the decay and release curves are dependent on the velocity
66            const double velrelease = 1 / pVoice->GetVelocityRelease(pVoice->MIDIVelocity);
67    
68            // set the delay trigger
69            uiDelayTrigger = (pRegion->pitcheg_delay + pRegion->pitcheg_vel2delay * velrelease) * GetSampleRate();
70            
71            EG.trigger(uint(pRegion->pitcheg_start * 10),
72                       std::max(0.0, pRegion->pitcheg_attack + pRegion->pitcheg_vel2attack * velrelease),
73                       std::max(0.0, pRegion->pitcheg_hold + pRegion->pitcheg_vel2hold * velrelease),
74                       std::max(0.0, pRegion->pitcheg_decay + pRegion->pitcheg_vel2decay * velrelease),
75                       uint(std::min(std::max(0.0, 10 * (pRegion->pitcheg_sustain + pRegion->pitcheg_vel2sustain * velrelease)), 1000.0)),
76                       std::max(0.0, pRegion->pitcheg_release + pRegion->pitcheg_vel2release * velrelease),
77                       GetSampleRate());
78        }
79        
80    
81        void LFOUnit::Increment() {
82            if (DelayStage()) return;
83            
84            SignalUnit::Increment();
85            
86            Level = lfo.render();
87        }
88        
89        void LFOUnit::Trigger() {
90            //reset
91            Level = 0;
92            
93            // set the delay trigger
94            uiDelayTrigger = pLfoInfo->delay * GetSampleRate();
95        }
96        
97        void LFOv2Unit::Trigger() {
98            LFOUnit::Trigger();
99            
100            lfo.trigger (
101                pLfoInfo->freq,
102                start_level_mid,
103                1, 0, false, GetSampleRate()
104            );
105            lfo.update(0);
106        }
107    
108    
109      EndpointUnit::EndpointUnit(SfzSignalUnitRack* rack): EndpointSignalUnit(rack) {      EndpointUnit::EndpointUnit(SfzSignalUnitRack* rack): EndpointSignalUnit(rack) {
# Line 89  namespace LinuxSampler { namespace sfz { Line 142  namespace LinuxSampler { namespace sfz {
142      }      }
143            
144      float EndpointUnit::GetFilterCutoff() {      float EndpointUnit::GetFilterCutoff() {
145          return 1;          float val = 1;
146            
147            for (int i = 0; i < GetRack()->filLFOs.size(); i++) {
148                LFOv2Unit* lfo = GetRack()->filLFOs[i];
149                if (!lfo->Active()) continue;
150                
151                float f = lfo->GetLevel() * lfo->pLfoInfo->cutoff;
152                val *= RTMath::CentsToFreqRatioUnlimited(f);
153            }
154            
155            return val;
156      }      }
157            
158      float EndpointUnit::GetPitch() {      float EndpointUnit::GetPitch() {
159          return 1;          EGv1Unit* u = &(GetRack()->suPitchEG);
160            double pitchEg = u->Active() ? RTMath::CentsToFreqRatioUnlimited(u->GetLevel() * u->depth) : 1;
161            return pitchEg;
162      }      }
163            
164      float EndpointUnit::GetResonance() {      float EndpointUnit::GetResonance() {
165          return 1;           float val = 0;
166            
167            for (int i = 0; i < GetRack()->resLFOs.size(); i++) {
168                LFOv2Unit* lfo = GetRack()->resLFOs[i];
169                if (!lfo->Active()) continue;
170                
171                val += lfo->GetLevel() * lfo->pLfoInfo->resonance;
172            }
173            
174            return val;
175        }
176        
177        float EndpointUnit::GetPan() {
178            float pan = 0;
179            
180            for (int i = 0; i < GetRack()->panLFOs.size(); i++) {
181                LFOv2Unit* lfo = GetRack()->panLFOs[i];
182                if (!lfo->Active()) continue;
183                
184                pan += lfo->GetLevel() * lfo->pLfoInfo->pan;
185            }
186            
187            if(pan < -100) return -100;
188            if(pan >  100) return  100;
189            
190            return pan;
191      }      }
192            
193            
194      SfzSignalUnitRack::SfzSignalUnitRack(Voice* voice)      SfzSignalUnitRack::SfzSignalUnitRack(Voice* voice)
195          : SignalUnitRack(MaxUnitCount), pVoice(voice), suEndpoint(this), suVolEG(this),          : SignalUnitRack(MaxUnitCount), pVoice(voice), suEndpoint(this), suVolEG(this), suPitchEG(this),
196          EGs(maxEgCount), volEGs(maxEgCount), pitchEGs(maxEgCount)          EGs(maxEgCount), volEGs(maxEgCount), pitchEGs(maxEgCount),
197            LFOs(maxLfoCount), filLFOs(maxLfoCount), resLFOs(maxLfoCount), panLFOs(maxLfoCount)
198      {      {
199          suEndpoint.pVoice = suVolEG.pVoice = voice;          suEndpoint.pVoice = suVolEG.pVoice = suPitchEG.pVoice = voice;
200                    
201          for (int i = 0; i < EGs.capacity(); i++) {          for (int i = 0; i < EGs.capacity(); i++) {
202              EGs[i] = new EGv2Unit(this);              EGs[i] = new EGv2Unit(this);
203              EGs[i]->pVoice = voice;              EGs[i]->pVoice = voice;
204          }          }
205            
206            for (int i = 0; i < LFOs.capacity(); i++) {
207                LFOs[i] = new LFOv2Unit(this);
208                LFOs[i]->pVoice = voice;
209            }
210      }      }
211            
212      SfzSignalUnitRack::~SfzSignalUnitRack() {      SfzSignalUnitRack::~SfzSignalUnitRack() {
213          for (int i = 0; i < maxEgCount; i++) {          for (int i = 0; i < EGs.capacity(); i++) {
214              delete EGs[i]; EGs[i] = NULL;              delete EGs[i]; EGs[i] = NULL;
215          }          }
216            
217            for (int i = 0; i < LFOs.capacity(); i++) {
218                delete LFOs[i]; LFOs[i] = NULL;
219            }
220      }      }
221            
222      void SfzSignalUnitRack::Trigger() {      void SfzSignalUnitRack::Trigger() {
# Line 124  namespace LinuxSampler { namespace sfz { Line 224  namespace LinuxSampler { namespace sfz {
224          volEGs.clear();          volEGs.clear();
225          pitchEGs.clear();          pitchEGs.clear();
226                    
227            LFOs.clear();
228            filLFOs.clear();
229            resLFOs.clear();
230            panLFOs.clear();
231            
232          ::sfz::Region* const pRegion = pVoice->pRegion;          ::sfz::Region* const pRegion = pVoice->pRegion;
233                    
234          for (int i = 0 ; i < pRegion->eg.size() ; i++) {          for (int i = 0; i < pRegion->eg.size(); i++) {
235              if (pRegion->eg[i].node.size() == 0) continue;              if (pRegion->eg[i].node.size() == 0) continue;
236                            
237              if(EGs.size() < EGs.capacity()) {              if(EGs.size() < EGs.capacity()) {
# Line 135  namespace LinuxSampler { namespace sfz { Line 240  namespace LinuxSampler { namespace sfz {
240                  EGs.increment()->Copy(eg);                  EGs.increment()->Copy(eg);
241              } else { std::cerr << "Maximum number of EGs reached!" << std::endl; break; }              } else { std::cerr << "Maximum number of EGs reached!" << std::endl; break; }
242                            
               
               
243              if (pRegion->eg[i].amplitude > 0) {              if (pRegion->eg[i].amplitude > 0) {
244                  if(volEGs.size() < volEGs.capacity()) volEGs.add(EGs[EGs.size() - 1]);                  if(volEGs.size() < volEGs.capacity()) volEGs.add(EGs[EGs.size() - 1]);
245                  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 251  namespace LinuxSampler { namespace sfz {
251              else pRegion->ampeg_sustain = 100;              else pRegion->ampeg_sustain = 100;
252          }          }
253                    
254            // LFO
255            for (int i = 0; i < pRegion->lfos.size(); i++) {
256                if (pRegion->lfos[i].freq == -1) continue; // Not initialized
257                
258                if(LFOs.size() < LFOs.capacity()) {
259                    LFOv2Unit lfo(this);
260                    lfo.pLfoInfo = &(pRegion->lfos[i]);
261                    LFOs.increment()->Copy(lfo);
262                } else { std::cerr << "Maximum number of LFOs reached!" << std::endl; break; }
263                
264                if (pRegion->lfos[i].cutoff != 0) {
265                    if(filLFOs.size() < filLFOs.capacity()) filLFOs.add(LFOs[LFOs.size() - 1]);
266                    else std::cerr << "Maximum number of LFOs reached!" << std::endl;
267                }
268                
269                if (pRegion->lfos[i].resonance != 0) {
270                    if(resLFOs.size() < resLFOs.capacity()) resLFOs.add(LFOs[LFOs.size() - 1]);
271                    else std::cerr << "Maximum number of LFOs reached!" << std::endl;
272                }
273                
274                if (pRegion->lfos[i].pan != 0) {
275                    if(panLFOs.size() < panLFOs.capacity()) panLFOs.add(LFOs[LFOs.size() - 1]);
276                    else std::cerr << "Maximum number of LFOs reached!" << std::endl;
277                }
278            }
279            
280          Units.clear();          Units.clear();
281                    
282          Units.add(&suVolEG);          Units.add(&suVolEG);
283            Units.add(&suPitchEG);
284                    
285          for (int i = 0 ; i < EGs.size() ; i++) {          for (int i = 0; i < EGs.size(); i++) {
286              Units.add(EGs[i]);              Units.add(EGs[i]);
287          }          }
288                    
289            for (int i = 0; i < LFOs.size(); i++) {
290                Units.add(LFOs[i]);
291            }
292            
293          Units.add(&suEndpoint);          Units.add(&suEndpoint);
294                    
295          SignalUnitRack::Trigger();          SignalUnitRack::Trigger();

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

  ViewVC Help
Powered by ViewVC