SynthLab SDK
synthengine.h
1 #ifndef __synthCore_h__
2 #define __synthCore_h__
3 
4 // --- we need these
5 #include "synthbase.h"
6 #include "synthfunctions.h"
7 #include "synthvoice.h"
8 
9 namespace SynthLab
10 {
30  struct SynthEngineParameters
31  {
32  SynthEngineParameters() {}
33 
34  // --- enable/disable keyboard (MIDI note event) input; when disabled, synth goes into manual mode (Will's VCS3)
35  bool enableMIDINoteEvents = true;
36 
37  // --- global synth mode
38  uint32_t synthModeIndex = enumToInt(SynthMode::kMono);
39 
40  // --- global volume control, controls each output DCA's master volume
41  double globalVolume_dB = 0.0;
42 
43  // --- master pitch bend, in semitones and cents
44  unsigned int globalPitchBendSensCoarse = 7; // --- this number is always positive (parse as +/- value) 7 semitones = perfect 5th
45  unsigned int globalPitchBendSensFine = 0; // --- this number is always positive (parse as +/- value) see MIDI RPN 00 00 (sensitivity) and 00 01 (fine tuning, cents -100/+100) and 00 02 (coarse tuning, semintones -63/+64)
46 
47  // --- these are actually really important, especially for non-western music styles and
48  // eccentric electronic music composers too...
49  int globalTuningCoarse = 0; // --- (+/-) semitones, see MIDI spec
50  int globalTuningFine = 0; // --- (+/-) cents see MIDI spec
51 
52  // --- unison Detune - this is the max detuning value NOTE a standard (or RPN or NRPN) parameter :/
53  double globalUnisonDetune_Cents = 0.0;
54 
55  // --- VOICE layer parameters
56  std::shared_ptr<SynthVoiceParameters> voiceParameters = std::make_shared<SynthVoiceParameters>();
57 
58  // --- FX is unique to engine, not part of voice
59  // std::shared_ptr<AudioDelayParameters> audioDelayParameters = std::make_shared<AudioDelayParameters>();
60  // bool enableDelayFX = false;
61  };
62 
63 
80  class SynthEngine
81  {
82  public:
83  SynthEngine(uint32_t blockSize = 64);
84  virtual ~SynthEngine();
85 
87  virtual bool reset(double _sampleRate);
88  virtual bool render(SynthProcessInfo& synthProcessInfo);
89  virtual bool processMIDIEvent(midiEvent& event);
90  virtual bool initialize(const char* dllPath = nullptr);
91 
93  void accumulateVoice(SynthProcessInfo& synthProcessInfo, double scaling = 0.707);
94  void applyGlobalVolume(SynthProcessInfo& synthProcessInfo);
95 
96  // --- get parameters
97  void getParameters(std::shared_ptr<SynthEngineParameters>& _parameters) { _parameters = parameters; }
98 
99  // --- set parameters
100  void setParameters(std::shared_ptr<SynthEngineParameters>& _parameters);
101 
103  int getFreeVoiceIndex();
104  int getVoiceIndexToSteal();
105  int getActiveVoiceIndexInNoteOn(unsigned int midiNoteNumber);
106  int getStealingVoiceIndexInNoteOn(unsigned int midiNoteNumber);
107 
108  protected:
109  // --- only need one for iteration
110  SynthProcessInfo voiceProcessInfo;
111 
112  // --- our modifiers (parameters)
113  // --- SynthEngineParameters parameters;
114  std::shared_ptr<SynthEngineParameters> parameters = std::make_shared<SynthEngineParameters>();
115 
116  // --- shared MIDI tables, via IMIDIData
117  std::shared_ptr<MidiInputData> midiInputData = std::make_shared<MidiInputData>();
118  std::shared_ptr<MidiOutputData> midiOutputData = std::make_shared<MidiOutputData>();
119 
120  // --- array of voice object, via pointers
121  std::unique_ptr<SynthVoice> synthVoices[MAX_VOICES] = { 0, 0, 0, 0, 0, 0, 0, 0,0, 0, 0, 0, 0, 0, 0, 0 };
122 
123  // --- shared tables, in case they are huge or need a long creation time
124  std::shared_ptr<WavetableDatabase> wavetableDatabase = nullptr;
125 
126  // --- shared tables, in case they are huge or need a long creation time
127  std::shared_ptr<PCMSampleDatabase> sampleDatabase = nullptr;
128 
129  };
130 
131 }
132 
133 #endif /* defined(__synthCore_h__) */
#define enumToInt(ENUM)
macro helper to cast a typed enum to an int
Definition: synthfunctions.h:251
virtual bool reset(double _sampleRate)
Resets all voices and the audio delay object.
Definition: synthengine.cpp:82
void accumulateVoice(SynthProcessInfo &synthProcessInfo, double scaling=0.707)
Accumulates voice buffers into a single mix buffer for each channel.
Definition: synthengine.cpp:230
int getFreeVoiceIndex()
Helper function to find a free voice to use.
Definition: synthengine.cpp:451
int getActiveVoiceIndexInNoteOn(unsigned int midiNoteNumber)
Helper function to find the voice that is playing a certain MIDI note.
Definition: synthengine.cpp:500
std::unique_ptr< SynthVoice > synthVoices[MAX_VOICES]
array of voice objects for the engine
Definition: synthengine.h:129
SynthEngine(uint32_t blockSize=64)
Construction:
Definition: synthengine.cpp:31
virtual bool render(SynthProcessInfo &synthProcessInfo)
Render a buffer of output audio samples.
Definition: synthengine.cpp:131
Definition: addosccore.cpp:4
int getStealingVoiceIndexInNoteOn(unsigned int midiNoteNumber)
Helper function to find the voice that is playing a certain MIDI note and that will be stolen...
Definition: synthengine.cpp:520
int getVoiceIndexToSteal()
Helper function to find a free voice to steal based on some kind of heuristic.
Definition: synthengine.cpp:469
void setParameters(std::shared_ptr< SynthEngineParameters > &_parameters)
Function to update the engine and voice parameters.
Definition: synthengine.cpp:396
const uint32_t MAX_VOICES
Definition: synthconstants.h:35
virtual bool initialize(const char *dllPath=nullptr)
Initializes all voices with the DLL path.
Definition: synthengine.cpp:103
void applyGlobalVolume(SynthProcessInfo &synthProcessInfo)
Apply a single global volume control to output mix buffers.
Definition: synthengine.cpp:195
virtual ~SynthEngine()
Destruction:
Definition: synthengine.cpp:68
virtual bool processMIDIEvent(midiEvent &event)
The MIDI event handler function; for note on/off messages it finds the voices to turn on/off...
Definition: synthengine.cpp:255
hard-coded arrays of FIR filter coefficients for the sample rate conversion objects (Interpolator and...
See also Designing Software Synthesizers in C++ 2nd Ed. by Will Pirkle.