/[svn]/linuxsampler/trunk/src/engines/sf2/SF2SignalUnitRack.cpp
ViewVC logotype

Diff of /linuxsampler/trunk/src/engines/sf2/SF2SignalUnitRack.cpp

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 2206 by iliev, Mon Jul 11 17:52:01 2011 UTC revision 2207 by iliev, Fri Jul 15 15:43:49 2011 UTC
# Line 39  namespace LinuxSampler { namespace sf2 { Line 39  namespace LinuxSampler { namespace sf2 {
39          double d = pOwner->GetSampleRate() / CONFIG_DEFAULT_SUBFRAGMENT_SIZE;          double d = pOwner->GetSampleRate() / CONFIG_DEFAULT_SUBFRAGMENT_SIZE;
40          uiDelayTrigger = pOwner->pRegion->GetEG1PreAttackDelay(pOwner->pPresetRegion) * d;          uiDelayTrigger = pOwner->pRegion->GetEG1PreAttackDelay(pOwner->pPresetRegion) * d;
41          ////////////          ////////////
42                
43            // GetEG1Sustain gets the decrease in level in centibels
44            uint sustain = ::sf2::ToRatio(-1 * pOwner->pRegion->GetEG1Sustain(pOwner->pPresetRegion)) * 1000; // in permille
45            
46          trigger (          trigger (
47              0, // should be in permille              0, // should be in permille
48              pOwner->pRegion->GetEG1Attack(pOwner->pPresetRegion),              pOwner->pRegion->GetEG1Attack(pOwner->pPresetRegion),
49              pOwner->pRegion->GetEG1Hold(pOwner->pPresetRegion),              pOwner->pRegion->GetEG1Hold(pOwner->pPresetRegion),
50              pOwner->pRegion->GetEG1Decay(pOwner->pPresetRegion),              pOwner->pRegion->GetEG1Decay(pOwner->pPresetRegion),
51              uint(pOwner->pRegion->GetEG1Sustain(pOwner->pPresetRegion)),              sustain,
52              pOwner->pRegion->GetEG1Release(pOwner->pPresetRegion),              pOwner->pRegion->GetEG1Release(pOwner->pPresetRegion),
53              pOwner->GetSampleRate() / CONFIG_DEFAULT_SUBFRAGMENT_SIZE              pOwner->GetSampleRate() / CONFIG_DEFAULT_SUBFRAGMENT_SIZE
54          );          );
# Line 94  namespace LinuxSampler { namespace sf2 { Line 97  namespace LinuxSampler { namespace sf2 {
97              pOwner->pRegion->GetEG2Attack(pOwner->pPresetRegion),              pOwner->pRegion->GetEG2Attack(pOwner->pPresetRegion),
98              pOwner->pRegion->GetEG2Hold(pOwner->pPresetRegion),              pOwner->pRegion->GetEG2Hold(pOwner->pPresetRegion),
99              pOwner->pRegion->GetEG2Decay(pOwner->pPresetRegion),              pOwner->pRegion->GetEG2Decay(pOwner->pPresetRegion),
100              uint(pOwner->pRegion->GetEG2Sustain(pOwner->pPresetRegion)),              uint(1000 - pOwner->pRegion->GetEG2Sustain(pOwner->pPresetRegion)),
101              pOwner->pRegion->GetEG2Release(pOwner->pPresetRegion),              pOwner->pRegion->GetEG2Release(pOwner->pPresetRegion),
102              pOwner->GetSampleRate() / CONFIG_DEFAULT_SUBFRAGMENT_SIZE              pOwner->GetSampleRate() / CONFIG_DEFAULT_SUBFRAGMENT_SIZE
103          );          );
# Line 128  namespace LinuxSampler { namespace sf2 { Line 131  namespace LinuxSampler { namespace sf2 {
131      }      }
132    
133    
134        void ModLfoUnit::Trigger() {
135            //reset
136            Level = 0;
137            
138            // set the delay trigger
139            double samplerate = pOwner->GetSampleRate() / CONFIG_DEFAULT_SUBFRAGMENT_SIZE;
140            uiDelayTrigger = pOwner->pRegion->GetDelayModLfo(pOwner->pPresetRegion) * samplerate;
141            ////////////
142                
143            trigger (
144                pOwner->pRegion->GetFreqModLfo(pOwner->pPresetRegion),
145                start_level_min,
146                1, 0, false, samplerate
147            );
148            update(0);
149        }
150    
151        void ModLfoUnit::Increment() {
152            if (DelayStage()) return;
153            
154            SignalUnitBase<Voice>::Increment();
155            
156            Level = render();
157        }
158    
159    
160      void VibLfoUnit::Trigger() {      void VibLfoUnit::Trigger() {
161            //reset
162            Level = 0;
163    
164          // set the delay trigger          // set the delay trigger
165          double samplerate = pOwner->GetSampleRate() / CONFIG_DEFAULT_SUBFRAGMENT_SIZE;          double samplerate = pOwner->GetSampleRate() / CONFIG_DEFAULT_SUBFRAGMENT_SIZE;
166          uiDelayTrigger = pOwner->pRegion->GetDelayVibLfo(pOwner->pPresetRegion) * samplerate;          uiDelayTrigger = pOwner->pRegion->GetDelayVibLfo(pOwner->pPresetRegion) * samplerate;
# Line 142  namespace LinuxSampler { namespace sf2 { Line 174  namespace LinuxSampler { namespace sf2 {
174          );          );
175          update(0);          update(0);
176      }      }
177    
178      void VibLfoUnit::Increment() {      void VibLfoUnit::Increment() {
179          if (DelayStage()) return;          if (DelayStage()) return;
180                    
# Line 149  namespace LinuxSampler { namespace sf2 { Line 182  namespace LinuxSampler { namespace sf2 {
182                    
183          Level = render();          Level = render();
184      }      }
       
