/[svn]/linuxsampler/trunk/src/engines/common/AbstractVoice.cpp
ViewVC logotype

Diff of /linuxsampler/trunk/src/engines/common/AbstractVoice.cpp

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

revision 3246 by schoenebeck, Sun May 28 22:22:56 2017 UTC revision 3564 by schoenebeck, Sat Aug 24 09:18:57 2019 UTC
# Line 152  namespace LinuxSampler { Line 152  namespace LinuxSampler {
152    
153          VolumeSmoother.trigger(pEngineChannel->MidiVolume, subfragmentRate);          VolumeSmoother.trigger(pEngineChannel->MidiVolume, subfragmentRate);
154          NoteVolume.setCurveOnly(pNote ? pNote->Override.VolumeCurve : DEFAULT_FADE_CURVE);          NoteVolume.setCurveOnly(pNote ? pNote->Override.VolumeCurve : DEFAULT_FADE_CURVE);
155          NoteVolume.setCurrentValue(pNote ? pNote->Override.Volume : 1.f);          NoteVolume.setCurrentValue(pNote ? pNote->Override.Volume.Value : 1.f);
156          NoteVolume.setDefaultDuration(pNote ? pNote->Override.VolumeTime : DEFAULT_NOTE_VOLUME_TIME_S);          NoteVolume.setDefaultDuration(pNote ? pNote->Override.VolumeTime : DEFAULT_NOTE_VOLUME_TIME_S);
157            NoteVolume.setFinal(pNote ? pNote->Override.Volume.Final : false);
158    
159          // Check if the sample needs disk streaming or is too short for that          // Check if the sample needs disk streaming or is too short for that
160          long cachedsamples = GetSampleCacheSize() / SmplInfo.FrameSize;          long cachedsamples = GetSampleCacheSize() / SmplInfo.FrameSize;
# Line 194  namespace LinuxSampler { Line 195  namespace LinuxSampler {
195    
196          Pitch = CalculatePitchInfo(PitchBend);          Pitch = CalculatePitchInfo(PitchBend);
197          NotePitch.setCurveOnly(pNote ? pNote->Override.PitchCurve : DEFAULT_FADE_CURVE);          NotePitch.setCurveOnly(pNote ? pNote->Override.PitchCurve : DEFAULT_FADE_CURVE);
198          NotePitch.setCurrentValue(pNote ? pNote->Override.Pitch : 1.0f);          NotePitch.setCurrentValue(pNote ? pNote->Override.Pitch.Value : 1.0f);
199            NotePitch.setFinal(pNote ? pNote->Override.Pitch.Final : false);
200          NotePitch.setDefaultDuration(pNote ? pNote->Override.PitchTime : DEFAULT_NOTE_PITCH_TIME_S);          NotePitch.setDefaultDuration(pNote ? pNote->Override.PitchTime : DEFAULT_NOTE_PITCH_TIME_S);
201          NoteCutoff = (pNote) ? pNote->Override.Cutoff : 1.0f;          NoteCutoff.Value = (pNote) ? pNote->Override.Cutoff.Value : 1.0f;
202          NoteResonance = (pNote) ? pNote->Override.Resonance : 1.0f;          NoteCutoff.Final = (pNote) ? pNote->Override.Cutoff.isFinal() : false;
203            NoteResonance.Value = (pNote) ? pNote->Override.Resonance.Value : 1.0f;
204            NoteResonance.Final = (pNote) ? pNote->Override.Resonance.Final : false;
205    
206          // 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
207          const double velrelease = 1 / GetVelocityRelease(MIDIVelocity());          const double velrelease = 1 / GetVelocityRelease(MIDIVelocity());
# Line 210  namespace LinuxSampler { Line 214  namespace LinuxSampler {
214              EGInfo egInfo = CalculateEG1ControllerInfluence(eg1controllervalue);              EGInfo egInfo = CalculateEG1ControllerInfluence(eg1controllervalue);
215    
216              if (pNote) {              if (pNote) {
217                  egInfo.Attack  *= pNote->Override.Attack;                  pNote->Override.Attack.applyTo(egInfo.Attack);
218                  egInfo.Decay   *= pNote->Override.Decay;                  pNote->Override.Decay.applyTo(egInfo.Decay);
219                  egInfo.Release *= pNote->Override.Release;                  pNote->Override.Release.applyTo(egInfo.Release);
220              }              }
221    
222              TriggerEG1(egInfo, velrelease, velocityAttenuation, GetEngine()->SampleRate, MIDIVelocity());              TriggerEG1(egInfo, velrelease, velocityAttenuation, GetEngine()->SampleRate, MIDIVelocity());
# Line 221  namespace LinuxSampler { Line 225  namespace LinuxSampler {
225          }          }
226    
227          const uint8_t pan = (pSignalUnitRack) ? pSignalUnitRack->GetEndpointUnit()->CalculatePan(MIDIPan) : MIDIPan;          const uint8_t pan = (pSignalUnitRack) ? pSignalUnitRack->GetEndpointUnit()->CalculatePan(MIDIPan) : MIDIPan;
228          NotePanLeft  = (pNote) ? AbstractEngine::PanCurveValueNorm(pNote->Override.Pan, 0 /*left*/ ) : 1.f;          for (int c = 0; c < 2; ++c) {
229          NotePanRight = (pNote) ? AbstractEngine::PanCurveValueNorm(pNote->Override.Pan, 1 /*right*/) : 1.f;              float value = (pNote) ? AbstractEngine::PanCurveValueNorm(pNote->Override.Pan.Value, c) : 1.f;
230                NotePan[c].setCurveOnly(pNote ? pNote->Override.PanCurve : DEFAULT_FADE_CURVE);
231                NotePan[c].setCurrentValue(value);
232                NotePan[c].setFinal(pNote ? pNote->Override.Pan.Final : false);
233                NotePan[c].setDefaultDuration(pNote ? pNote->Override.PanTime : DEFAULT_NOTE_PAN_TIME_S);
234            }
235    
236          PanLeftSmoother.trigger(          PanLeftSmoother.trigger(
237              AbstractEngine::PanCurve[128 - pan] * NotePanLeft,              AbstractEngine::PanCurve[128 - pan],
238              quickRampRate //NOTE: maybe we should have 2 separate pan smoothers, one for MIDI CC10 (with slow rate) and one for instrument script change_pan() calls (with fast rate)              quickRampRate //NOTE: maybe we should have 2 separate pan smoothers, one for MIDI CC10 (with slow rate) and one for instrument script change_pan() calls (with fast rate)
239          );          );
240          PanRightSmoother.trigger(          PanRightSmoother.trigger(
241              AbstractEngine::PanCurve[pan] * NotePanRight,              AbstractEngine::PanCurve[pan],
242              quickRampRate //NOTE: maybe we should have 2 separate pan smoothers, one for MIDI CC10 (with slow rate) and one for instrument script change_pan() calls (with fast rate)              quickRampRate //NOTE: maybe we should have 2 separate pan smoothers, one for MIDI CC10 (with slow rate) and one for instrument script change_pan() calls (with fast rate)
243          );          );
244    
# Line 242  namespace LinuxSampler { Line 252  namespace LinuxSampler {
252          else          else
253      #else      #else
254          {          {
255              float finalVolume;              float finalVolume = pEngineChannel->MidiVolume * crossfadeVolume;
256                float fModVolume;
257              if (pSignalUnitRack == NULL) {              if (pSignalUnitRack == NULL) {
258                  finalVolume = pEngineChannel->MidiVolume * crossfadeVolume * pEG1->getLevel();                  fModVolume = pEG1->getLevel();
259              } else {              } else {
260                  finalVolume = pEngineChannel->MidiVolume * crossfadeVolume * pSignalUnitRack->GetEndpointUnit()->GetVolume();                  fModVolume = pSignalUnitRack->GetEndpointUnit()->GetVolume();
261              }              }
262                NoteVolume.applyCurrentValueTo(fModVolume);
263                finalVolume *= fModVolume;
264    
265              finalSynthesisParameters.fFinalVolumeLeft  = finalVolume * VolumeLeft  * PanLeftSmoother.render();              float panL = PanLeftSmoother.render();
266              finalSynthesisParameters.fFinalVolumeRight = finalVolume * VolumeRight * PanRightSmoother.render();              float panR = PanRightSmoother.render();
267                NotePan[0].applyCurrentValueTo(panL);
268                NotePan[1].applyCurrentValueTo(panR);
269    
270                finalSynthesisParameters.fFinalVolumeLeft  = finalVolume * VolumeLeft  * panL;
271                finalSynthesisParameters.fFinalVolumeRight = finalVolume * VolumeRight * panR;
272          }          }
273      #endif      #endif
274  #endif  #endif
# Line 264  namespace LinuxSampler { Line 282  namespace LinuxSampler {
282                  // calculate influence of EG2 controller on EG2's parameters                  // calculate influence of EG2 controller on EG2's parameters
283                  EGInfo egInfo = CalculateEG2ControllerInfluence(eg2controllervalue);                  EGInfo egInfo = CalculateEG2ControllerInfluence(eg2controllervalue);
284    
285                    if (pNote) {
286                        pNote->Override.CutoffAttack.applyTo(egInfo.Attack);
287                        pNote->Override.CutoffDecay.applyTo(egInfo.Decay);
288                        pNote->Override.CutoffRelease.applyTo(egInfo.Release);
289                    }
290    
291                  TriggerEG2(egInfo, velrelease, velocityAttenuation, GetEngine()->SampleRate, MIDIVelocity());                  TriggerEG2(egInfo, velrelease, velocityAttenuation, GetEngine()->SampleRate, MIDIVelocity());
292              }              }
293    
# Line 348  namespace LinuxSampler { Line 372  namespace LinuxSampler {
372      }      }
373            
374      void AbstractVoice::SetSampleStartOffset() {      void AbstractVoice::SetSampleStartOffset() {
375          finalSynthesisParameters.dPos = RgnInfo.SampleStartOffset; // offset where we should start playback of sample (0 - 2000 sample points)          double pos = RgnInfo.SampleStartOffset; // offset where we should start playback of sample
376          Pos = RgnInfo.SampleStartOffset;  
377            // if another sample playback start position was requested by instrument
378            // script (built-in script function play_note())
379            if (pNote && pNote->Override.SampleOffset >= 0) {
380                double overridePos =
381                    double(SmplInfo.SampleRate) * double(pNote->Override.SampleOffset) / 1000000.0;
382                if (overridePos < SmplInfo.TotalFrameCount)
383                    pos = overridePos;
384            }
385    
386            finalSynthesisParameters.dPos = pos;
387            Pos = pos;
388      }      }
389    
390      /**      /**
# Line 457  namespace LinuxSampler { Line 492  namespace LinuxSampler {
492              uint8_t pan = MIDIPan;              uint8_t pan = MIDIPan;
493              if (pSignalUnitRack != NULL) pan = pSignalUnitRack->GetEndpointUnit()->CalculatePan(MIDIPan);              if (pSignalUnitRack != NULL) pan = pSignalUnitRack->GetEndpointUnit()->CalculatePan(MIDIPan);
494    
495              PanLeftSmoother.update(AbstractEngine::PanCurve[128 - pan] * NotePanLeft);              PanLeftSmoother.update(AbstractEngine::PanCurve[128 - pan]);
496              PanRightSmoother.update(AbstractEngine::PanCurve[pan]      * NotePanRight);              PanRightSmoother.update(AbstractEngine::PanCurve[pan]);
497    
498              finalSynthesisParameters.fFinalPitch = Pitch.PitchBase * Pitch.PitchBend * NotePitch.render();              finalSynthesisParameters.fFinalPitch = Pitch.PitchBase * Pitch.PitchBend;
499    
500              float fFinalVolume = VolumeSmoother.render() * CrossfadeSmoother.render() * NoteVolume.render();              float fFinalVolume = VolumeSmoother.render() * CrossfadeSmoother.render();
501  #ifdef CONFIG_PROCESS_MUTED_CHANNELS  #ifdef CONFIG_PROCESS_MUTED_CHANNELS
502              if (pChannel->GetMute()) fFinalVolume = 0;              if (pChannel->GetMute()) fFinalVolume = 0;
503  #endif  #endif
# Line 470  namespace LinuxSampler { Line 505  namespace LinuxSampler {
505              // process transition events (note on, note off & sustain pedal)              // process transition events (note on, note off & sustain pedal)
506              processTransitionEvents(itNoteEvent, iSubFragmentEnd);              processTransitionEvents(itNoteEvent, iSubFragmentEnd);
507              processGroupEvents(itGroupEvent, iSubFragmentEnd);              processGroupEvents(itGroupEvent, iSubFragmentEnd);
508                
509                float fModVolume = 1;
510                float fModPitch  = 1;
511    
512              if (pSignalUnitRack == NULL) {              if (pSignalUnitRack == NULL) {
513                  // if the voice was killed in this subfragment, or if the                  // if the voice was killed in this subfragment, or if the
514                  // filter EG is finished, switch EG1 to fade out stage                  // filter EG is finished, switch EG1 to fade out stage
# Line 484  namespace LinuxSampler { Line 522  namespace LinuxSampler {
522                  // process envelope generators                  // process envelope generators
523                  switch (pEG1->getSegmentType()) {                  switch (pEG1->getSegmentType()) {
524                      case EG::segment_lin:                      case EG::segment_lin:
525                          fFinalVolume *= pEG1->processLin();                          fModVolume *= pEG1->processLin();
526                          break;                          break;
527                      case EG::segment_exp:                      case EG::segment_exp:
528                          fFinalVolume *= pEG1->processExp();                          fModVolume *= pEG1->processExp();
529                          break;                          break;
530                      case EG::segment_end:                      case EG::segment_end:
531                          fFinalVolume *= pEG1->getLevel();                          fModVolume *= pEG1->getLevel();
532                          break; // noop                          break; // noop
533                      case EG::segment_pow:                      case EG::segment_pow:
534                          fFinalVolume *= pEG1->processPow();                          fModVolume *= pEG1->processPow();
535                          break;                          break;
536                  }                  }
537                  switch (pEG2->getSegmentType()) {                  switch (pEG2->getSegmentType()) {
# Line 510  namespace LinuxSampler { Line 548  namespace LinuxSampler {
548                          fFinalCutoff *= pEG2->processPow();                          fFinalCutoff *= pEG2->processPow();
549                          break;                          break;
550                  }                  }
551                  if (EG3.active()) finalSynthesisParameters.fFinalPitch *= EG3.render();                  if (EG3.active()) fModPitch *= EG3.render();
552    
553                  // process low frequency oscillators                  // process low frequency oscillators
554                  if (bLFO1Enabled) fFinalVolume *= (1.0f - pLFO1->render());                  if (bLFO1Enabled) fModVolume   *= (1.0f - pLFO1->render());
555                  if (bLFO2Enabled) fFinalCutoff *= (1.0f - pLFO2->render());                  if (bLFO2Enabled) fFinalCutoff *= (1.0f - pLFO2->render());
556                  if (bLFO3Enabled) finalSynthesisParameters.fFinalPitch *= RTMath::CentsToFreqRatio(pLFO3->render());                  if (bLFO3Enabled) fModPitch *= RTMath::CentsToFreqRatio(pLFO3->render());
557              } else {              } else {
558                  // if the voice was killed in this subfragment, enter fade out stage                  // if the voice was killed in this subfragment, enter fade out stage
559                  if (itKillEvent && killPos <= iSubFragmentEnd) {                  if (itKillEvent && killPos <= iSubFragmentEnd) {
# Line 535  namespace LinuxSampler { Line 573  namespace LinuxSampler {
573                  fFinalCutoff    = pSignalUnitRack->GetEndpointUnit()->CalculateFilterCutoff(fFinalCutoff);                  fFinalCutoff    = pSignalUnitRack->GetEndpointUnit()->CalculateFilterCutoff(fFinalCutoff);
574                  fFinalResonance = pSignalUnitRack->GetEndpointUnit()->CalculateResonance(fFinalResonance);                  fFinalResonance = pSignalUnitRack->GetEndpointUnit()->CalculateResonance(fFinalResonance);
575                                    
576                  finalSynthesisParameters.fFinalPitch =                  fModPitch = pSignalUnitRack->GetEndpointUnit()->CalculatePitch(fModPitch);
                     pSignalUnitRack->GetEndpointUnit()->CalculatePitch(finalSynthesisParameters.fFinalPitch);  
                       
577              }              }
578    
579              fFinalCutoff    *= NoteCutoff;              NoteVolume.renderApplyTo(fModVolume);
580              fFinalResonance *= NoteResonance;              NotePitch.renderApplyTo(fModPitch);
581                NoteCutoff.applyTo(fFinalCutoff);
582                NoteResonance.applyTo(fFinalResonance);
583    
584                fFinalVolume *= fModVolume;
585    
586                finalSynthesisParameters.fFinalPitch *= fModPitch;
587    
588              // limit the pitch so we don't read outside the buffer              // limit the pitch so we don't read outside the buffer
589              finalSynthesisParameters.fFinalPitch = RTMath::Min(finalSynthesisParameters.fFinalPitch, float(1 << CONFIG_MAX_PITCH));              finalSynthesisParameters.fFinalPitch = RTMath::Min(finalSynthesisParameters.fFinalPitch, float(1 << CONFIG_MAX_PITCH));
# Line 561  namespace LinuxSampler { Line 603  namespace LinuxSampler {
603    
604              // prepare final synthesis parameters structure              // prepare final synthesis parameters structure
605              finalSynthesisParameters.uiToGo            = iSubFragmentEnd - i;              finalSynthesisParameters.uiToGo            = iSubFragmentEnd - i;
606    
607                float panL = PanLeftSmoother.render();
608                float panR = PanRightSmoother.render();
609                NotePan[0].renderApplyTo(panL);
610                NotePan[1].renderApplyTo(panR);
611    
612  #ifdef CONFIG_INTERPOLATE_VOLUME  #ifdef CONFIG_INTERPOLATE_VOLUME
613              finalSynthesisParameters.fFinalVolumeDeltaLeft  =              finalSynthesisParameters.fFinalVolumeDeltaLeft  =
614                  (fFinalVolume * VolumeLeft  * PanLeftSmoother.render() -                  (fFinalVolume * VolumeLeft  * panL -
615                   finalSynthesisParameters.fFinalVolumeLeft) / finalSynthesisParameters.uiToGo;                   finalSynthesisParameters.fFinalVolumeLeft) / finalSynthesisParameters.uiToGo;
616              finalSynthesisParameters.fFinalVolumeDeltaRight =              finalSynthesisParameters.fFinalVolumeDeltaRight =
617                  (fFinalVolume * VolumeRight * PanRightSmoother.render() -                  (fFinalVolume * VolumeRight * panR -
618                   finalSynthesisParameters.fFinalVolumeRight) / finalSynthesisParameters.uiToGo;                   finalSynthesisParameters.fFinalVolumeRight) / finalSynthesisParameters.uiToGo;
619  #else  #else
620              finalSynthesisParameters.fFinalVolumeLeft  =              finalSynthesisParameters.fFinalVolumeLeft  =
621                  fFinalVolume * VolumeLeft  * PanLeftSmoother.render();                  fFinalVolume * VolumeLeft  * panL;
622              finalSynthesisParameters.fFinalVolumeRight =              finalSynthesisParameters.fFinalVolumeRight =
623                  fFinalVolume * VolumeRight * PanRightSmoother.render();                  fFinalVolume * VolumeRight * panR;
624  #endif  #endif
625              // render audio for one subfragment              // render audio for one subfragment
626              if (!delay) RunSynthesisFunction(SynthesisMode, &finalSynthesisParameters, &loop);              if (!delay) RunSynthesisFunction(SynthesisMode, &finalSynthesisParameters, &loop);
# Line 746  namespace LinuxSampler { Line 794  namespace LinuxSampler {
794                  switch (itEvent->Param.NoteSynthParam.Type) {                  switch (itEvent->Param.NoteSynthParam.Type) {
795                      case Event::synth_param_volume:                      case Event::synth_param_volume:
796                          NoteVolume.fadeTo(itEvent->Param.NoteSynthParam.AbsValue, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE);                          NoteVolume.fadeTo(itEvent->Param.NoteSynthParam.AbsValue, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE);
797                            NoteVolume.setFinal(itEvent->Param.NoteSynthParam.isFinal());
798                          break;                          break;
799                      case Event::synth_param_volume_time:                      case Event::synth_param_volume_time:
800                          NoteVolume.setDefaultDuration(itEvent->Param.NoteSynthParam.AbsValue);                          NoteVolume.setDefaultDuration(itEvent->Param.NoteSynthParam.AbsValue);
# Line 755  namespace LinuxSampler { Line 804  namespace LinuxSampler {
804                          break;                          break;
805                      case Event::synth_param_pitch:                      case Event::synth_param_pitch:
806                          NotePitch.fadeTo(itEvent->Param.NoteSynthParam.AbsValue, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE);                          NotePitch.fadeTo(itEvent->Param.NoteSynthParam.AbsValue, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE);
807                            NotePitch.setFinal(itEvent->Param.NoteSynthParam.isFinal());
808                          break;                          break;
809                      case Event::synth_param_pitch_time:                      case Event::synth_param_pitch_time:
810                          NotePitch.setDefaultDuration(itEvent->Param.NoteSynthParam.AbsValue);                          NotePitch.setDefaultDuration(itEvent->Param.NoteSynthParam.AbsValue);
# Line 763  namespace LinuxSampler { Line 813  namespace LinuxSampler {
813                          NotePitch.setCurve((fade_curve_t)itEvent->Param.NoteSynthParam.AbsValue, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE);                          NotePitch.setCurve((fade_curve_t)itEvent->Param.NoteSynthParam.AbsValue, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE);
814                          break;                          break;
815                      case Event::synth_param_pan:                      case Event::synth_param_pan:
816                          NotePanLeft  = AbstractEngine::PanCurveValueNorm(itEvent->Param.NoteSynthParam.AbsValue, 0 /*left*/);                          NotePan[0].fadeTo(
817                          NotePanRight = AbstractEngine::PanCurveValueNorm(itEvent->Param.NoteSynthParam.AbsValue, 1 /*right*/);                              AbstractEngine::PanCurveValueNorm(itEvent->Param.NoteSynthParam.AbsValue, 0 /*left*/),
818                                GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE
819                            );
820                            NotePan[1].fadeTo(
821                                AbstractEngine::PanCurveValueNorm(itEvent->Param.NoteSynthParam.AbsValue, 1 /*right*/),
822                                GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE
823                            );
824                            NotePan[0].setFinal(itEvent->Param.NoteSynthParam.isFinal());
825                            NotePan[1].setFinal(itEvent->Param.NoteSynthParam.isFinal());
826                            break;
827                        case Event::synth_param_pan_time:
828                            NotePan[0].setDefaultDuration(itEvent->Param.NoteSynthParam.AbsValue);
829                            NotePan[1].setDefaultDuration(itEvent->Param.NoteSynthParam.AbsValue);
830                            break;
831                        case Event::synth_param_pan_curve:
832                            NotePan[0].setCurve((fade_curve_t)itEvent->Param.NoteSynthParam.AbsValue, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE);
833                            NotePan[1].setCurve((fade_curve_t)itEvent->Param.NoteSynthParam.AbsValue, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE);
834                          break;                          break;
835                      case Event::synth_param_cutoff:                      case Event::synth_param_cutoff:
836                          NoteCutoff = itEvent->Param.NoteSynthParam.AbsValue;                          NoteCutoff.Value = itEvent->Param.NoteSynthParam.AbsValue;
837                            NoteCutoff.Final = itEvent->Param.NoteSynthParam.isFinal();
838                          break;                          break;
839                      case Event::synth_param_resonance:                      case Event::synth_param_resonance:
840                          NoteResonance = itEvent->Param.NoteSynthParam.AbsValue;                          NoteResonance.Value = itEvent->Param.NoteSynthParam.AbsValue;
841                            NoteResonance.Final = itEvent->Param.NoteSynthParam.isFinal();
842                          break;                          break;
843                      case Event::synth_param_amp_lfo_depth:                      case Event::synth_param_amp_lfo_depth:
844                          pLFO1->setScriptDepthFactor(itEvent->Param.NoteSynthParam.AbsValue);                          pLFO1->setScriptDepthFactor(
845                                itEvent->Param.NoteSynthParam.AbsValue,
846                                itEvent->Param.NoteSynthParam.isFinal()
847                            );
848                          break;                          break;
849                      case Event::synth_param_amp_lfo_freq:                      case Event::synth_param_amp_lfo_freq:
850                          pLFO1->setScriptFrequencyFactor(itEvent->Param.NoteSynthParam.AbsValue, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE);                          if (itEvent->Param.NoteSynthParam.isFinal())
851                                pLFO1->setScriptFrequencyFinal(itEvent->Param.NoteSynthParam.AbsValue, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE);
852                            else
853                                pLFO1->setScriptFrequencyFactor(itEvent->Param.NoteSynthParam.AbsValue, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE);
854                            break;
855                        case Event::synth_param_cutoff_lfo_depth:
856                            pLFO2->setScriptDepthFactor(
857                                itEvent->Param.NoteSynthParam.AbsValue,
858                                itEvent->Param.NoteSynthParam.isFinal()
859                            );
860                            break;
861                        case Event::synth_param_cutoff_lfo_freq:
862                            if (itEvent->Param.NoteSynthParam.isFinal())
863                                pLFO2->setScriptFrequencyFinal(itEvent->Param.NoteSynthParam.AbsValue, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE);
864                            else
865                                pLFO2->setScriptFrequencyFactor(itEvent->Param.NoteSynthParam.AbsValue, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE);
866                          break;                          break;
867                      case Event::synth_param_pitch_lfo_depth:                      case Event::synth_param_pitch_lfo_depth:
868                          pLFO3->setScriptDepthFactor(itEvent->Param.NoteSynthParam.AbsValue);                          pLFO3->setScriptDepthFactor(
869                                itEvent->Param.NoteSynthParam.AbsValue,
870                                itEvent->Param.NoteSynthParam.isFinal()
871                            );
872                          break;                          break;
873                      case Event::synth_param_pitch_lfo_freq:                      case Event::synth_param_pitch_lfo_freq:
874                          pLFO3->setScriptFrequencyFactor(itEvent->Param.NoteSynthParam.AbsValue, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE);                          pLFO3->setScriptFrequencyFactor(itEvent->Param.NoteSynthParam.AbsValue, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE);
# Line 787  namespace LinuxSampler { Line 876  namespace LinuxSampler {
876    
877                      case Event::synth_param_attack:                      case Event::synth_param_attack:
878                      case Event::synth_param_decay:                      case Event::synth_param_decay:
879                        case Event::synth_param_sustain:
880                      case Event::synth_param_release:                      case Event::synth_param_release:
881                          break; // noop                          break; // noop
882                  }                  }
# Line 849  namespace LinuxSampler { Line 939  namespace LinuxSampler {
939          // GSt behaviour: maximum transpose up is 40 semitones. If          // GSt behaviour: maximum transpose up is 40 semitones. If
940          // MIDI key is more than 40 semitones above unity note,          // MIDI key is more than 40 semitones above unity note,
941          // the transpose is not done.          // the transpose is not done.
942          if (!SmplInfo.Unpitched && (MIDIKey() - (int) RgnInfo.UnityNote) < 40) pitchbasecents += (MIDIKey() - (int) RgnInfo.UnityNote) * 100;          //
943            // Update: Removed this GSt misbehavior. I don't think that any stock
944            // gig sound requires it to resemble its original sound.
945            // -- Christian, 2017-07-09
946            if (!SmplInfo.Unpitched /* && (MIDIKey() - (int) RgnInfo.UnityNote) < 40*/)
947                pitchbasecents += (MIDIKey() - (int) RgnInfo.UnityNote) * 100;
948    
949          pitch.PitchBase = RTMath::CentsToFreqRatioUnlimited(pitchbasecents) * (double(SmplInfo.SampleRate) / double(GetEngine()->SampleRate));          pitch.PitchBase = RTMath::CentsToFreqRatioUnlimited(pitchbasecents) * (double(SmplInfo.SampleRate) / double(GetEngine()->SampleRate));
950          pitch.PitchBendRange = 1.0 / 8192.0 * 100.0 * InstrInfo.PitchbendRange;          pitch.PitchBendRange = 1.0 / 8192.0 * 100.0 * InstrInfo.PitchbendRange;
# Line 865  namespace LinuxSampler { Line 960  namespace LinuxSampler {
960          // GSt behaviour: maximum transpose up is 40 semitones. If          // GSt behaviour: maximum transpose up is 40 semitones. If
961          // MIDI key is more than 40 semitones above unity note,          // MIDI key is more than 40 semitones above unity note,
962          // the transpose is not done.          // the transpose is not done.
963          if (!SmplInfo.Unpitched && (MIDIKey() - (int) RgnInfo.UnityNote) < 40) pitchbasecents += (MIDIKey() - (int) RgnInfo.UnityNote) * 100;          //
964            // Update: Removed this GSt misbehavior. I don't think that any stock
965            // gig sound requires it to resemble its original sound.
966            // -- Christian, 2017-07-09
967            if (!SmplInfo.Unpitched /* && (MIDIKey() - (int) RgnInfo.UnityNote) < 40*/)
968                pitchbasecents += (MIDIKey() - (int) RgnInfo.UnityNote) * 100;
969                    
970          pitch.PitchBase = RTMath::CentsToFreqRatioUnlimited(pitchbasecents) * (double(SmplInfo.SampleRate) / double(GetEngine()->SampleRate));          pitch.PitchBase = RTMath::CentsToFreqRatioUnlimited(pitchbasecents) * (double(SmplInfo.SampleRate) / double(GetEngine()->SampleRate));
971          this->Pitch = pitch;          this->Pitch = pitch;

Legend:
Removed from v.3246  
changed lines
  Added in v.3564

  ViewVC Help
Powered by ViewVC