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

Annotation of /linuxsampler/trunk/src/engines/sfz/Voice.h

Parent Directory Parent Directory | Revision Log Revision Log


Revision 2559 - (hide 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 iliev 2012 /***************************************************************************
2     * *
3     * LinuxSampler - modular, streaming capable sampler *
4     * *
5     * Copyright (C) 2003, 2004 by Benno Senoner and Christian Schoenebeck *
6 persson 2055 * Copyright (C) 2005 - 2008 Christian Schoenebeck *
7 persson 2311 * Copyright (C) 2009 - 2012 Christian Schoenebeck and Grigor Iliev *
8 iliev 2012 * *
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 persson 2055 #include "EG.h"
38     #include "EGADSR.h"
39 iliev 2218 #include "SfzSignalUnitRack.h"
40 iliev 2012
41     namespace LinuxSampler { namespace sfz {
42     class Engine;
43     class EngineChannel;
44    
45 iliev 2015 /** SoundFont Voice
46 iliev 2012 *
47 iliev 2015 * Renders a voice for the SoundFont format.
48 iliev 2012 */
49 iliev 2021 class Voice : public LinuxSampler::VoiceBase<EngineChannel, ::sfz::Region, Sample, DiskThread> {
50 iliev 2012 public:
51     Voice();
52     virtual ~Voice();
53     void SetOutput(AudioOutputDevice* pAudioOutputDevice);
54     void SetEngine(LinuxSampler::Engine* pEngine);
55 persson 2327 void CalculateFadeOutCoeff(float FadeOutTime, float SampleRate);
56 iliev 2244
57     virtual void VoiceFreed() { SignalRack.Reset(); }
58 iliev 2012
59 iliev 2015 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 persson 2061 virtual float GetReleaseTriggerAttenuation(float noteLength);
66 iliev 2015 virtual double GetEG1ControllerValue(uint8_t MIDIKeyVelocity);
67     virtual EGInfo CalculateEG1ControllerInfluence(double eg1ControllerValue);
68 iliev 2224 virtual void TriggerEG1(const EGInfo& egInfo, double velrelease, double velocityAttenuation, uint sampleRate, uint8_t velocity) { }
69 iliev 2015 virtual double GetEG2ControllerValue(uint8_t MIDIKeyVelocity);
70     virtual EGInfo CalculateEG2ControllerInfluence(double eg2ControllerValue);
71 iliev 2224 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 iliev 2015 virtual float CalculateCutoffBase(uint8_t MIDIKeyVelocity);
76     virtual float CalculateFinalCutoff(float cutoffBase);
77 iliev 2252 virtual uint8_t GetVCFCutoffCtrl() { return 0; }
78     virtual uint8_t GetVCFResonanceCtrl() { return 0; }
79 schoenebeck 2559 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 iliev 2252 virtual void ProcessCutoffEvent(RTList<Event>::Iterator& itEvent) { }
83 iliev 2015 virtual double GetVelocityAttenuation(uint8_t MIDIKeyVelocity);
84     virtual double GetVelocityRelease(uint8_t MIDIKeyVelocity);
85     virtual double GetSampleAttenuation();
86 persson 2114 virtual void ProcessGroupEvent(RTList<Event>::Iterator& itEvent);
87 iliev 2216 virtual void SetSampleStartOffset();
88     virtual int GetRAMCacheOffset() { return pRegion->pSample->RAMCacheOffset; }
89 persson 2382 virtual int CalculatePan(uint8_t pan);
90 iliev 2015
91     private:
92 iliev 2218 SfzSignalUnitRack SignalRack;
93 persson 2055
94 iliev 2015 public: // FIXME: just made public for debugging (sanity check in Engine::RenderAudio()), should be changed to private before the final release
95 iliev 2012 // 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 iliev 2015 EngineChannel* GetSfzEngineChannel();
107 iliev 2218
108 iliev 2230 friend class CCUnit;
109 iliev 2236 friend class XFInCCUnit;
110     friend class XFOutCCUnit;
111 iliev 2229 friend class AmpEGUnit;
112 iliev 2222 friend class FilEGUnit;
113 iliev 2220 friend class PitchEGUnit;
114 iliev 2221 friend class PitchLFOUnit;
115     friend class AmpLFOUnit;
116     friend class FilLFOUnit;
117 iliev 2236 friend class EndpointUnit;
118 iliev 2218 friend class SfzSignalUnitRack;
119 iliev 2015
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 iliev 2012 }
133     };
134    
135     }} // namespace LinuxSampler::sfz
136    
137     #endif // __LS_SFZ_VOICE_H__

  ViewVC Help
Powered by ViewVC