185    
186      void EndpointUnit::Trigger() {  
187        EndpointUnit::EndpointUnit() {
188                    
189      }      }
190    
191        void EndpointUnit::Trigger() {
192            prmModEgPitch->Coeff = pOwner->pRegion->GetModEnvToPitch(pOwner->pPresetRegion);
193            if (prmModEgPitch->Coeff == ::sf2::NONE) prmModEgPitch->Coeff = 0;
194    
195            prmModEgCutoff->Coeff = pOwner->pRegion->GetModEnvToFilterFc(pOwner->pPresetRegion); // cents
196            if (prmModEgCutoff->Coeff == ::sf2::NONE) prmModEgCutoff->Coeff = 0;
197    
198            prmModLfoVol->Coeff = pOwner->pRegion->GetModLfoToVolume(pOwner->pPresetRegion); // centibels
199            if (prmModLfoVol->Coeff == ::sf2::NONE) prmModLfoVol->Coeff = 0;
200    
201            prmModLfoCutoff->Coeff = pOwner->pRegion->GetModLfoToFilterFc(pOwner->pPresetRegion);
202            if (prmModLfoCutoff->Coeff == ::sf2::NONE) prmModLfoCutoff->Coeff = 0;
203    
204            prmModLfoPitch->Coeff = pOwner->pRegion->GetModLfoToPitch(pOwner->pPresetRegion);
205            if (prmModLfoPitch->Coeff == ::sf2::NONE) prmModLfoPitch->Coeff = 0;
206        }
207            
208      bool EndpointUnit::Active() {      bool EndpointUnit::Active() {
209          if (Params.size() < 1) return false;          if (Params.size() < 1) return false;
210          return Params[0].pUnit->Active(); // volEGUnit          return prmVolEg->pUnit->Active(); // volEGUnit
211      }      }
212            
213      float EndpointUnit::GetVolume() {      float EndpointUnit::GetVolume() {
214          if (Params.size() < 1) return 0;          if (!prmVolEg->pUnit->Active()) return 0;
215          return Params[0].pUnit->Active() ? Params[0].GetFinalValue() : 0;          return prmVolEg->GetValue() *
216                   ::sf2::ToRatio(prmModLfoVol->GetValue() /*logarithmically modified */);
217      }      }
218            
219      float EndpointUnit::GetFilterCutoff() {      float EndpointUnit::GetFilterCutoff() {
220          return 1;          double modEg, modLfo;
221            modEg = prmModEgCutoff->pUnit->Active() ? prmModEgCutoff->GetValue() : 0;
222            modEg = RTMath::CentsToFreqRatioUnlimited(modEg);
223            
224            modLfo = prmModLfoCutoff->pUnit->Active() ? prmModLfoCutoff->GetValue() : 0;
225            modLfo = RTMath::CentsToFreqRatioUnlimited(modLfo);
226            
227            return modEg * modLfo;
228      }      }
229            
230      float EndpointUnit::GetPitch() {      float EndpointUnit::GetPitch() {
231          if (Params.size() < 3) return 0;          double modEg, modLfo, vibLfo;
232          double eg  = Params[1].pUnit->Active() ? RTMath::CentsToFreqRatio(Params[1].GetFinalValue()) : 1;          modEg  = prmModEgPitch->pUnit->Active() ? RTMath::CentsToFreqRatioUnlimited(prmModEgPitch->GetValue()) : 1;
233          double lfo = Params[2].pUnit->Active() ? RTMath::CentsToFreqRatio(Params[2].GetFinalValue()) : 1;          modLfo = prmModLfoPitch->pUnit->Active() ? RTMath::CentsToFreqRatioUnlimited(prmModLfoPitch->GetValue()) : 1;
234            vibLfo = prmVibLfo->pUnit->Active() ? RTMath::CentsToFreqRatioUnlimited(prmVibLfo->GetValue()) : 1;
235                    
236          return eg * lfo;          return modEg * modLfo * vibLfo;
237      }      }
238            
239      float EndpointUnit::GetResonance() {      float EndpointUnit::GetResonance() {
# Line 184  namespace LinuxSampler { namespace sf2 { Line 243  namespace LinuxSampler { namespace sf2 {
243      SF2SignalUnitRack::SF2SignalUnitRack(Voice* pVoice): SignalUnitRackBase<Voice>(pVoice) {      SF2SignalUnitRack::SF2SignalUnitRack(Voice* pVoice): SignalUnitRackBase<Voice>(pVoice) {
244          Units.add(&suVolEG);          Units.add(&suVolEG);
245          Units.add(&suModEG);          Units.add(&suModEG);
246            Units.add(&suModLfo);
247          Units.add(&suVibLfo);          Units.add(&suVibLfo);
248          Units.add(&suEndpoint);          Units.add(&suEndpoint);
249                    
250          // Volume envelope          // Volume envelope
251          suEndpoint.Params.add(SignalUnit::Parameter(&suVolEG));          suEndpoint.Params.add(SignalUnit::Parameter(&suVolEG)); // Volume
252          // Modulation envelope          // Modulation envelope
253          suEndpoint.Params.add(SignalUnit::Parameter(&suModEG));          suEndpoint.Params.add(SignalUnit::Parameter(&suModEG)); // Pitch
254            suEndpoint.Params.add(SignalUnit::Parameter(&suModEG)); // Filter cutoff
255            // Modulation LFO
256            suEndpoint.Params.add(SignalUnit::Parameter(&suModLfo)); // Volume
257            suEndpoint.Params.add(SignalUnit::Parameter(&suModLfo)); // Pitch
258            suEndpoint.Params.add(SignalUnit::Parameter(&suModLfo)); // Filter cutoff
259          // Vibrato LFO          // Vibrato LFO
260          suEndpoint.Params.add(SignalUnit::Parameter(&suVibLfo));          suEndpoint.Params.add(SignalUnit::Parameter(&suVibLfo)); // Pitch
261    
262            /* This should be done at the end because when a parameter is added to
263               ArrayList a new copy is made for all parameters */
264            suEndpoint.prmVolEg = &suEndpoint.Params[0];
265            suEndpoint.prmModEgPitch = &suEndpoint.Params[1];
266            suEndpoint.prmModEgCutoff = &suEndpoint.Params[2];
267            suEndpoint.prmModLfoVol = &suEndpoint.Params[3];
268            suEndpoint.prmModLfoPitch = &suEndpoint.Params[4];
269            suEndpoint.prmModLfoCutoff = &suEndpoint.Params[5];
270            suEndpoint.prmVibLfo = &suEndpoint.Params[6];
271      }      }
272            
273      void SF2SignalUnitRack::Trigger() {      void SF2SignalUnitRack::Trigger() {
274          // The region settings are available after the voice is triggered          // The region settings are available after the voice is triggered
275    
         // Modulation envelope  
         int pitch = pOwner->pRegion->GetModEnvToPitch(pOwner->pPresetRegion);  
         suEndpoint.Params[1].Coeff = pitch;  
         ///////  
   
276          SignalUnitRackBase<Voice>::Trigger();          SignalUnitRackBase<Voice>::Trigger();
277      }      }
278            

Legend:
Removed from v.2206  
changed lines
  Added in v.2207

  ViewVC Help
Powered by ViewVC