/[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 2061 by persson, Tue Feb 23 18:32:31 2010 UTC revision 2114 by persson, Tue Aug 10 12:05:19 2010 UTC
# Line 32  namespace LinuxSampler { Line 32  namespace LinuxSampler {
32          pLFO2 = new LFOUnsigned(1.0f);  // filter EG (0..1 range)          pLFO2 = new LFOUnsigned(1.0f);  // filter EG (0..1 range)
33          pLFO3 = new LFOSigned(1200.0f); // pitch EG (-1200..+1200 range)          pLFO3 = new LFOSigned(1200.0f); // pitch EG (-1200..+1200 range)
34          PlaybackState = playback_state_end;          PlaybackState = playback_state_end;
         KeyGroup = 0;  
35          SynthesisMode = 0; // set all mode bits to 0 first          SynthesisMode = 0; // set all mode bits to 0 first
36          // select synthesis implementation (asm core is not supported ATM)          // select synthesis implementation (asm core is not supported ATM)
37          #if 0 // CONFIG_ASM && ARCH_X86          #if 0 // CONFIG_ASM && ARCH_X86
# Line 104  namespace LinuxSampler { Line 103  namespace LinuxSampler {
103          Delay           = itNoteOnEvent->FragmentPos();          Delay           = itNoteOnEvent->FragmentPos();
104          itTriggerEvent  = itNoteOnEvent;          itTriggerEvent  = itNoteOnEvent;
105          itKillEvent     = Pool<Event>::Iterator();          itKillEvent     = Pool<Event>::Iterator();
106          KeyGroup        = iKeyGroup;  
107            pGroupEvents = iKeyGroup ? pEngineChannel->ActiveKeyGroups[iKeyGroup] : 0;
108    
109          SmplInfo   = GetSampleInfo();          SmplInfo   = GetSampleInfo();
110          RgnInfo    = GetRegionInfo();          RgnInfo    = GetRegionInfo();
# Line 314  namespace LinuxSampler { Line 314  namespace LinuxSampler {
314          RTList<Event>::Iterator itNoteEvent;          RTList<Event>::Iterator itNoteEvent;
315          GetFirstEventOnKey(MIDIKey, itNoteEvent);          GetFirstEventOnKey(MIDIKey, itNoteEvent);
316    
317            RTList<Event>::Iterator itGroupEvent;
318            if (pGroupEvents) itGroupEvent = pGroupEvents->first();
319    
320          if (itTriggerEvent) { // skip events that happened before this voice was triggered          if (itTriggerEvent) { // skip events that happened before this voice was triggered
321              while (itCCEvent && itCCEvent->FragmentPos() <= Skip) ++itCCEvent;              while (itCCEvent && itCCEvent->FragmentPos() <= Skip) ++itCCEvent;
322                while (itGroupEvent && itGroupEvent->FragmentPos() <= Skip) ++itGroupEvent;
323    
324              // we can't simply compare the timestamp here, because note events              // we can't simply compare the timestamp here, because note events
325              // might happen on the same time stamp, so we have to deal on the              // might happen on the same time stamp, so we have to deal on the
326              // actual sequence the note events arrived instead (see bug #112)              // actual sequence the note events arrived instead (see bug #112)
# Line 362  namespace LinuxSampler { Line 367  namespace LinuxSampler {
367    
368              // process transition events (note on, note off & sustain pedal)              // process transition events (note on, note off & sustain pedal)
369              processTransitionEvents(itNoteEvent, iSubFragmentEnd);              processTransitionEvents(itNoteEvent, iSubFragmentEnd);
370                processGroupEvents(itGroupEvent, iSubFragmentEnd);
371    
372              // if the voice was killed in this subfragment, or if the              // if the voice was killed in this subfragment, or if the
373              // filter EG is finished, switch EG1 to fade out stage              // filter EG is finished, switch EG1 to fade out stage
# Line 529  namespace LinuxSampler { Line 535  namespace LinuxSampler {
535       */       */
536      void AbstractVoice::processTransitionEvents(RTList<Event>::Iterator& itEvent, uint End) {      void AbstractVoice::processTransitionEvents(RTList<Event>::Iterator& itEvent, uint End) {
537          for (; itEvent && itEvent->FragmentPos() <= End; ++itEvent) {          for (; itEvent && itEvent->FragmentPos() <= End; ++itEvent) {
538              if (itEvent->Type == Event::type_release) {              if (Type != Voice::type_release_trigger) {
539                  pEG1->update(EG::event_release, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE);  
540                  EG2.update(gig::EGADSR::event_release, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE);                  if (itEvent->Type == Event::type_release) {
541              } else if (itEvent->Type == Event::type_cancel_release) {                      EnterReleaseStage();
542                  pEG1->update(EG::event_cancel_release, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE);                  } else if (itEvent->Type == Event::type_cancel_release) {
543                  EG2.update(gig::EGADSR::event_cancel_release, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE);                      pEG1->update(EG::event_cancel_release, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE);
544                        EG2.update(gig::EGADSR::event_cancel_release, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE);
545                    }
546              }              }
547          }          }
548      }      }
549    
550        /**
551         * Process given list of events aimed at all voices in a key group.
552         *
553         * @param itEvent - iterator pointing to the next event to be processed
554         * @param End     - youngest time stamp where processing should be stopped
555         */
556        void AbstractVoice::processGroupEvents(RTList<Event>::Iterator& itEvent, uint End) {
557            for (; itEvent && itEvent->FragmentPos() <= End; ++itEvent) {
558                ProcessGroupEvent(itEvent);
559            }
560        }
561    
562      /** @brief Update current portamento position.      /** @brief Update current portamento position.
563       *       *
564       * Will be called when portamento mode is enabled to get the final       * Will be called when portamento mode is enabled to get the final
# Line 609  namespace LinuxSampler { Line 629  namespace LinuxSampler {
629      float AbstractVoice::GetReleaseTriggerAttenuation(float noteLength) {      float AbstractVoice::GetReleaseTriggerAttenuation(float noteLength) {
630          return 1 - RgnInfo.ReleaseTriggerDecay * noteLength;          return 1 - RgnInfo.ReleaseTriggerDecay * noteLength;
631      }      }
632    
633        void AbstractVoice::EnterReleaseStage() {
634            pEG1->update(EG::event_release, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE);
635            EG2.update(gig::EGADSR::event_release, GetEngine()->SampleRate / CONFIG_DEFAULT_SUBFRAGMENT_SIZE);
636        }
637    
638  } // namespace LinuxSampler  } // namespace LinuxSampler

Legend:
Removed from v.2061  
changed lines
  Added in v.2114

  ViewVC Help
Powered by ViewVC