31#define DEBUG_VOICE_COUNT 0
42 static constexpr int kDefaultPitchBendRange = 12;
44#pragma mark - MidiSynth class
55 mVoiceAllocator.Clear();
58 void SetSampleRateAndBlockSize(
double sampleRate,
int blockSize);
65 mVoicesAreActive = active;
76 mNonMPEPitchBendRange = pitchBendRange;
80 for(
int i=0; i<16; ++i)
82 mChannelStates[i].pitchBendRange = pitchBendRange;
87 void SetPolyMode(VoiceAllocator::EPolyMode mode)
89 mVoiceAllocator.mPolyMode = mode;
92 void SetATMode(VoiceAllocator::EATMode mode)
94 mVoiceAllocator.mATMode = mode;
103 mVoiceAllocator.SetKeyToPitchFunction(fn);
106 void SetNoteOffset(
double offset)
108 mVoiceAllocator.SetPitchOffset(
static_cast<float>(offset));
111 void SetNoteGlideTime(
double t)
113 mVoiceAllocator.SetNoteGlideTime(t);
116 void SetControlGlideTime(
double t)
118 mVoiceAllocator.SetControlGlideTime(t);
123 return mVoiceAllocator.GetVoice(voiceIdx);
126 void ForEachVoice(std::function<
void(
SynthVoice& voice)> func)
128 for (
auto v = 0; v < NVoices(); v++)
132 size_t NVoices()
const
134 return mVoiceAllocator.GetNVoices();
140 mVoiceAllocator.
AddVoice(pVoice, zone);
143 void AddMidiMsgToQueue(
const IMidiMsg& msg)
155 bool ProcessBlock(sample** inputs, sample** outputs,
int nInputs,
int nOutputs,
int nFrames);
166 uint8_t pitchBendRange;
173 const int kMPELowerZoneMasterChannel = 0;
174 const int kMPEUpperZoneMasterChannel = 15;
175 inline bool IsMasterChannel(
int c)
const {
return ((c == 0)||(c == 15)); }
176 bool IsInLowerZone(
int c)
const {
return ((c > 0)&&(c < mMPELowerZoneChannels)); }
177 bool IsInUpperZone(
int c)
const {
return ((c < 15)&&(c > 15 - mMPEUpperZoneChannels)); }
178 int MasterChannelFor(
int memberChan)
const {
return IsInUpperZone(memberChan) ? kMPEUpperZoneMasterChannel : kMPELowerZoneMasterChannel; }
179 int MasterZoneFor(
int memberChan)
const {
return IsInUpperZone(memberChan) ? 1 : 0; }
182 int LowerZoneStart()
const {
return 1; }
183 int LowerZoneEnd()
const {
return mMPELowerZoneChannels - 1; }
184 int UpperZoneStart()
const {
return 15 - mMPEUpperZoneChannels; }
185 int UpperZoneEnd()
const {
return 15; }
187 void SetMPEZones(
int channel,
int nChans);
188 void SetChannelPitchBendRange(
int channel,
int range);
197 uint16_t mUnisonVoices{1};
199 float mVelocityLUT[128];
200 float mAfterTouchLUT[128];
201 ChannelState mChannelStates[16]{};
203 int64_t mSampleTime{0};
204 double mSampleRate = DEFAULT_SAMPLE_RATE;
205 bool mVoicesAreActive =
false;
206 int mNonMPEPitchBendRange = kDefaultPitchBendRange;
210 bool mMPEMode{
false};
213 int mMPELowerZoneChannels{0};
214 int mMPEUpperZoneChannels{0};
IPlug Constant definitions, Types, magic numbers.
IPlug logging a.k.a tracing functionality.
MIDI and sysex structs/utilites.
A monophonic/polyphonic synthesiser base class which can be supplied with a custom voice.
void SetVoicesActive(bool active)
If you are using this class in a non-traditional mode of polyphony (e.g.to stack loads of voices) you...
bool ProcessBlock(sample **inputs, sample **outputs, int nInputs, int nOutputs, int nFrames)
Processes a block of audio samples.
void SetPitchBendRange(int pitchBendRange)
Set the pitch bend range for non-MPE mode.
void SetKeyToPitchFn(const std::function< float(int)> &fn)
Set this function to something other than the default if you need to implement a tuning table for mic...
void AddVoice(SynthVoice *pVoice, uint8_t zone)
adds a SynthVoice to this MidiSynth, taking ownership of the object.
static constexpr int kDefaultBlockSize
This defines the size in samples of a single block of processing that will be done by the synth.
void AddVoice(SynthVoice *pv, uint8_t zone)
Add a synth voice to the allocator.
Encapsulates a MIDI message and provides helper functions.