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

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

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2559 - (show annotations) (download) (as text)
Sun May 18 17:38:25 2014 UTC (9 years, 11 months ago) by schoenebeck
File MIME type: text/x-c++hdr
File size: 7122 byte(s)
* Aftertouch: extended API to explicitly handle channel pressure and
  polyphonic key pressure events (so far polyphonic pressure was not
  supported at all, and channel pressure was rerouted as CC128 but not
  used so far).
* Gig Engine: Fixed support for 'aftertouch' attenuation controller.
* Bumped version (1.0.0.svn39).

1 /***************************************************************************
2 * *
3 * LinuxSampler - modular, streaming capable sampler *
4 * *
5 * Copyright (C) 2003, 2004 by Benno Senoner and Christian Schoenebeck *
6 * Copyright (C) 2005 - 2008 Christian Schoenebeck *
7 * Copyright (C) 2009 - 2013 Christian Schoenebeck and Grigor Iliev *
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 * This program is distributed in the hope that it will be useful, *
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
17 * GNU General Public License for more details. *
18 * *
19 * You should have received a copy of the GNU General Public License *
20 * along with this program; if not, write to the Free Software *
21 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, *
22 * MA 02111-1307 USA *
23 ***************************************************************************/
24
25 #ifndef __LS_GIG_VOICE_H__
26 #define __LS_GIG_VOICE_H__
27
28 #include "../../common/global_private.h"
29
30 #include <gig.h>
31
32 #include "../../common/RTMath.h"
33 #include "../../common/Pool.h"
34 #include "../../drivers/audio/AudioOutputDevice.h"
35 #include "Stream.h"
36 #include "DiskThread.h"
37 #include "EGADSR.h"
38 #include "EGDecay.h"
39 #include "Filter.h"
40 #include "../common/VoiceBase.h"
41 #include "SynthesisParam.h"
42 #include "SmoothVolume.h"
43 #include "EngineChannel.h"
44
45 namespace LinuxSampler { namespace gig {
46 class Engine;
47 class EngineChannel;
48
49 /** Gig Voice
50 *
51 * Renders a voice for the Gigasampler format.
52 */
53 class Voice : public LinuxSampler::VoiceBase<EngineChannel, ::gig::DimensionRegion, ::gig::Sample, DiskThread> {
54 public:
55 Voice();
56 virtual ~Voice();
57 void SetOutput(AudioOutputDevice* pAudioOutputDevice);
58 void SetEngine(LinuxSampler::Engine* pEngine);
59 void CalculateFadeOutCoeff(float FadeOutTime, float SampleRate);
60
61 protected:
62 virtual SampleInfo GetSampleInfo();
63 virtual RegionInfo GetRegionInfo();
64 virtual InstrumentInfo GetInstrumentInfo();
65 virtual double CalculateCrossfadeVolume(uint8_t MIDIKeyVelocity);
66 virtual AbstractEngine* GetEngine() { return (AbstractEngine*)pEngine; }
67 virtual double GetEG1ControllerValue(uint8_t MIDIKeyVelocity);
68 virtual EGInfo CalculateEG1ControllerInfluence(double eg1ControllerValue);
69 virtual void TriggerEG1(const EGInfo& egInfo, double velrelease, double velocityAttenuation, uint sampleRate, uint8_t velocity);
70 virtual double GetEG2ControllerValue(uint8_t MIDIKeyVelocity);
71 virtual EGInfo CalculateEG2ControllerInfluence(double eg2ControllerValue);
72 virtual void TriggerEG2(const EGInfo& egInfo, double velrelease, double velocityAttenuation, uint sampleRate, uint8_t velocity);
73 virtual void InitLFO1();
74 virtual void InitLFO2();
75 virtual void InitLFO3();
76 virtual float CalculateCutoffBase(uint8_t MIDIKeyVelocity);
77 virtual float CalculateFinalCutoff(float cutoffBase);
78 virtual uint8_t GetVCFCutoffCtrl();
79 virtual uint8_t GetVCFResonanceCtrl();
80 virtual void ProcessCCEvent(RTList<Event>::Iterator& itEvent) OVERRIDE;
81 virtual void ProcessChannelPressureEvent(RTList<Event>::Iterator& itEvent) OVERRIDE;
82 virtual void ProcessPolyphonicKeyPressureEvent(RTList<Event>::Iterator& itEvent) OVERRIDE;
83 virtual void ProcessCutoffEvent(RTList<Event>::Iterator& itEvent);
84 virtual double GetVelocityAttenuation(uint8_t MIDIKeyVelocity);
85 virtual double GetVelocityRelease(uint8_t MIDIKeyVelocity);
86 virtual double GetSampleAttenuation();
87 virtual void ProcessGroupEvent(RTList<Event>::Iterator& itEvent);
88 virtual int CalculatePan(uint8_t pan);
89
90 private:
91 EGADSR EG1;
92 EGADSR EG2;
93
94 public: // FIXME: just made public for debugging (sanity check in Engine::RenderAudio()), should be changed to private before the final release
95 // Attributes
96 Engine* pEngine; ///< Pointer to the sampler engine, to be able to access the event lists.
97 //uint LoopCyclesLeft; ///< In case there is a RAMLoop and it's not an endless loop; reflects number of loop cycles left to be passed
98
99 // Static Methods
100 static float CalculateFilterCutoffCoeff();
101
102 // Methods
103 void ProcessEvents(uint Samples);
104 void processCrossFadeEvent(RTList<Event>::Iterator& itEvent);
105
106 EngineChannel* GetGigEngineChannel();
107
108 protected:
109 virtual uint8_t CrossfadeAttenuation(uint8_t& CrossfadeControllerValue) {
110 uint8_t c = std::max(CrossfadeControllerValue, pRegion->AttenuationControllerThreshold);
111 c = (!pRegion->Crossfade.out_end) ? c /* 0,0,0,0 means no crossfade defined */
112 : (c < pRegion->Crossfade.in_end) ?
113 ((c <= pRegion->Crossfade.in_start) ? 0
114 : 127 * (c - pRegion->Crossfade.in_start) / (pRegion->Crossfade.in_end - pRegion->Crossfade.in_start))
115 : (c <= pRegion->Crossfade.out_start) ? 127
116 : (c < pRegion->Crossfade.out_end) ? 127 * (pRegion->Crossfade.out_end - c) / (pRegion->Crossfade.out_end - pRegion->Crossfade.out_start)
117 : 0;
118 return pRegion->InvertAttenuationController ? 127 - c : c;
119 }
120
121 inline float Constrain(float ValueToCheck, float Min, float Max) {
122 if (ValueToCheck > Max) ValueToCheck = Max;
123 else if (ValueToCheck < Min) ValueToCheck = Min;
124 return ValueToCheck;
125 }
126 };
127
128 }} // namespace LinuxSampler::gig
129
130 #endif // __LS_GIG_VOICE_H__

  ViewVC Help
Powered by ViewVC