1 #ifndef __synthVoice_h__ 2 #define __synthVoice_h__ 11 #include "envelopegenerator.h" 12 #include "synthfilter.h" 23 #include "wtoscillator.h" 27 #include "vaoscillator.h" 31 #include "pcmoscillator.h" 35 #include "ksoscillator.h" 39 #include "fmoperator.h" 43 #include "wsoscillator.h" 44 #include "sequencer.h" 55 enum class lfoCoreType { standardLFO, fmLFO };
58 enum class egCoreType { analogEG, dxEG };
61 enum class filterCoreType { virtualAnalog, biQuad };
65 const lfoCoreType lfoCores[
NUM_LFO] =
67 lfoCoreType::standardLFO,
72 const egCoreType ampEGCore = egCoreType::analogEG;
73 const egCoreType filterEGCore = egCoreType::analogEG;
74 const egCoreType auxEGCore = egCoreType::dxEG;
79 filterCoreType::virtualAnalog,
80 filterCoreType::biQuad
87 const bool useAnalogFGN =
false;
90 enum class wtCoreType { classicWT, morphingWT, soundFXWT, drumWT };
93 const wtCoreType wtCores[
NUM_OSC] =
95 wtCoreType::classicWT,
96 wtCoreType::classicWT,
97 wtCoreType::morphingWT,
102 enum class pcmCoreType { legacyPCM, mellotronPCM, waveslicePCM };
105 const pcmCoreType pcmCores[
NUM_OSC] =
107 pcmCoreType::legacyPCM,
108 pcmCoreType::legacyPCM,
109 pcmCoreType::mellotronPCM,
110 pcmCoreType::waveslicePCM
238 uint32_t synthModeIndex =
enumToInt(SynthMode::kMono);
241 uint32_t filterModeIndex =
enumToInt(FilterMode::kSeries);
244 bool enablePortamento =
false;
247 double glideTime_mSec = 0.0;
250 bool legatoMode =
false;
253 bool freeRunOscMode =
false;
256 double unisonDetuneCents = 0.0;
257 double unisonStartPhase = 0.0;
258 double unisonPan = 0.0;
262 std::shared_ptr<WTOscParameters> osc1Parameters = std::make_shared<WTOscParameters>();
263 std::shared_ptr<WTOscParameters> osc2Parameters = std::make_shared<WTOscParameters>();
264 std::shared_ptr<WTOscParameters> osc3Parameters = std::make_shared<WTOscParameters>();
265 std::shared_ptr<WTOscParameters> osc4Parameters = std::make_shared<WTOscParameters>();
266 #elif defined SYNTHLAB_VA 267 std::shared_ptr<VAOscParameters> osc1Parameters = std::make_shared<VAOscParameters>();
268 std::shared_ptr<VAOscParameters> osc2Parameters = std::make_shared<VAOscParameters>();
269 std::shared_ptr<VAOscParameters> osc3Parameters = std::make_shared<VAOscParameters>();
270 std::shared_ptr<VAOscParameters> osc4Parameters = std::make_shared<VAOscParameters>();
271 #elif defined SYNTHLAB_PCM 272 std::shared_ptr<PCMOscParameters> osc1Parameters = std::make_shared<PCMOscParameters>();
273 std::shared_ptr<PCMOscParameters> osc2Parameters = std::make_shared<PCMOscParameters>();
274 std::shared_ptr<PCMOscParameters> osc3Parameters = std::make_shared<PCMOscParameters>();
275 std::shared_ptr<PCMOscParameters> osc4Parameters = std::make_shared<PCMOscParameters>();
276 #elif defined SYNTHLAB_KS 277 std::shared_ptr<KSOscParameters> osc1Parameters = std::make_shared<KSOscParameters>();
278 std::shared_ptr<KSOscParameters> osc2Parameters = std::make_shared<KSOscParameters>();
279 std::shared_ptr<KSOscParameters> osc3Parameters = std::make_shared<KSOscParameters>();
280 std::shared_ptr<KSOscParameters> osc4Parameters = std::make_shared<KSOscParameters>();
281 #elif defined SYNTHLAB_DX 283 uint32_t fmAlgorithmIndex =
enumToInt(DX100Algo::kFM1);
284 std::shared_ptr<FMOperatorParameters> osc1Parameters = std::make_shared<FMOperatorParameters>();
285 std::shared_ptr<FMOperatorParameters> osc2Parameters = std::make_shared<FMOperatorParameters>();
286 std::shared_ptr<FMOperatorParameters> osc3Parameters = std::make_shared<FMOperatorParameters>();
287 std::shared_ptr<FMOperatorParameters> osc4Parameters = std::make_shared<FMOperatorParameters>();
288 #elif defined SYNTHLAB_WS 289 std::shared_ptr<WaveSequencerParameters> waveSequencerParameters = std::make_shared<WaveSequencerParameters>();
291 std::shared_ptr<WSOscParameters> wsOsc1Parameters = std::make_shared<WSOscParameters>();
292 std::shared_ptr<WSOscParameters> wsOsc2Parameters = std::make_shared<WSOscParameters>();
296 std::shared_ptr<LFOParameters> lfo1Parameters = std::make_shared<LFOParameters>();
297 std::shared_ptr<LFOParameters> lfo2Parameters = std::make_shared<LFOParameters>();
300 std::shared_ptr<EGParameters> ampEGParameters = std::make_shared<EGParameters>();
301 std::shared_ptr<EGParameters> filterEGParameters = std::make_shared<EGParameters>();
302 std::shared_ptr<EGParameters> auxEGParameters = std::make_shared<EGParameters>();
305 std::shared_ptr<FilterParameters> filter1Parameters = std::make_shared<FilterParameters>();
306 std::shared_ptr<FilterParameters> filter2Parameters = std::make_shared<FilterParameters>();
309 std::shared_ptr<DCAParameters> dcaParameters = std::make_shared<DCAParameters>();
312 std::shared_ptr<ModMatrixParameters> modMatrixParameters = std::make_shared<ModMatrixParameters>();
315 uint32_t updateCodeDroplists = 0;
316 uint32_t updateCodeKnobs = 0;
320 enum class voiceState { kNoteOnState, kNoteOffState };
392 SynthVoice(std::shared_ptr<MidiInputData> _midiInputData,
393 const std::shared_ptr<MidiOutputData> _midiOutputData,
394 std::shared_ptr<SynthVoiceParameters> _parameters,
395 std::shared_ptr<WavetableDatabase> _wavetableDatabase,
396 std::shared_ptr<PCMSampleDatabase> _sampleDatabase,
397 uint32_t _blockSize = 64);
402 virtual bool reset(
double _sampleRate);
406 virtual bool initialize(
const char* dllPath =
nullptr);
439 void loadLFOCore(uint32_t lfoIndex, uint32_t index);
441 void loadOscCore(uint32_t oscIndex, uint32_t index);
442 void loadEGCore(uint32_t egIndex, uint32_t index);
445 void setDynamicModules(std::vector<std::shared_ptr<SynthLab::ModuleCore>> modules);
452 double sampleRate = 0.0;
453 uint32_t blockSize = 64;
462 void accumulateToMixBuffer(std::shared_ptr<AudioBuffer> oscBuffers, uint32_t samplesInBlock,
double scaling);
463 void writeToMixBuffer(std::shared_ptr<AudioBuffer> oscBuffers, uint32_t samplesInBlock,
double scaling);
486 std::unique_ptr<WaveSequencer> waveSequencer;
489 enum { MAIN_OSC, DETUNED_OSC, NUM_WS_OSC };
490 std::unique_ptr<WSOscillator> wsOscillator[NUM_WS_OSC] = {
nullptr,
nullptr };
491 std::unique_ptr<WSOscillator> wsOscillatorDetuned =
nullptr;
504 std::unique_ptr<EnvelopeGenerator>
ampEG;
506 std::unique_ptr<EnvelopeGenerator>
auxEG;
std::vector< std::string > getModuleCoreNames(uint32_t moduleType)
only for dynamic string loading
Definition: synthvoice.cpp:1020
#define enumToInt(ENUM)
macro helper to cast a typed enum to an int
Definition: synthfunctions.h:234
midiEvent voiceMIDIEvent
MIDI note event for current voice.
Definition: synthvoice.h:474
virtual bool initialize(const char *dllPath=nullptr)
Initialize the voice sub-components; this really only applies to PCM oscillators that need DLL path B...
Definition: synthvoice.cpp:351
std::unique_ptr< EnvelopeGenerator > filterEG
filter EG
Definition: synthvoice.h:505
This is the voice object for a software synth.
Definition: synthvoice.h:389
uint32_t midiData1
BYTE data 1 as UINT.
Definition: synthstructures.h:185
std::unique_ptr< ModMatrix > modMatrix
mod matrix for this voice
Definition: synthvoice.h:482
const uint32_t NUM_OSC
Definition: synthconstants.h:84
const uint32_t NUM_LFO
Definition: synthconstants.h:85
void accumulateToMixBuffer(std::shared_ptr< AudioBuffer > oscBuffers, uint32_t samplesInBlock, double scaling)
accumulating voice audio data
Definition: synthvoice.cpp:508
virtual bool reset(double _sampleRate)
Reset all SynthModules on init or when sample rate changes.
Definition: synthvoice.cpp:376
std::unique_ptr< SynthLFO > lfo[NUM_LFO]
LFOs.
Definition: synthvoice.h:498
std::shared_ptr< SynthVoiceParameters > parameters
Definition: synthvoice.h:449
int32_t currentMIDINote
voice timestamp, for knowing the age of a voice
Definition: synthvoice.h:467
unsigned int getStealMIDINoteNumber()
note is data byte 1, velocity is byte 2
Definition: synthvoice.h:426
std::unique_ptr< SynthFilter > filter[NUM_FILTER]
filters
Definition: synthvoice.h:501
void clearTimestamp()
reset timestamp after voice is turned off
Definition: synthvoice.h:420
void writeToMixBuffer(std::shared_ptr< AudioBuffer > oscBuffers, uint32_t samplesInBlock, double scaling)
write to final mix buffer
Definition: synthvoice.cpp:532
void loadFilterCore(uint32_t filterIndex, uint32_t index)
load a new filter core
Definition: synthvoice.cpp:1309
void loadOscCore(uint32_t oscIndex, uint32_t index)
load a new oscillator core
Definition: synthvoice.cpp:1347
std::shared_ptr< AudioBuffer > mixBuffers
buffers for mixing audio and procesisng the voice digital audio engine
Definition: synthvoice.h:461
Definition: analogegcore.cpp:4
bool stealPending
stealing is inevitible
Definition: synthvoice.h:477
std::vector< std::string > getModuleStrings(uint32_t mask, bool modKnobs)
only for dynamic string loading
Definition: synthvoice.cpp:1094
virtual bool doNoteOn(midiEvent &event)
Note-on handler for voice.
Definition: synthvoice.cpp:844
void loadEGCore(uint32_t egIndex, uint32_t index)
load a new EG core
Definition: synthvoice.cpp:1444
const uint32_t NUM_FILTER
Definition: synthconstants.h:86
void setAllCustomUpdateCodes()
one of many ways to keep track of what needs updating; this will likely be very dependent on your GUI...
Definition: synthvoice.cpp:972
voiceState getVoiceState()
Definition: synthvoice.h:414
std::shared_ptr< PCMSampleDatabase > sampleDatabase
shared PCM database
Definition: synthvoice.h:459
virtual bool processMIDIEvent(midiEvent &event)
MIDI Event handler.
Definition: synthvoice.cpp:942
bool voiceIsStealing()
trur if voice will be stolen
Definition: synthvoice.h:427
std::unique_ptr< SynthModule > oscillator[NUM_OSC]
oscillators
Definition: synthvoice.h:494
uint32_t timestamp
voice timestamp, for knowing the age of a voice
Definition: synthvoice.h:466
midiEvent voiceStealMIDIEvent
MIDI note event for the new (stolen) voice.
Definition: synthvoice.h:478
SynthVoice(std::shared_ptr< MidiInputData > _midiInputData, const std::shared_ptr< MidiOutputData > _midiOutputData, std::shared_ptr< SynthVoiceParameters > _parameters, std::shared_ptr< WavetableDatabase > _wavetableDatabase, std::shared_ptr< PCMSampleDatabase > _sampleDatabase, uint32_t _blockSize=64)
Construction:
Definition: synthvoice.cpp:27
std::unique_ptr< DCA > dca
one and only DCA
Definition: synthvoice.h:509
This structure holds all of the information needed to for the plugin framework to send MIDI informati...
Definition: synthbase.h:1316
Contains parameters for the Synth Voice component.
Definition: synthvoice.h:233
virtual bool render(SynthProcessInfo &synthProcessInfo)
Render a block of audio data for an active note event.
Definition: synthvoice.cpp:562
virtual ~SynthVoice()
empty destructor
Definition: synthvoice.h:399
void setDynamicModules(std::vector< std::shared_ptr< SynthLab::ModuleCore >> modules)
add dynamically loaded DLL modules to existing cores
Definition: synthvoice.cpp:1205
void loadLFOCore(uint32_t lfoIndex, uint32_t index)
load a new LFO core
Definition: synthvoice.cpp:1273
std::shared_ptr< MidiInputData > midiInputData
shared MIDI input data
Definition: synthvoice.h:456
std::unique_ptr< EnvelopeGenerator > ampEG
amp EG
Definition: synthvoice.h:504
bool isVoiceActive()
Definition: synthvoice.h:411
uint32_t getTimestamp()
get current timestamp, the higher the value, the older the voice has been running ...
Definition: synthvoice.h:418
bool voiceIsActive
activity flag
Definition: synthvoice.h:473
std::shared_ptr< WavetableDatabase > wavetableDatabase
shared wavetable database
Definition: synthvoice.h:458
void incrementTimestamp()
increment timestamp when a new note is triggered
Definition: synthvoice.h:419
voiceState voiceNoteState
state variable
Definition: synthvoice.h:470
unsigned int getMIDINoteNumber()
note is data byte 1, velocity is byte 2
Definition: synthvoice.h:423
std::unique_ptr< EnvelopeGenerator > auxEG
auxEG
Definition: synthvoice.h:506
virtual bool doNoteOff(midiEvent &event)
Note-off handler for voice.
Definition: synthvoice.cpp:904
Information about a MIDI event.
Definition: synthstructures.h:155
const std::shared_ptr< MidiOutputData > midiOutputData
shared MIDI output data (not used in SynthLab)
Definition: synthvoice.h:457
virtual bool update()
Update voice specific stuff.
Definition: synthvoice.cpp:411