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

Annotation of /linuxsampler/trunk/src/engines/gig/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: 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 schoenebeck 53 /***************************************************************************
2     * *
3     * LinuxSampler - modular, streaming capable sampler *
4     * *
5 schoenebeck 56 * Copyright (C) 2003, 2004 by Benno Senoner and Christian Schoenebeck *
6 persson 2055 * Copyright (C) 2005 - 2008 Christian Schoenebeck *
7 persson 2390 * Copyright (C) 2009 - 2013 Christian Schoenebeck and Grigor Iliev *
8 schoenebeck 53 * *
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 schoenebeck 1424 #include "../../common/global_private.h"
29 schoenebeck 53
30 schoenebeck 505 #include <gig.h>
31    
32 schoenebeck 53 #include "../../common/RTMath.h"
33 schoenebeck 273 #include "../../common/Pool.h"
34 schoenebeck 203 #include "../../drivers/audio/AudioOutputDevice.h"
35 schoenebeck 53 #include "Stream.h"
36     #include "DiskThread.h"
37 schoenebeck 738 #include "EGADSR.h"
38 schoenebeck 53 #include "EGDecay.h"
39     #include "Filter.h"
40 iliev 2012 #include "../common/VoiceBase.h"
41 schoenebeck 770 #include "SynthesisParam.h"
42 persson 832 #include "SmoothVolume.h"
43 persson 2390 #include "EngineChannel.h"
44 schoenebeck 53
45     namespace LinuxSampler { namespace gig {
46     class Engine;
47 iliev 2012 class EngineChannel;
48 schoenebeck 53
49     /** Gig Voice
50     *
51     * Renders a voice for the Gigasampler format.
52     */
53 iliev 2015 class Voice : public LinuxSampler::VoiceBase<EngineChannel, ::gig::DimensionRegion, ::gig::Sample, DiskThread> {
54 schoenebeck 53 public:
55     Voice();
56 letz 502 virtual ~Voice();
57 schoenebeck 53 void SetOutput(AudioOutputDevice* pAudioOutputDevice);
58 iliev 2012 void SetEngine(LinuxSampler::Engine* pEngine);
59 persson 2327 void CalculateFadeOutCoeff(float FadeOutTime, float SampleRate);
60 schoenebeck 829
61 iliev 2015 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 persson 2055 virtual void TriggerEG1(const EGInfo& egInfo, double velrelease, double velocityAttenuation, uint sampleRate, uint8_t velocity);
70 iliev 2015 virtual double GetEG2ControllerValue(uint8_t MIDIKeyVelocity);
71     virtual EGInfo CalculateEG2ControllerInfluence(double eg2ControllerValue);
72 persson 2175 virtual void TriggerEG2(const EGInfo& egInfo, double velrelease, double velocityAttenuation, uint sampleRate, uint8_t velocity);
73 iliev 2015 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 schoenebeck 2559 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 iliev 2015 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 persson 2114 virtual void ProcessGroupEvent(RTList<Event>::Iterator& itEvent);
88 persson 2382 virtual int CalculatePan(uint8_t pan);
89 iliev 2012
90 iliev 2015 private:
91 persson 2055 EGADSR EG1;
92 persson 2175 EGADSR EG2;
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 schoenebeck 53 // Attributes
96 schoenebeck 411 Engine* pEngine; ///< Pointer to the sampler engine, to be able to access the event lists.
97 schoenebeck 770 //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 schoenebeck 738
99 schoenebeck 53 // Static Methods
100     static float CalculateFilterCutoffCoeff();
101    
102     // Methods
103 schoenebeck 319 void ProcessEvents(uint Samples);
104 schoenebeck 738 void processCrossFadeEvent(RTList<Event>::Iterator& itEvent);
105 schoenebeck 245
106 iliev 2015 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 persson 832 : 0;
118 iliev 2015 return pRegion->InvertAttenuationController ? 127 - c : c;
119 schoenebeck 236 }
120    
121 schoenebeck 53 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