/[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 783 by persson, Sun Oct 2 14:40:52 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 42  Line 42 
42  #include "Filter.h"  #include "Filter.h"
43  #include "../common/LFOBase.h"  #include "../common/LFOBase.h"
44  #include "SynthesisParam.h"  #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 104  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 122  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 134  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 169  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                       fFinalVolume;  
177              float                       fFinalCutoff;              float                       fFinalCutoff;
178              float                       fFinalResonance;              float                       fFinalResonance;
179              SynthesisParam              finalSynthesisParameters;              SynthesisParam              finalSynthesisParameters;
# Line 189  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.783  
changed lines
  Added in v.832

  ViewVC Help
Powered by ViewVC