42const uint8_t kAllZones = UCHAR_MAX;
43const uint8_t kAllChannels = UCHAR_MAX;
44const uint8_t kAllKeys = UCHAR_MAX;
47const uint8_t kVoicesBusy = 1 << 0;
48const uint8_t kVoicesMostRecent = 1 << 1;
49const uint8_t kVoicesAll = 1 << 2;
74 int mControllerNumber;
79#pragma mark - VoiceAllocator class
99 static constexpr int kVoiceMostRecent = 1 << 7;
102 using VoiceControlRamps = ControlRampProcessor::ProcessorArray<kNumVoiceControlRamps>;
112 void SetSampleRateAndBlockSize(
double sampleRate,
int blockSize) { mSampleRate = sampleRate; CalcGlideTimesInSamples(); }
113 void SetNoteGlideTime(
double t) { mNoteGlideTime = t; CalcGlideTimesInSamples(); }
114 void SetControlGlideTime(
double t) { mControlGlideTime = t; CalcGlideTimesInSamples(); }
133 void SetKeyToPitchFunction(
const std::function<
float(
int)>& fn) {mKeyToPitchFn = fn;}
138 void ProcessVoices(sample** inputs, sample** outputs,
int nInputs,
int nOutputs,
int startIndex,
int blockSize);
140 size_t GetNVoices()
const {
return mVoicePtrs.size();}
141 SynthVoice* GetVoice(
int voiceIndex)
const {
return mVoicePtrs[voiceIndex];}
142 void SetPitchOffset(
float offset) { mPitchOffset = offset; }
145 using VoiceBitsArray = std::bitset<UCHAR_MAX>;
149 void SendControlToVoiceInputs(VoiceBitsArray v,
int ctlIdx,
float val,
int glideSamples);
150 void SendControlToVoicesDirect(VoiceBitsArray v,
int ctlIdx,
float val);
151 void SendProgramChangeToVoices(VoiceBitsArray v,
int pgm);
153 void StartVoice(
int voiceIdx,
int channel,
int key,
float pitch,
float velocity,
int sampleOffset, int64_t sampleTime,
bool retrig);
154 void StartVoices(VoiceBitsArray voices,
int channel,
int key,
float pitch,
float velocity,
int sampleOffset, int64_t sampleTime,
bool retrig);
156 void StopVoice(
int voiceIdx,
int sampleOffset);
157 void StopVoices(VoiceBitsArray voices,
int sampleOffset);
159 void CalcGlideTimesInSamples();
161 int FindFreeVoiceIndex(
int startIndex)
const;
162 int FindVoiceIndexToSteal(int64_t sampleTime)
const;
169 std::vector<SynthVoice*> mVoicePtrs;
170 std::vector<std::unique_ptr<VoiceControlRamps>> mVoiceGlides;
171 std::vector<int> mHeldKeys;
172 std::vector<int> mSustainedNotes;
174 std::function<float(
int)> mKeyToPitchFn;
175 double mPitchOffset{0.};
177 double mNoteGlideTime{0.};
178 double mControlGlideTime{0.01};
179 int mNoteGlideSamples{0};
180 int mControlGlideSamples{0};
184 bool mRotateVoices{
true};
185 int mVoiceRotateIndex{0};
186 bool mSustainPedalDown{
false};
187 float mModWheel{0.f};
188 float mMinHeldVelocity{1.f};
191 EPolyMode mPolyMode {kPolyModePoly};
192 EATMode mATMode {kATModeChannel};
IPlug logging a.k.a tracing functionality.
A lock-free SPSC queue used to transfer data between threads based on MLQueue.h by Randy Jones based ...
void HardKillAllVoices()
Stop all voices from making sound immdiately.
void AddEvent(VoiceInputEvent e)
Add a single event to the input queue for the current processing block.
void SendEventToVoices(VoiceInputEvent event)
Send the event to the voices matching its address.
void SoftKillAllVoices()
Turn all voice gates off, allowing any voice envelopes to finish.
void ProcessEvents(int samples, int64_t sampleTime)
Process all input events and generate voice outputs.
void AddVoice(SynthVoice *pv, uint8_t zone)
Add a synth voice to the allocator.
A generic synthesizer voice to be controlled by a voice allocator.