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

Contents of /linuxsampler/trunk/src/engines/sfz/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: 7630 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 - 2012 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_SFZ_VOICE_H__
26 #define __LS_SFZ_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 "DiskThread.h"
34 #include "../gig/Filter.h"
35 #include "../common/VoiceBase.h"
36 #include "../gig/SynthesisParam.h"
37 #include "EG.h"
38 #include "EGADSR.h"
39 #include "SfzSignalUnitRack.h"
40
41 namespace LinuxSampler { namespace sfz {
42 class Engine;
43 class EngineChannel;
44
45 /** SoundFont Voice
46 *
47 * Renders a voice for the SoundFont format.
48 */
49 class Voice : public LinuxSampler::VoiceBase<EngineChannel, ::sfz::Region, Sample, DiskThread> {
50 public:
51 Voice();
52 virtual ~Voice();
53 void SetOutput(AudioOutputDevice* pAudioOutputDevice);
54 void SetEngine(LinuxSampler::Engine* pEngine);
55 void CalculateFadeOutCoeff(float FadeOutTime, float SampleRate);
56
57 virtual void VoiceFreed() { SignalRack.Reset(); }
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 float GetReleaseTriggerAttenuation(float noteLength);
66 virtual double GetEG1ControllerValue(uint8_t MIDIKeyVelocity);
67 virtual EGInfo CalculateEG1ControllerInfluence(double eg1ControllerValue);
68 virtual void TriggerEG1(const EGInfo& egInfo, double velrelease, double velocityAttenuation, uint sampleRate, uint8_t velocity) { }
69 virtual double GetEG2ControllerValue(uint8_t MIDIKeyVelocity);
70 virtual EGInfo CalculateEG2ControllerInfluence(double eg2ControllerValue);
71 virtual void TriggerEG2(const EGInfo& egInfo, double velrelease, double velocityAttenuation, uint sampleRate, uint8_t velocity) { }
72 virtual void InitLFO1() { }
73 virtual void InitLFO2() { }
74 virtual void InitLFO3() { }
75 virtual float CalculateCutoffBase(uint8_t MIDIKeyVelocity);
76 virtual float CalculateFinalCutoff(float cutoffBase);
77 virtual uint8_t GetVCFCutoffCtrl() { return 0; }
78 virtual uint8_t GetVCFResonanceCtrl() { return 0; }
79 virtual void ProcessCCEvent(RTList<Event>::Iterator& itEvent) OVERRIDE;
80 virtual void ProcessChannelPressureEvent(RTList<Event>::Iterator& itEvent) OVERRIDE;
81 virtual void ProcessPolyphonicKeyPressureEvent(RTList<Event>::Iterator& itEvent) OVERRIDE;
82 virtual void ProcessCutoffEvent(RTList<Event>::Iterator& itEvent) { }
83 virtual double GetVelocityAttenuation(uint8_t MIDIKeyVelocity);
84 virtual double GetVelocityRelease(uint8_t MIDIKeyVelocity);
85 virtual double GetSampleAttenuation();
86 virtual void ProcessGroupEvent(RTList<Event>::Iterator& itEvent);
87 virtual void SetSampleStartOffset();
88 virtual int GetRAMCacheOffset() { return pRegion->pSample->RAMCacheOffset; }
89 virtual int CalculatePan(uint8_t pan);
90
91 private:
92 SfzSignalUnitRack SignalRack;
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* GetSfzEngineChannel();
107
108 friend class CCUnit;
109 friend class XFInCCUnit;
110 friend class XFOutCCUnit;
111 friend class AmpEGUnit;
112 friend class FilEGUnit;
113 friend class PitchEGUnit;
114 friend class PitchLFOUnit;
115 friend class AmpLFOUnit;
116 friend class FilLFOUnit;
117 friend class EndpointUnit;
118 friend class SfzSignalUnitRack;
119
120 protected:
121 virtual uint8_t CrossfadeAttenuation(uint8_t& CrossfadeControllerValue) {
122 /*uint8_t c = std::max(CrossfadeControllerValue, pRegion->AttenuationControllerThreshold);
123 c = (!pRegion->Crossfade.out_end) ? c // 0,0,0,0 means no crossfade defined
124 : (c < pRegion->Crossfade.in_end) ?
125 ((c <= pRegion->Crossfade.in_start) ? 0
126 : 127 * (c - pRegion->Crossfade.in_start) / (pRegion->Crossfade.in_end - pRegion->Crossfade.in_start))
127 : (c <= pRegion->Crossfade.out_start) ? 127
128 : (c < pRegion->Crossfade.out_end) ? 127 * (pRegion->Crossfade.out_end - c) / (pRegion->Crossfade.out_end - pRegion->Crossfade.out_start)
129 : 0;
130 return pRegion->InvertAttenuationController ? 127 - c : c;*/ // TODO: ^^^
131 return 0;
132 }
133 };
134
135 }} // namespace LinuxSampler::sfz
136
137 #endif // __LS_SFZ_VOICE_H__

  ViewVC Help
Powered by ViewVC