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

Contents of /linuxsampler/trunk/src/engines/sf2/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: 7283 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_SF2_VOICE_H__
26 #define __LS_SF2_VOICE_H__
27
28 #include "../../common/global_private.h"
29
30 #include "../../common/RTMath.h"
31 #include "../../common/Pool.h"
32 #include "../../drivers/audio/AudioOutputDevice.h"
33 #include "Stream.h"
34 #include "DiskThread.h"
35 #include "../gig/EGADSR.h"
36 #include "../gig/Filter.h"
37 #include "../common/VoiceBase.h"
38 #include "../gig/SynthesisParam.h"
39 #include "../sfz/EGADSR.h"
40 #include "SF2SignalUnitRack.h"
41 #include "EngineChannel.h"
42
43 namespace LinuxSampler { namespace sf2 {
44 class Engine;
45 class EngineChannel;
46
47 /** SoundFont Voice
48 *
49 * Renders a voice for the SoundFont format.
50 */
51 class Voice : public LinuxSampler::VoiceBase<EngineChannel, ::sf2::Region, ::sf2::Sample, DiskThread> {
52 public:
53 Voice();
54 virtual ~Voice();
55 void SetOutput(AudioOutputDevice* pAudioOutputDevice);
56 void SetEngine(LinuxSampler::Engine* pEngine);
57 void CalculateFadeOutCoeff(float FadeOutTime, float SampleRate);
58
59 protected:
60 virtual SampleInfo GetSampleInfo();
61 virtual RegionInfo GetRegionInfo();
62 virtual InstrumentInfo GetInstrumentInfo();
63 virtual double CalculateCrossfadeVolume(uint8_t MIDIKeyVelocity);
64 virtual AbstractEngine* GetEngine() { return (AbstractEngine*)pEngine; }
65 virtual double GetEG1ControllerValue(uint8_t MIDIKeyVelocity);
66 virtual EGInfo CalculateEG1ControllerInfluence(double eg1ControllerValue);
67 virtual void TriggerEG1(const EGInfo& egInfo, double velrelease, double velocityAttenuation, uint sampleRate, uint8_t velocity) { }
68 virtual double GetEG2ControllerValue(uint8_t MIDIKeyVelocity);
69 virtual EGInfo CalculateEG2ControllerInfluence(double eg2ControllerValue);
70 virtual void TriggerEG2(const EGInfo& egInfo, double velrelease, double velocityAttenuation, uint sampleRate, uint8_t velocity) { }
71 virtual void InitLFO1() { }
72 virtual void InitLFO2() { }
73 virtual void InitLFO3() { }
74 virtual float CalculateCutoffBase(uint8_t MIDIKeyVelocity);
75 virtual float CalculateFinalCutoff(float cutoffBase);
76 virtual uint8_t GetVCFCutoffCtrl();
77 virtual uint8_t GetVCFResonanceCtrl();
78 virtual void ProcessCCEvent(RTList<Event>::Iterator& itEvent) OVERRIDE;
79 virtual void ProcessChannelPressureEvent(RTList<Event>::Iterator& itEvent) OVERRIDE;
80 virtual void ProcessPolyphonicKeyPressureEvent(RTList<Event>::Iterator& itEvent) OVERRIDE;
81 virtual void ProcessCutoffEvent(RTList<Event>::Iterator& itEvent);
82 virtual double GetVelocityAttenuation(uint8_t MIDIKeyVelocity);
83 virtual double GetVelocityRelease(uint8_t MIDIKeyVelocity);
84 virtual double GetSampleAttenuation();
85 virtual void ProcessGroupEvent(RTList<Event>::Iterator& itEvent);
86 virtual void AboutToTrigger();
87 virtual int CalculatePan(uint8_t pan);
88
89 private:
90 ::sf2::Region* pPresetRegion;
91 SF2SignalUnitRack SignalRack;
92
93 public: // FIXME: just made public for debugging (sanity check in Engine::RenderAudio()), should be changed to private before the final release
94 // Attributes
95 Engine* pEngine; ///< Pointer to the sampler engine, to be able to access the event lists.
96 //uint LoopCyclesLeft; ///< In case there is a RAMLoop and it's not an endless loop; reflects number of loop cycles left to be passed
97
98 // Static Methods
99 static float CalculateFilterCutoffCoeff();
100
101 // Methods
102 void ProcessEvents(uint Samples);
103 void processCrossFadeEvent(RTList<Event>::Iterator& itEvent);
104
105 EngineChannel* GetSf2EngineChannel();
106
107 friend class EGUnit;
108 friend class VolEGUnit;
109 friend class ModEGUnit;
110 friend class ModLfoUnit;
111 friend class VibLfoUnit;
112 friend class EndpointUnit;
113 friend class SF2SignalUnitRack;
114
115 protected:
116 virtual uint8_t CrossfadeAttenuation(uint8_t& CrossfadeControllerValue) {
117 /*uint8_t c = std::max(CrossfadeControllerValue, pRegion->AttenuationControllerThreshold);
118 c = (!pRegion->Crossfade.out_end) ? c // 0,0,0,0 means no crossfade defined
119 : (c < pRegion->Crossfade.in_end) ?
120 ((c <= pRegion->Crossfade.in_start) ? 0
121 : 127 * (c - pRegion->Crossfade.in_start) / (pRegion->Crossfade.in_end - pRegion->Crossfade.in_start))
122 : (c <= pRegion->Crossfade.out_start) ? 127
123 : (c < pRegion->Crossfade.out_end) ? 127 * (pRegion->Crossfade.out_end - c) / (pRegion->Crossfade.out_end - pRegion->Crossfade.out_start)
124 : 0;
125 return pRegion->InvertAttenuationController ? 127 - c : c;*/ // TODO: ^^^
126 return 0;
127 }
128 };
129
130 }} // namespace LinuxSampler::sf2
131
132 #endif // __LS_SF2_VOICE_H__

  ViewVC Help
Powered by ViewVC