/[svn]/linuxsampler/trunk/src/engines/gig/Voice.h
ViewVC logotype

Diff of /linuxsampler/trunk/src/engines/gig/Voice.h

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

revision 738 by schoenebeck, Tue Aug 16 17:14:25 2005 UTC revision 832 by persson, Sun Feb 5 10:24:05 2006 UTC
# Line 3  Line 3 
3   *   LinuxSampler - modular, streaming capable sampler                     *   *   LinuxSampler - modular, streaming capable sampler                     *
4   *                                                                         *   *                                                                         *
5   *   Copyright (C) 2003, 2004 by Benno Senoner and Christian Schoenebeck   *   *   Copyright (C) 2003, 2004 by Benno Senoner and Christian Schoenebeck   *
6   *   Copyright (C) 2005 Christian Schoenebeck                              *   *   Copyright (C) 2005, 2006 Christian Schoenebeck                        *
7   *                                                                         *   *                                                                         *
8   *   This program is free software; you can redistribute it and/or modify  *   *   This program is free software; you can redistribute it and/or modify  *
9   *   it under the terms of the GNU General Public License as published by  *   *   it under the terms of the GNU General Public License as published by  *
# Line 41  Line 41 
41  #include "EGDecay.h"  #include "EGDecay.h"
42  #include "Filter.h"  #include "Filter.h"
43  #include "../common/LFOBase.h"  #include "../common/LFOBase.h"
44    #include "SynthesisParam.h"
45    #include "SmoothVolume.h"
46    
47  // include the appropriate (unsigned) triangle LFO implementation  // include the appropriate (unsigned) triangle LFO implementation
48  #if CONFIG_UNSIGNED_TRIANG_ALGO == INT_MATH_SOLUTION  #if CONFIG_UNSIGNED_TRIANG_ALGO == INT_MATH_SOLUTION
# Line 103  namespace LinuxSampler { namespace gig { Line 105  namespace LinuxSampler { namespace gig {
105                  type_release_trigger_required,  ///< If the key of this voice will be released, it causes a release triggered voice to be spawned                  type_release_trigger_required,  ///< If the key of this voice will be released, it causes a release triggered voice to be spawned
106                  type_release_trigger            ///< Release triggered voice which cannot be killed by releasing its key                  type_release_trigger            ///< Release triggered voice which cannot be killed by releasing its key
107              };              };
108                
109              // Attributes              // Attributes
110              type_t       Type;         ///< Voice Type              type_t       Type;         ///< Voice Type
111              int          MIDIKey;      ///< MIDI key number of the key that triggered the voice              int          MIDIKey;      ///< MIDI key number of the key that triggered the voice
# Line 121  namespace LinuxSampler { namespace gig { Line 123  namespace LinuxSampler { namespace gig {
123              int  Trigger(EngineChannel* pEngineChannel, Pool<Event>::Iterator& itNoteOnEvent, int PitchBend, ::gig::DimensionRegion* pDimRgn, type_t VoiceType, int iKeyGroup);              int  Trigger(EngineChannel* pEngineChannel, Pool<Event>::Iterator& itNoteOnEvent, int PitchBend, ::gig::DimensionRegion* pDimRgn, type_t VoiceType, int iKeyGroup);
124              inline bool IsActive() { return PlaybackState; }              inline bool IsActive() { return PlaybackState; }
125              inline bool IsStealable() { return !itKillEvent && PlaybackState >= playback_state_ram; }              inline bool IsStealable() { return !itKillEvent && PlaybackState >= playback_state_ram; }
126                void UpdatePortamentoPos(Pool<Event>::Iterator& itNoteOffEvent);
127    
128          //private:          //private:
129              // Types              // Types
130              enum playback_state_t {              enum playback_state_t {
# Line 133  namespace LinuxSampler { namespace gig { Line 137  namespace LinuxSampler { namespace gig {
137              // Attributes              // Attributes
138              EngineChannel*              pEngineChannel;              EngineChannel*              pEngineChannel;
139              Engine*                     pEngine;            ///< Pointer to the sampler engine, to be able to access the event lists.              Engine*                     pEngine;            ///< Pointer to the sampler engine, to be able to access the event lists.
140              float                       Volume;             ///< Volume level of the voice              float                       VolumeLeft;         ///< Left channel volume. This factor is calculated when the voice is triggered and doesn't change after that.
141              float                       PanLeft;              float                       VolumeRight;        ///< Right channel volume. This factor is calculated when the voice is triggered and doesn't change after that.
142              float                       PanRight;              SmoothVolume                CrossfadeSmoother;  ///< Crossfade volume, updated by crossfade CC events
143              float                       CrossfadeVolume;    ///< Current attenuation level caused by a crossfade (only if a crossfade is defined of course)              SmoothVolume                VolumeSmoother;     ///< Volume, updated by CC 7 (volume) events
144                SmoothVolume                PanLeftSmoother;    ///< Left channel volume, updated by CC 10 (pan) events
145                SmoothVolume                PanRightSmoother;   ///< Right channel volume, updated by CC 10 (pan) events
146              double                      Pos;                ///< Current playback position in sample              double                      Pos;                ///< Current playback position in sample
147              float                       PitchBase;          ///< Basic pitch depth, stays the same for the whole life time of the voice              float                       PitchBase;          ///< Basic pitch depth, stays the same for the whole life time of the voice
148              float                       PitchBend;          ///< Current pitch value of the pitchbend wheel              float                       PitchBend;          ///< Current pitch value of the pitchbend wheel
# Line 149  namespace LinuxSampler { namespace gig { Line 155  namespace LinuxSampler { namespace gig {
155              int                         RealSampleWordsLeftToRead; ///< Number of samples left to read, not including the silence added for the interpolator              int                         RealSampleWordsLeftToRead; ///< Number of samples left to read, not including the silence added for the interpolator
156              unsigned long               MaxRAMPos;          ///< The upper allowed limit (not actually the end) in the RAM sample cache, after that point it's not safe to chase the interpolator another time over over the current cache position, instead we switch to disk then.              unsigned long               MaxRAMPos;          ///< The upper allowed limit (not actually the end) in the RAM sample cache, after that point it's not safe to chase the interpolator another time over over the current cache position, instead we switch to disk then.
157              bool                        RAMLoop;            ///< If this voice has a loop defined which completely fits into the cached RAM part of the sample, in this case we handle the looping within the voice class, else if the loop is located in the disk stream part, we let the disk stream handle the looping              bool                        RAMLoop;            ///< If this voice has a loop defined which completely fits into the cached RAM part of the sample, in this case we handle the looping within the voice class, else if the loop is located in the disk stream part, we let the disk stream handle the looping
158              uint                        LoopCyclesLeft;     ///< In case there is a RAMLoop and it's not an endless loop; reflects number of loop cycles left to be passed              //uint                        LoopCyclesLeft;     ///< In case there is a RAMLoop and it's not an endless loop; reflects number of loop cycles left to be passed
159              uint                        Delay;              ///< Number of sample points the rendering process of this voice should be delayed (jitter correction), will be set to 0 after the first audio fragment cycle              uint                        Delay;              ///< Number of sample points the rendering process of this voice should be delayed (jitter correction), will be set to 0 after the first audio fragment cycle
160              EGADSR                      EG1;                ///< Envelope Generator 1 (Amplification)              EGADSR                      EG1;                ///< Envelope Generator 1 (Amplification)
161              EGADSR                      EG2;                ///< Envelope Generator 2 (Filter cutoff frequency)              EGADSR                      EG2;                ///< Envelope Generator 2 (Filter cutoff frequency)
162              EGDecay                     EG3;                ///< Envelope Generator 3 (Pitch)              EGDecay                     EG3;                ///< Envelope Generator 3 (Pitch)
             Filter                      FilterLeft;  
             Filter                      FilterRight;  
163              midi_ctrl                   VCFCutoffCtrl;              midi_ctrl                   VCFCutoffCtrl;
164              midi_ctrl                   VCFResonanceCtrl;              midi_ctrl                   VCFResonanceCtrl;
165              static const float          FILTER_CUTOFF_COEFF;              static const float          FILTER_CUTOFF_COEFF;
# Line 170  namespace LinuxSampler { namespace gig { Line 174  namespace LinuxSampler { namespace gig {
174              Pool<Event>::Iterator       itKillEvent;         ///< Event which caused this voice to be killed              Pool<Event>::Iterator       itKillEvent;         ///< Event which caused this voice to be killed
175          //private:          //private:
176              int                         SynthesisMode;              int                         SynthesisMode;
   
   
             float                       fFinalPitch;  
             float                       fFinalVolume;  
177              float                       fFinalCutoff;              float                       fFinalCutoff;
178              float                       fFinalResonance;              float                       fFinalResonance;
179                SynthesisParam              finalSynthesisParameters;
180                Loop                        loop;
181    
182              // Static Methods              // Static Methods
183              static float CalculateFilterCutoffCoeff();              static float CalculateFilterCutoffCoeff();
# Line 191  namespace LinuxSampler { namespace gig { Line 193  namespace LinuxSampler { namespace gig {
193              void processCutoffEvent(RTList<Event>::Iterator& itEvent);              void processCutoffEvent(RTList<Event>::Iterator& itEvent);
194              void processResonanceEvent(RTList<Event>::Iterator& itEvent);              void processResonanceEvent(RTList<Event>::Iterator& itEvent);
195    
196              inline float CrossfadeAttenuation(uint8_t& CrossfadeControllerValue) {              inline uint8_t CrossfadeAttenuation(uint8_t& CrossfadeControllerValue) {
197                  float att = (!pDimRgn->Crossfade.out_end) ? CrossfadeControllerValue / 127.0f /* 0,0,0,0 means no crossfade defined */                  uint8_t c = std::max(CrossfadeControllerValue, pDimRgn->AttenuationControllerThreshold);
198                            : (CrossfadeControllerValue < pDimRgn->Crossfade.in_end) ?                  c = (!pDimRgn->Crossfade.out_end) ? c /* 0,0,0,0 means no crossfade defined */
199                                  ((CrossfadeControllerValue <= pDimRgn->Crossfade.in_start) ? 0.0f                            : (c < pDimRgn->Crossfade.in_end) ?
200                                  : float(CrossfadeControllerValue - pDimRgn->Crossfade.in_start) / float(pDimRgn->Crossfade.in_end - pDimRgn->Crossfade.in_start))                                  ((c <= pDimRgn->Crossfade.in_start) ? 0
201                            : (CrossfadeControllerValue <= pDimRgn->Crossfade.out_start) ? 1.0f                                  : 127 * (c - pDimRgn->Crossfade.in_start) / (pDimRgn->Crossfade.in_end - pDimRgn->Crossfade.in_start))
202                            : (CrossfadeControllerValue < pDimRgn->Crossfade.out_end) ? float(pDimRgn->Crossfade.out_end - CrossfadeControllerValue) / float(pDimRgn->Crossfade.out_end - pDimRgn->Crossfade.out_start)                            : (c <= pDimRgn->Crossfade.out_start) ? 127
203                            : 0.0f;                            : (c < pDimRgn->Crossfade.out_end) ? 127 * (pDimRgn->Crossfade.out_end - c) / (pDimRgn->Crossfade.out_end - pDimRgn->Crossfade.out_start)
204                  return pDimRgn->InvertAttenuationController ? 1 - att : att;                            : 0;
205                    return pDimRgn->InvertAttenuationController ? 127 - c : c;
206              }              }
207    
208              inline float Constrain(float ValueToCheck, float Min, float Max) {              inline float Constrain(float ValueToCheck, float Min, float Max) {

Legend:
Removed from v.738  
changed lines
  Added in v.832

  ViewVC Help
Powered by ViewVC