37 |
#include "../gig/SmoothVolume.h" |
#include "../gig/SmoothVolume.h" |
38 |
#include "../gig/Synthesizer.h" |
#include "../gig/Synthesizer.h" |
39 |
#include "../gig/Profiler.h" |
#include "../gig/Profiler.h" |
40 |
|
#include "SignalUnitRack.h" |
41 |
|
|
42 |
// include the appropriate (unsigned) triangle LFO implementation |
// include the appropriate (unsigned) triangle LFO implementation |
43 |
#if CONFIG_UNSIGNED_TRIANG_ALGO == INT_MATH_SOLUTION |
#if CONFIG_UNSIGNED_TRIANG_ALGO == INT_MATH_SOLUTION |
83 |
public: |
public: |
84 |
type_t Type; ///< Voice Type (bit field, a voice may have several types) |
type_t Type; ///< Voice Type (bit field, a voice may have several types) |
85 |
int MIDIKey; ///< MIDI key number of the key that triggered the voice |
int MIDIKey; ///< MIDI key number of the key that triggered the voice |
86 |
|
uint8_t MIDIVelocity; ///< MIDI velocity of the key that triggered the voice |
87 |
|
|
88 |
|
SignalUnitRack* const pSignalUnitRack; |
89 |
|
|
90 |
AbstractVoice(); |
AbstractVoice(SignalUnitRack* pRack); |
91 |
virtual ~AbstractVoice(); |
virtual ~AbstractVoice(); |
92 |
|
|
93 |
inline bool IsActive() { return PlaybackState; } |
inline bool IsActive() { return PlaybackState; } |
104 |
); |
); |
105 |
|
|
106 |
virtual void Synthesize(uint Samples, sample_t* pSrc, uint Skip); |
virtual void Synthesize(uint Samples, sample_t* pSrc, uint Skip); |
107 |
|
|
108 |
|
uint GetSampleRate() { return GetEngine()->SampleRate; } |
109 |
|
|
110 |
void processCCEvents(RTList<Event>::Iterator& itEvent, uint End); |
void processCCEvents(RTList<Event>::Iterator& itEvent, uint End); |
111 |
void processPitchEvent(RTList<Event>::Iterator& itEvent); |
void processPitchEvent(RTList<Event>::Iterator& itEvent); |
166 |
virtual InstrumentInfo GetInstrumentInfo() = 0; |
virtual InstrumentInfo GetInstrumentInfo() = 0; |
167 |
|
|
168 |
/** |
/** |
169 |
|
* Most of the important members of the voice are set when the voice |
170 |
|
* is triggered (like pEngineChannel, pRegion, pSample, etc). |
171 |
|
* This method is called after these members are set and before |
172 |
|
* the voice is actually triggered. |
173 |
|
* Override this method if you need to do some additional |
174 |
|
* initialization which depends on these members before the voice |
175 |
|
* is triggered. |
176 |
|
*/ |
177 |
|
virtual void AboutToTrigger() { } |
178 |
|
|
179 |
|
virtual bool EG1Finished(); |
180 |
|
|
181 |
|
/** |
182 |
* Gets the sample cache size in bytes. |
* Gets the sample cache size in bytes. |
183 |
*/ |
*/ |
184 |
virtual unsigned long GetSampleCacheSize() = 0; |
virtual unsigned long GetSampleCacheSize() = 0; |
185 |
|
|
186 |
|
/** |
187 |
|
* Because in most cases we cache part of the sample in RAM, if the |
188 |
|
* offset is too big (will extend beyond the RAM cache if the cache contains |
189 |
|
* the beginning of the sample) we should cache in the RAM buffer not the |
190 |
|
* beginning of the sample but a part that starts from the sample offset point. |
191 |
|
* In that case the current sample position should start from zero (Pos). |
192 |
|
* When the offset fits into RAM buffer or the whole sample is cached |
193 |
|
* in RAM, Pos should contain the actual offset. |
194 |
|
* We don't trim the sample because it might have a defined |
195 |
|
* loop start point before the start point of the playback. |
196 |
|
*/ |
197 |
|
virtual void SetSampleStartOffset(); |
198 |
|
|
199 |
/** |
/** |
200 |
* Returns the correct amplitude factor for the given \a MIDIKeyVelocity. |
* Returns the correct amplitude factor for the given \a MIDIKeyVelocity. |