4 |
* * |
* * |
5 |
* Copyright (C) 2003,2004 by Benno Senoner and Christian Schoenebeck * |
* Copyright (C) 2003,2004 by Benno Senoner and Christian Schoenebeck * |
6 |
* Copyright (C) 2005-2008 Christian Schoenebeck * |
* Copyright (C) 2005-2008 Christian Schoenebeck * |
7 |
* Copyright (C) 2009-2011 Christian Schoenebeck and Grigor Iliev * |
* Copyright (C) 2009-2012 Christian Schoenebeck and Grigor Iliev * |
8 |
* * |
* * |
9 |
* This program is free software; you can redistribute it and/or modify * |
* 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 * |
* it under the terms of the GNU General Public License as published by * |
82 |
class AbstractVoice : public Voice { |
class AbstractVoice : public Voice { |
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 |
NoteBase* pNote; ///< Note this voice belongs to and was caused by. |
86 |
|
int MIDIPan; ///< the current MIDI pan value plus the value from RegionInfo |
87 |
|
|
88 |
AbstractVoice(); |
SignalUnitRack* const pSignalUnitRack; |
89 |
|
|
90 |
|
AbstractVoice(SignalUnitRack* pRack); |
91 |
virtual ~AbstractVoice(); |
virtual ~AbstractVoice(); |
92 |
|
|
93 |
inline bool IsActive() { return PlaybackState; } |
inline bool IsActive() { return PlaybackState; } |
103 |
int iKeyGroup |
int iKeyGroup |
104 |
); |
); |
105 |
|
|
106 |
|
/** Invoked when the voice is freed - gone from active to inactive. */ |
107 |
|
virtual void VoiceFreed() { } |
108 |
|
|
109 |
virtual void Synthesize(uint Samples, sample_t* pSrc, uint Skip); |
virtual void Synthesize(uint Samples, sample_t* pSrc, uint Skip); |
110 |
|
|
111 |
uint GetSampleRate() { return GetEngine()->SampleRate; } |
uint GetSampleRate() { return GetEngine()->SampleRate; } |
112 |
|
|
113 |
virtual SignalUnitRack* GetSignalUnitRack() { return NULL; } |
uint8_t GetControllerValue(uint8_t Controller) { |
114 |
|
return (Controller > 128) ? 0 : pEngineChannel->ControllerTable[Controller]; |
115 |
|
} |
116 |
|
|
117 |
|
/// Keyboard key on which this voice should listen to transitional events (i.e. note-off events to release the voice). |
118 |
|
inline uint8_t HostKey() const { return pNote->hostKey; } |
119 |
|
/// Keyboard key which the voice should use for calculating any synthesis relevant parameters (i.e. pitch). |
120 |
|
inline uint8_t MIDIKey() const { return pNote->cause.Param.Note.Key; } |
121 |
|
/// MIDI note-on velocity value which the voice should use for calculating any synthesis relevant parameters (i.e. amplitude). |
122 |
|
inline uint8_t MIDIVelocity() const { return pNote->cause.Param.Note.Velocity; } |
123 |
|
|
124 |
void processCCEvents(RTList<Event>::Iterator& itEvent, uint End); |
void processCCEvents(RTList<Event>::Iterator& itEvent, uint End); |
125 |
void processPitchEvent(RTList<Event>::Iterator& itEvent); |
void processPitchEvent(RTList<Event>::Iterator& itEvent); |
128 |
void processGroupEvents(RTList<Event>::Iterator& itEvent, uint End); |
void processGroupEvents(RTList<Event>::Iterator& itEvent, uint End); |
129 |
void UpdatePortamentoPos(Pool<Event>::Iterator& itNoteOffEvent); |
void UpdatePortamentoPos(Pool<Event>::Iterator& itNoteOffEvent); |
130 |
void Kill(Pool<Event>::Iterator& itKillEvent); |
void Kill(Pool<Event>::Iterator& itKillEvent); |
131 |
|
void CreateEq(); |
132 |
|
void onScaleTuningChanged(); |
133 |
|
|
134 |
bool Orphan; ///< true if this voice is playing a sample from an instrument that is unloaded. When the voice dies, the sample (and dimension region) will be handed back to the instrument resource manager. |
bool Orphan; ///< true if this voice is playing a sample from an instrument that is unloaded. When the voice dies, the sample (and dimension region) will be handed back to the instrument resource manager. |
135 |
playback_state_t PlaybackState; ///< When a sample will be triggered, it will be first played from RAM cache and after a couple of sample points it will switch to disk streaming and at the end of a disk stream we have to add null samples, so the interpolator can do it's work correctly |
playback_state_t PlaybackState; ///< When a sample will be triggered, it will be first played from RAM cache and after a couple of sample points it will switch to disk streaming and at the end of a disk stream we have to add null samples, so the interpolator can do it's work correctly |
175 |
gig::SynthesisParam finalSynthesisParameters; |
gig::SynthesisParam finalSynthesisParameters; |
176 |
gig::Loop loop; |
gig::Loop loop; |
177 |
RTList<Event>* pGroupEvents; ///< Events directed to an exclusive group |
RTList<Event>* pGroupEvents; ///< Events directed to an exclusive group |
178 |
|
|
179 |
|
EqSupport* pEq; ///< Used for per voice equalization |
180 |
|
bool bEqSupport; |
181 |
|
|
182 |
|
void PrintEqInfo() { |
183 |
|
if (!bEqSupport || pEq == NULL) { |
184 |
|
dmsg(1,("EQ support: no\n")); |
185 |
|
} else { |
186 |
|
pEq->PrintInfo(); |
187 |
|
} |
188 |
|
} |
189 |
|
|
190 |
virtual AbstractEngine* GetEngine() = 0; |
virtual AbstractEngine* GetEngine() = 0; |
191 |
virtual SampleInfo GetSampleInfo() = 0; |
virtual SampleInfo GetSampleInfo() = 0; |
300 |
|
|
301 |
virtual void GetFirstEventOnKey(uint8_t MIDIKey, RTList<Event>::Iterator& itEvent) = 0; |
virtual void GetFirstEventOnKey(uint8_t MIDIKey, RTList<Event>::Iterator& itEvent) = 0; |
302 |
virtual void ProcessCCEvent(RTList<Event>::Iterator& itEvent) = 0; |
virtual void ProcessCCEvent(RTList<Event>::Iterator& itEvent) = 0; |
303 |
|
virtual void ProcessChannelPressureEvent(RTList<Event>::Iterator& itEvent) = 0; |
304 |
|
virtual void ProcessPolyphonicKeyPressureEvent(RTList<Event>::Iterator& itEvent) = 0; |
305 |
virtual void ProcessCutoffEvent(RTList<Event>::Iterator& itEvent) = 0; |
virtual void ProcessCutoffEvent(RTList<Event>::Iterator& itEvent) = 0; |
306 |
virtual double GetVelocityRelease(uint8_t MIDIKeyVelocity) = 0; |
virtual double GetVelocityRelease(uint8_t MIDIKeyVelocity) = 0; |
307 |
|
|
309 |
|
|
310 |
virtual void ProcessGroupEvent(RTList<Event>::Iterator& itEvent) = 0; |
virtual void ProcessGroupEvent(RTList<Event>::Iterator& itEvent) = 0; |
311 |
void EnterReleaseStage(); |
void EnterReleaseStage(); |
312 |
|
|
313 |
|
virtual int CalculatePan(uint8_t pan) = 0; |
314 |
}; |
}; |
315 |
} // namespace LinuxSampler |
} // namespace LinuxSampler |
316 |
|
|