Krotos Modules 3
Loading...
Searching...
No Matches
KwidgetProcessor_CoreEngine.cpp
Go to the documentation of this file.
1namespace krotos
2{
3 using Parameters = Kwidget_CoreEngine::Parameters;
4
6 : KwidgetProcessor(owner), m_soSound(sound), m_attachmentCache(GParam::NUM_PARAMS)
7 {
9 {Parameters::Size, nullptr, -1},
10 {Parameters::Rate, nullptr, -1},
11 {Parameters::Pitch, nullptr, -1},
12 {Parameters::PitchMod, nullptr, -1},
13 {Parameters::Width, nullptr, -1},
14 {Parameters::Pan, nullptr, -1},
15 {Parameters::Level, nullptr, -1},
16 {Parameters::SamplerLevel, nullptr, -1},
17 {Parameters::GranularLevel, nullptr, -1},
18 {Parameters::VehicleLevel, nullptr, -1},
19 {Parameters::LevelMod, nullptr, -1},
20 {Parameters::StartRand, nullptr, -1},
21 {Parameters::SizeRand, nullptr, -1},
22 {Parameters::RateRand, nullptr, -1},
23 {Parameters::PitchRand, nullptr, -1},
24 {Parameters::WidthRand, nullptr, -1},
25 {Parameters::PanRand, nullptr, -1},
26 {Parameters::LevelRand, nullptr, -1},
27 {Parameters::Quench, nullptr, -1},
28 {Parameters::Robin, nullptr, -1},
29 {Parameters::SALoop, nullptr, -1},
30 {Parameters::AutoRate, nullptr, -1},
31 {Parameters::PhaseLock, nullptr, -1},
32 {Parameters::PhaseSync, nullptr, -1},
33 {Parameters::Normalise, nullptr, -1},
34 {Parameters::MuteUp, nullptr, -1},
35 {Parameters::MuteDown, nullptr, -1},
36 {Parameters::Autoplay, nullptr, -1},
37 {Parameters::Shape, nullptr, -1},
38 {Parameters::GrainMax, nullptr, -1},
39 {Parameters::Tracking, nullptr, -1},
40 {Parameters::Cycles, nullptr, -1},
41 {Parameters::Smoothing, nullptr, -1},
42 {Parameters::Sensitivity, nullptr, -1},
43 {Parameters::ASize, nullptr, -1},
44 {Parameters::ARate, nullptr, -1},
45 {Parameters::ASpray, nullptr, -1},
46 {Parameters::AMix, nullptr, -1},
47 {Parameters::BSize, nullptr, -1},
48 {Parameters::BRate, nullptr, -1},
49 {Parameters::BSpray, nullptr, -1},
50 {Parameters::BMix, nullptr, -1},
51 {Parameters::Mode, nullptr, -1},
52 {Parameters::Mute, nullptr, -1},
53 {Parameters::Solo, nullptr, -1},
54 {Parameters::MIDIMode, nullptr, -1},
55 {Parameters::Distance, [this](float x) { setDistance(x); }, 10}});
56
57 // Set up a cache vector of KAttachment* indexed by the GranularParameter enum to save cpu spent on map lookups
58 // during the process block.
92 m_attachmentCache[GParam::MovementSensitivity] = getAttachment(Parameters::Sensitivity);
104
106 }
107
108 void KwidgetProcessor_CoreEngine::prepare(double sampleRate, int samplesPerBlock)
109 {
110 m_soSound.Prepare(30, static_cast<float>(sampleRate));
111 m_oscillator.setSampleRate(sampleRate);
112 m_SAFilter.prepare(sampleRate, samplesPerBlock);
113 }
114
115 void KwidgetProcessor_CoreEngine::process(AudioBuffer<float>& buffer)
116 {
117 String accessID = "CoreEngine::process::" + getKwidgetID();
118 if (m_soSound.requestAccess(accessID))
119 {
120 processBlockInternal(buffer);
121
123 }
124 else
125 {
126 auto numSamples = buffer.getNumSamples();
127 nextBlock(numSamples);
128 }
129 }
130
132 {
134 {
135 // If we are in sampler mode, we are only active if the sample engine is playing - ie has active grain/s
137 }
138 else
139 {
140 // Otherwise we say we are always active so we can hold onto the voice even when playing grains sparsely
141 // ie there is silence between grains
142 // The voice will be terminated in this case when the child kwidget, ADSR, times out
143 return true;
144 }
145 }
146
148 {
149 auto numSamples = buffer.getNumSamples();
150 auto numChannels = buffer.getNumChannels();
151 auto bufferPtr = const_cast<float**>(buffer.getArrayOfWritePointers());
152
153 nextBlock(numSamples);
154
155 m_oscillator.setGranularParameter(GParam::Start, m_attachmentCache[GParam::Start]->data());
156 m_oscillator.setGranularParameter(GParam::StartRand, m_attachmentCache[GParam::StartRand]->data());
157 m_oscillator.setGranularParameter(GParam::Size, m_attachmentCache[GParam::Size]->data());
158 m_oscillator.setGranularParameter(GParam::SizeRand, m_attachmentCache[GParam::SizeRand]->data());
159 m_oscillator.setGranularParameter(GParam::Rate, m_attachmentCache[GParam::Rate]->data());
160 m_oscillator.setGranularParameter(GParam::RateRand, m_attachmentCache[GParam::RateRand]->data());
161 m_oscillator.setGranularParameter(GParam::Width, m_attachmentCache[GParam::Width]->data());
162 m_oscillator.setGranularParameter(GParam::WidthRand, m_attachmentCache[GParam::WidthRand]->data());
163 m_oscillator.setGranularParameter(GParam::Pan, m_attachmentCache[GParam::Pan]->data());
164 m_oscillator.setGranularParameter(GParam::PanRand, m_attachmentCache[GParam::PanRand]->data());
165 m_oscillator.setGranularParameter(GParam::Detune, m_attachmentCache[GParam::Detune]->data());
166 m_oscillator.setGranularParameter(GParam::DetuneMod, m_attachmentCache[GParam::DetuneMod]->data());
167 m_oscillator.setGranularParameter(GParam::DetuneRand, m_attachmentCache[GParam::DetuneRand]->data());
168 m_oscillator.setGranularParameter(GParam::Level, m_attachmentCache[GParam::Level]->data());
169 m_oscillator.setGranularParameter(GParam::SamplerLevel, m_attachmentCache[GParam::SamplerLevel]->data());
170 m_oscillator.setGranularParameter(GParam::GranularLevel, m_attachmentCache[GParam::GranularLevel]->data());
171 m_oscillator.setGranularParameter(GParam::VehicleLevel, m_attachmentCache[GParam::VehicleLevel]->data());
172 m_oscillator.setGranularParameter(GParam::LevelMod, m_attachmentCache[GParam::LevelMod]->data());
173 m_oscillator.setGranularParameter(GParam::LevelRand, m_attachmentCache[GParam::LevelRand]->data());
174 m_oscillator.setGranularParameter(GParam::Quench, m_attachmentCache[GParam::Quench]->data());
175 m_oscillator.setGranularParameter(GParam::Robin, m_attachmentCache[GParam::Robin]->data());
176 m_oscillator.setGranularParameter(GParam::SALoop, m_attachmentCache[GParam::SALoop]->data());
177 m_oscillator.setGranularParameter(GParam::AutoRate, m_attachmentCache[GParam::AutoRate]->data());
178 m_oscillator.setGranularParameter(GParam::Shape, m_attachmentCache[GParam::Shape]->data());
179 m_oscillator.setGranularParameter(GParam::GrainLim, m_attachmentCache[GParam::GrainLim]->data());
180 m_oscillator.setGranularParameter(GParam::Tracking, m_attachmentCache[GParam::Tracking]->data());
181 m_oscillator.setGranularParameter(GParam::Cycles, m_attachmentCache[GParam::Cycles]->data());
182 m_oscillator.setGranularParameter(GParam::PhaseLock, m_attachmentCache[GParam::PhaseLock]->data());
183 m_oscillator.setGranularParameter(GParam::PhaseSync, m_attachmentCache[GParam::PhaseSync]->data());
184 m_oscillator.setGranularParameter(GParam::MuteUp, m_attachmentCache[GParam::MuteUp]->data());
185 m_oscillator.setGranularParameter(GParam::MuteDown, m_attachmentCache[GParam::MuteDown]->data());
186 m_oscillator.setGranularParameter(GParam::Normalise, m_attachmentCache[GParam::Normalise]->data());
187 m_oscillator.setGranularParameter(GParam::Smoothing, m_attachmentCache[GParam::Smoothing]->data());
188 m_oscillator.setGranularParameter(GParam::MovementSensitivity,
189 m_attachmentCache[GParam::MovementSensitivity]->data());
190 m_oscillator.setGranularParameter(GParam::SizeST, m_attachmentCache[GParam::SizeST]->data());
191 m_oscillator.setGranularParameter(GParam::DivST, m_attachmentCache[GParam::DivST]->data());
192 m_oscillator.setGranularParameter(GParam::SprayST, m_attachmentCache[GParam::SprayST]->data());
193 m_oscillator.setGranularParameter(GParam::MixST, m_attachmentCache[GParam::MixST]->data());
194 m_oscillator.setGranularParameter(GParam::SizeDY, m_attachmentCache[GParam::SizeDY]->data());
195 m_oscillator.setGranularParameter(GParam::DivDY, m_attachmentCache[GParam::DivDY]->data());
196 m_oscillator.setGranularParameter(GParam::SprayDY, m_attachmentCache[GParam::SprayDY]->data());
197 m_oscillator.setGranularParameter(GParam::MixDY, m_attachmentCache[GParam::MixDY]->data());
198 m_oscillator.setGranularParameter(GParam::Mute, m_attachmentCache[GParam::Mute]->data());
199 m_oscillator.setGranularParameter(GParam::Solo, m_attachmentCache[GParam::Solo]->data());
200 m_oscillator.setGranularParameter(GParam::Autoplay, m_attachmentCache[GParam::Autoplay]->data());
201
202 float velocity = m_oscillator.getVelocity();
203
204 // Get current Mute Param value
205 float muteValue = m_attachmentCache[GParam::Mute]->data()[0];
206
207 if (numChannels == 1) // mono
208 {
209 for (size_t sampleIndex = 0; sampleIndex < numSamples; sampleIndex++)
210 {
211 nextSample();
212 auto samp = m_oscillator.getNextStereoSample(sampleIndex) * velocity;
213 m_SAFilter.process((samp.left + samp.right) * 0.5f, 0);
214 bufferPtr[0][sampleIndex] = (samp.left + samp.right) * 0.5f;
215 }
216 }
217 else // stereo
218 {
219 processMuteStereo(muteValue, numSamples, velocity, bufferPtr);
220 }
221
222 // Update former mute value
223 m_formerMuteVal = muteValue;
224 }
225
226 void KwidgetProcessor_CoreEngine::processMuteStereo(float currentMuteValue, int numSamples, float velocity,
227 float** bufferPtr)
228 {
229 if (currentMuteValue > ParameterManager::OnOffThreshold) // mute activated
230 {
231 if (m_formerMuteVal <= ParameterManager::OnOffThreshold) // we just changed to mute
232 {
233 // do ramping down to 0
234 for (size_t sampleIndex = 0; sampleIndex < numSamples; sampleIndex++)
235 {
236 nextSample();
237 float ramp = sampleIndex / (numSamples - 1.0f);
238 float atten = 1.0f - ramp;
239 auto samp = (m_oscillator.getNextStereoSample(sampleIndex) * velocity) * atten;
240 // here filtering
241 auto leftFiltered = m_SAFilter.process(samp.left, 0);
242 bufferPtr[0][sampleIndex] = leftFiltered;
243 auto rightFiltered = m_SAFilter.process(samp.right, 1);
244 bufferPtr[1][sampleIndex] = rightFiltered;
245 }
246 }
247 else // we were in mute
248 {
249 // just zero
250 for (size_t sampleIndex = 0; sampleIndex < numSamples; sampleIndex++)
251 {
252 nextSample();
253 auto samp = m_oscillator.getNextStereoSample(sampleIndex) * velocity * 0.0f;
254 // here filtering
255 auto leftFiltered = m_SAFilter.process(samp.left, 0);
256 bufferPtr[0][sampleIndex] = leftFiltered;
257 auto rightFiltered = m_SAFilter.process(samp.right, 1);
258 bufferPtr[1][sampleIndex] = rightFiltered;
259 }
260 }
261 }
262 else // mute not activated
263 {
265 currentMuteValue <= ParameterManager::OnOffThreshold) // we just unmuted
266 {
267 for (size_t sampleIndex = 0; sampleIndex < numSamples; sampleIndex++)
268 {
269 nextSample();
270 float ramp = sampleIndex / (numSamples - 1.0f);
271 auto samp = (m_oscillator.getNextStereoSample(sampleIndex) * velocity) * ramp;
272 // here filtering
273 auto leftFiltered = m_SAFilter.process(samp.left, 0);
274 bufferPtr[0][sampleIndex] = leftFiltered;
275 auto rightFiltered = m_SAFilter.process(samp.right, 1);
276 bufferPtr[1][sampleIndex] = rightFiltered;
277 }
278 }
279 else // we were unmuted
280 {
281 for (size_t sampleIndex = 0; sampleIndex < numSamples; sampleIndex++)
282 {
283 nextSample();
284 auto samp = m_oscillator.getNextStereoSample(sampleIndex) * velocity;
285 // here filtering
286 auto leftFiltered = m_SAFilter.process(samp.left, 0);
287 bufferPtr[0][sampleIndex] = leftFiltered;
288 auto rightFiltered = m_SAFilter.process(samp.right, 1);
289 bufferPtr[1][sampleIndex] = rightFiltered;
290 }
291 }
292 }
293 }
294
295 void KwidgetProcessor_CoreEngine::noteOn(int midiNote, float velocity, int voiceIndex)
296 {
297 m_oscillator.setGranularParameter(GParam::Autoplay, m_attachmentCache[GParam::Autoplay]->data());
298 m_oscillator.startNote(midiNote, velocity, voiceIndex);
299 }
300
302
304
306
307} // namespace krotos
float process(float inputSample, int numChannel)
Definition AirAbsorptionFilter.cpp:24
void setDistance(float distance)
Definition AirAbsorptionFilter.cpp:33
void prepare(double sampleRate, int samplesPerBlock)
Definition AirAbsorptionFilter.cpp:12
void startNote(int midiNote, float velocity, int voiceIndex)
Starts the oscillator playing, usually called by key down event.
Definition GranularOscillator.cpp:84
GranularParam
Definition GranularOscillator.h:115
void clearNote()
Signals the oscillator to stop immediately, and return any grains to pool.
Definition GranularOscillator.cpp:106
const float getVelocity()
Returns the value of the velocity as a float in [0...1].
Definition GranularOscillator.cpp:104
void setGranularParameter(size_t paramIndex, const float *newValue)
Updates the granular engine and returns the next audio value.
Definition GranularOscillator.cpp:24
void setSampleRate(double sampleRate) override
Sets the sample rate which the granular oscillator uses to calculate its output.
Definition GranularOscillator.cpp:36
void setSampleData(SampleEngine *sampleEngine)
Sets the oscillator's internal reference to the SampleEngine structure it is to use.
Definition GranularOscillator.cpp:45
void stopNote()
Signals the oscillator to begin key up behaviour, usually called by key up event The oscillator may c...
Definition GranularOscillator.cpp:102
StereoSample getNextStereoSample(size_t sampleIndex) override
Updates the granular engine and returns the next audio value.
Definition GranularOscillator.cpp:264
Definition KrotosSynthesiserSound.h:19
SampleEngine * getSampleEngine() override
Definition KrotosSynthesiserSound.h:44
void Prepare(int midiNoteForNormalPitch, float dawSampleRate)
Definition KrotosSynthesiserSound.cpp:39
Definition Kwidget.h:8
AirAbsorptionFilter m_SAFilter
Definition KwidgetProcessor_CoreEngine.h:38
void process(AudioBuffer< float > &buffer) override
Definition KwidgetProcessor_CoreEngine.cpp:115
void noteCleared() override
Definition KwidgetProcessor_CoreEngine.cpp:303
KrotosSampleOscillatorSound & m_soSound
Definition KwidgetProcessor_CoreEngine.h:33
KwidgetProcessor_CoreEngine(Kwidget &owner, KrotosSampleOscillatorSound &sound)
Definition KwidgetProcessor_CoreEngine.cpp:5
void noteOn(int midiNote, float velocity, int) override
Definition KwidgetProcessor_CoreEngine.cpp:295
void setDistance(float distance)
Definition KwidgetProcessor_CoreEngine.cpp:305
void prepare(double sampleRate, int samplesPerBlock) override
Definition KwidgetProcessor_CoreEngine.cpp:108
GranularOscillator m_oscillator
Definition KwidgetProcessor_CoreEngine.h:34
float m_formerMuteVal
Definition KwidgetProcessor_CoreEngine.h:41
bool isActive() override
Definition KwidgetProcessor_CoreEngine.cpp:131
void noteOff(float) override
Definition KwidgetProcessor_CoreEngine.cpp:301
std::vector< std::shared_ptr< KAttachment > > m_attachmentCache
Definition KwidgetProcessor_CoreEngine.h:36
void processMuteStereo(float currentMuteValue, int numSamples, float velocity, float **bufferPtr)
Definition KwidgetProcessor_CoreEngine.cpp:226
void processBlockInternal(AudioBuffer< float > &buffer)
Definition KwidgetProcessor_CoreEngine.cpp:147
An interface for an audio processor designed for modular use.
Definition KwidgetProcessor.h:8
std::shared_ptr< KAttachment > getAttachment(const String &paramID)
Definition KwidgetProcessor.cpp:26
void nextBlock(int numSamples)
Definition KwidgetProcessor.cpp:50
void addParameterAttachments(std::vector< AttachmentInfo >)
Definition KwidgetProcessor.cpp:65
void nextSample()
Definition KwidgetProcessor.cpp:59
const String & getKwidgetID() const
Definition KwidgetProcessor.cpp:42
static const float OnOffThreshold
The threshold at which a toggle, or "on/off" parameter should change from on to off stage.
Definition ParameterManager.h:45
bool requestAccess(const StringRef id)
Called by a client to request access to the resource.
Definition ResourceLock.cpp:5
void finishedAccessing(const StringRef id)
Called by a client to inform the resource that it no longer needs access.
Definition ResourceLock.cpp:35
GranularPlaybackMode getGranularOscillatorTypeIndicator()
Definition SampleEngine.h:135
bool isPlaying()
returns true if any grains are active
Definition SampleEngine.cpp:17
Definition AirAbsorptionFilter.cpp:2
Kwidget_CoreEngine::Parameters Parameters
Definition KwidgetGUI_CoreEngine.cpp:42
static const String MIDIMode
Definition Kwidget_CoreEngine.h:71
static const String Mode
Definition Kwidget_CoreEngine.h:65
static const String PitchRand
Definition Kwidget_CoreEngine.h:36
static const String BMix
Definition Kwidget_CoreEngine.h:64
static const String BSpray
Definition Kwidget_CoreEngine.h:63
static const String PhaseSync
Definition Kwidget_CoreEngine.h:46
static const String Width
Definition Kwidget_CoreEngine.h:26
static const String PhaseLock
Definition Kwidget_CoreEngine.h:45
static const String SizeRand
Definition Kwidget_CoreEngine.h:34
static const String Distance
Definition Kwidget_CoreEngine.h:72
static const String Solo
Definition Kwidget_CoreEngine.h:70
static const String MuteUp
Definition Kwidget_CoreEngine.h:48
static const String SamplerLevel
Definition Kwidget_CoreEngine.h:29
static const String VehicleLevel
Definition Kwidget_CoreEngine.h:31
static const String Pan
Definition Kwidget_CoreEngine.h:27
static const String Robin
Definition Kwidget_CoreEngine.h:42
static const String Start
Definition Kwidget_CoreEngine.h:21
static const String Mute
Definition Kwidget_CoreEngine.h:69
static const String AMix
Definition Kwidget_CoreEngine.h:60
static const String LevelMod
Definition Kwidget_CoreEngine.h:32
static const String GrainMax
Definition Kwidget_CoreEngine.h:52
static const String Pitch
Definition Kwidget_CoreEngine.h:24
static const String PanRand
Definition Kwidget_CoreEngine.h:38
static const String Level
Definition Kwidget_CoreEngine.h:28
static const String Size
Definition Kwidget_CoreEngine.h:22
static const String Smoothing
Definition Kwidget_CoreEngine.h:55
static const String Rate
Definition Kwidget_CoreEngine.h:23
static const String LevelRand
Definition Kwidget_CoreEngine.h:39
static const String ARate
Definition Kwidget_CoreEngine.h:58
static const String WidthRand
Definition Kwidget_CoreEngine.h:37
static const String Tracking
Definition Kwidget_CoreEngine.h:53
static const String Normalise
Definition Kwidget_CoreEngine.h:47
static const String Autoplay
Definition Kwidget_CoreEngine.h:50
static const String StartRand
Definition Kwidget_CoreEngine.h:33
static const String BRate
Definition Kwidget_CoreEngine.h:62
static const String SALoop
Definition Kwidget_CoreEngine.h:43
static const String BSize
Definition Kwidget_CoreEngine.h:61
static const String RateRand
Definition Kwidget_CoreEngine.h:35
static const String PitchMod
Definition Kwidget_CoreEngine.h:25
static const String AutoRate
Definition Kwidget_CoreEngine.h:44
static const String GranularLevel
Definition Kwidget_CoreEngine.h:30
static const String Shape
Definition Kwidget_CoreEngine.h:51
static const String ASpray
Definition Kwidget_CoreEngine.h:59
static const String Sensitivity
Definition Kwidget_CoreEngine.h:56
static const String Quench
Definition Kwidget_CoreEngine.h:40
static const String Cycles
Definition Kwidget_CoreEngine.h:54
static const String MuteDown
Definition Kwidget_CoreEngine.h:49
static const String ASize
Definition Kwidget_CoreEngine.h:57