127 if (std::isnan(sample.
left))
132 if (std::isnan(sample.
right))
137#ifdef USE_BRICK_WALL_CLIPPING
138 const float clippingVal = 3.0f;
139 if (sample.
left > clippingVal)
141 sample.
left = clippingVal;
143 if (sample.
right > clippingVal)
145 sample.
right = clippingVal;
161 float rand =
m_rand.nextFloat() - 0.5f;
186 Range<double> sprayRange(startPosition -
static_cast<double>(halfSpray),
187 startPosition +
static_cast<double>(halfSpray));
188 Range<double> constraintRange(0.f, 1.f);
189 Range<double> useableRange = constraintRange.constrainRange(sprayRange);
192 return (useableRange.getStart() +
m_rand.nextDouble() * useableRange.getLength()) *
199 const float minimumGrainLength{0.1f};
201 bool shouldLaunchNewGrain =
false;
206 shouldLaunchNewGrain =
true;
211 shouldLaunchNewGrain =
true;
214 if (shouldLaunchNewGrain)
228 static_cast<int>(playHead) -
251 newGrain->
length = grainLength;
255 newGrain->flavour = flavour;
273 jassert(sampleIndex >= 0 && sampleIndex <
m_length);
333 float smoothingCoeff = jmap<float>(smoothing, 0.f, 1.f, 0.001f, 0.000001f);
338 float movement = jmin<float>(
354 if (muteUp && muteDown)
358 else if (muteUp && !muteDown)
362 else if (!muteUp && !muteDown)
372 float freq = jmap<float>(
m_startIndex, 0.f, 1.f, 12.f, 60.f);
423 while (grainIndex >= 0)
434 float grainProgress =
440 if (grainProgress > 0.5f)
441 grainProgress = 1.0f - grainProgress;
442 grainProgress *= 2.0f;
445 grainProgress /= shape;
446 grainProgress = jmin(grainProgress, 1.0f);
447 float shapeEnvelope = 1.0f -
cube(fabsf(1.0f - grainProgress));
450 playingGrain->
envelope = shapeEnvelope;
454 float widthInv = 1.0f - width;
455 float mono = widthInv * 0.5f * (sample.
left + sample.
right);
456 float left = sample.
left * width + mono;
457 float right = sample.
right * width + mono;
460 float gain = playingGrain->
gainRand * shapeEnvelope;
464 result.
left = gain * left * powf(pan * 0.8f, 0.5f);
465 result.
right = gain * right * powf(0.8f - pan * 0.8f, 0.5f);
469 sampleAccumulatorMoving += result;
474 sampleAccumulatorSustained += result;
475 playingGrain->
mix = playingGrain->
gainRand * (1.0f - mix);
494 StereoSample output = (sampleAccumulatorMoving * mix + sampleAccumulatorSustained * (1.f - mix)) * gain;
497 output = output * smoothedDirectionGating;
512 float playbackHzDetunedMod;
516 playbackHzDetunedMod =
538 Grain* newGrain =
nullptr;
542 bool shouldLaunchNewGrain =
false;
547 shouldLaunchNewGrain =
true;
552 shouldLaunchNewGrain =
true;
555 if (shouldLaunchNewGrain)
574 float rand =
m_rand.nextFloat() - 0.5f;
628 int startPositionInSamples =
634 Range<int> sprayRange(
int(startPositionInSamples - halfSpray),
int(startPositionInSamples + halfSpray));
640 Range<int> useableRange = constraintRange.constrainRange(sprayRange);
641 newGrain->
playHead = (useableRange.getStart() +
m_rand.nextFloat() * useableRange.getLength());
647 float gainNormalisationFactor =
651 float resampleRatio =
static_cast<float>(segmentSampleRate) /
662 int grainLength = int(density * userAdjustedGrainSize);
665 if (grainLength > selectionLength)
666 grainLength = selectionLength;
669 newGrain->
length = grainLength;
672 1.f / float(grainLength);
682 newGrain->
gainRand = gain * gain * gainNormalisationFactor;
700 return sampleAccumulator;
712 float playbackHzDetunedMod;
719 playbackHzDetunedMod =
747 Grain* newGrain =
nullptr;
754 if (shouldLaunchNewGrain)
773 float rand =
m_rand.nextFloat() - 0.5f;
833 float gainNormalisationFactor =
839 newGrain->
gainRand = gain * gain * gainNormalisationFactor;
852 return sampleAccumulator;
868 playingGrain->
ramp = 0.f;
881 while (grainIndex >= 0)
885 float randomisedPan = 0.5f * (1.f + jlimit<float>(-1.f, 1.f, pan + playingGrain->
panRand));
896 if (playingGrain->
ramp < 0.f)
898 playingGrain->
ramp = 0.f;
904 if (playingGrain->
ramp > 1.f)
906 playingGrain->
ramp = 1.f;
911 if (playingGrain->
ramp != 1.f)
913 rampVal = (cosf((1.f - playingGrain->
ramp) * MathConstants<float>::pi) + 1.f) * 0.5f;
920 playingGrain->
ramp = 0.f;
925 sampleAccumulator += newSample.
panSine(randomisedPan) * masterGain * playingGrain->
gainRand * rampVal;
945 float playheadIncrement = increment * playingGrain->
pitchRand;
946 playingGrain->
playHead += playheadIncrement;
949 playingGrain->
gainMod = gainMod;
964 int minGrainsBeforeRampUp = 0;
967 minGrainsBeforeRampUp = 1;
977 while (grainIndex >= 0)
981 float randomisedPan = 0.5f * (1.f + jlimit<float>(-1.f, 1.f, pan + playingGrain->
panRand));
990 playingGrain->
envelope = sinf(jmap<float>(playingGrain->
grainWindow, 0.f, fadePoint, 0.f, 1.f) *
991 MathConstants<float>::halfPi);
993 else if (playingGrain->
grainWindow >= 1.f - fadePoint)
995 playingGrain->
envelope = sinf(jmap<float>(playingGrain->
grainWindow, 1.f - fadePoint, 1.f, 1.f, 0.f) *
996 MathConstants<float>::halfPi);
1006 sampleAccumulator += newSample.
panSine(randomisedPan).
width(width * playingGrain->
widthRand) * masterGain *
1018 float playheadIncrement = increment * playingGrain->
pitchRand;
1019 playingGrain->
playHead += playheadIncrement;
1022 playingGrain->
gainMod = gainMod;
Definition OscillatorUtils.h:39
float resampleRatio
Definition OscillatorUtils.h:67
int length
Definition OscillatorUtils.h:61
float gainRand
Definition OscillatorUtils.h:69
float panRand
Definition OscillatorUtils.h:70
double playHead
Definition OscillatorUtils.h:65
float envelope
Definition OscillatorUtils.h:63
float windowDelta
Definition OscillatorUtils.h:74
float gainMod
Definition OscillatorUtils.h:76
int segmentIndex
Definition OscillatorUtils.h:66
float widthRand
Definition OscillatorUtils.h:71
float pitchMod
Definition OscillatorUtils.h:77
float pitchRand
Definition OscillatorUtils.h:68
float ramp
Definition OscillatorUtils.h:72
float grainSize
Definition OscillatorUtils.h:60
int voiceIndex
Definition OscillatorUtils.h:75
Flavour
Definition OscillatorUtils.h:49
@ foreground
Definition OscillatorUtils.h:52
@ vehicleStatic
Definition OscillatorUtils.h:51
@ vehicleMoving
Definition OscillatorUtils.h:50
@ background
Definition OscillatorUtils.h:53
int playHeadStart
Definition OscillatorUtils.h:58
float mix
Definition OscillatorUtils.h:57
float grainWindow
Definition OscillatorUtils.h:62
const float FADE_POINT_MIN
Definition GranularOscillator.h:239
float m_playbackHzDetuned
Definition GranularOscillator.h:205
volatile float m_directionGating
Definition GranularOscillator.h:222
float m_startIndexSearched
Definition GranularOscillator.h:211
bool m_loopingEnable
Definition GranularOscillator.h:230
void setTaggingType(bool isOn)
Definition GranularOscillator.cpp:116
StereoSample getNextStereoSampler()
Definition GranularOscillator.cpp:703
const float FLUX_SCALING_NEGATIVE
Definition GranularOscillator.h:247
const float AMPLITUDE_FIDDLE_FACTOR
Definition GranularOscillator.h:238
float m_grainRate
Definition GranularOscillator.h:209
float m_startIndex
Definition GranularOscillator.h:210
GranularPlaybackMode m_granularOscillatorType
Definition GranularOscillator.h:202
void startNote(int midiNote, float velocity, int voiceIndex)
Starts the oscillator playing, usually called by key down event.
Definition GranularOscillator.cpp:84
int m_voiceIndex
Definition GranularOscillator.h:220
std::vector< const float * > m_parameters
Definition GranularOscillator.h:216
float m_rampInc
Definition GranularOscillator.h:255
@ DetuneMod
Definition GranularOscillator.h:128
@ Start
Definition GranularOscillator.h:117
@ Smoothing
Definition GranularOscillator.h:151
@ SizeDY
Definition GranularOscillator.h:158
@ Quench
Definition GranularOscillator.h:136
@ DetuneRand
Definition GranularOscillator.h:129
@ SizeST
Definition GranularOscillator.h:154
@ Detune
Definition GranularOscillator.h:127
@ Autoplay
Definition GranularOscillator.h:140
@ DivDY
Definition GranularOscillator.h:159
@ RateRand
Definition GranularOscillator.h:122
@ PhaseSync
Definition GranularOscillator.h:147
@ VehicleLevel
Definition GranularOscillator.h:133
@ Size
Definition GranularOscillator.h:119
@ SizeRand
Definition GranularOscillator.h:120
@ NUM_PARAMS
Definition GranularOscillator.h:164
@ GrainLim
Definition GranularOscillator.h:142
@ MovementSensitivity
Definition GranularOscillator.h:152
@ SprayDY
Definition GranularOscillator.h:160
@ Robin
Definition GranularOscillator.h:137
@ SALoop
Definition GranularOscillator.h:138
@ PanRand
Definition GranularOscillator.h:126
@ SprayST
Definition GranularOscillator.h:156
@ DivST
Definition GranularOscillator.h:155
@ MixDY
Definition GranularOscillator.h:161
@ LevelMod
Definition GranularOscillator.h:134
@ MuteUp
Definition GranularOscillator.h:149
@ Width
Definition GranularOscillator.h:123
@ MixST
Definition GranularOscillator.h:157
@ Shape
Definition GranularOscillator.h:141
@ Pan
Definition GranularOscillator.h:125
@ StartRand
Definition GranularOscillator.h:118
@ GranularLevel
Definition GranularOscillator.h:132
@ MuteDown
Definition GranularOscillator.h:150
@ Rate
Definition GranularOscillator.h:121
@ WidthRand
Definition GranularOscillator.h:124
@ Normalise
Definition GranularOscillator.h:148
@ SamplerLevel
Definition GranularOscillator.h:131
@ Level
Definition GranularOscillator.h:130
@ LevelRand
Definition GranularOscillator.h:135
bool m_autoplayEnabled
Definition GranularOscillator.h:241
void setGrainData(Grain *playingGrain)
Definition GranularOscillator.cpp:855
bool m_taggingType
Definition GranularOscillator.h:228
std::vector< Grain * > m_activeGrains
Definition GranularOscillator.h:214
void clearNote()
Signals the oscillator to stop immediately, and return any grains to pool.
Definition GranularOscillator.cpp:106
SlewLimiter m_channelCrossfade
Definition GranularOscillator.h:223
double m_samplerate
Definition GranularOscillator.h:207
float m_crossfadeValue
Definition GranularOscillator.h:226
const float RAMP_LENGTH_SECONDS
Definition GranularOscillator.h:250
const float FLUX_SCALING_POSITIVE
Definition GranularOscillator.h:246
bool m_isDrone
Definition GranularOscillator.h:240
size_t m_sampleIndex
Definition GranularOscillator.h:232
void setLoopEnableFlag()
Definition GranularOscillator.cpp:120
const float getVelocity()
Returns the value of the velocity as a float in [0...1].
Definition GranularOscillator.cpp:104
SampleEngine * m_sampleEngine
Definition GranularOscillator.h:213
void setTrackingEnable(bool isOn)
Definition GranularOscillator.cpp:118
float m_playbackHz
Definition GranularOscillator.h:204
bool m_trackingEnable
Definition GranularOscillator.h:229
StereoSample getNextStereoGranularSamplePhaseLocked()
Definition GranularOscillator.cpp:306
StereoSample getNextStereoGranular()
Definition GranularOscillator.cpp:503
bool m_stopped
Definition GranularOscillator.h:217
void generateGrainsGranular(StereoSample &sampleAccumulator)
Definition GranularOscillator.cpp:955
void setGranularOscillatorType(GranularPlaybackMode newType)
Definition GranularOscillator.cpp:18
int m_length
Definition GranularOscillator.h:215
void setFrequency(float frequency) override
Sets the target frequency which you want the oscillator to output.
Definition GranularOscillator.cpp:76
float m_detuneModVal
Definition GranularOscillator.h:237
float m_rampSamples
Definition GranularOscillator.h:253
void setGranularParameter(size_t paramIndex, const float *newValue)
Updates the granular engine and returns the next audio value.
Definition GranularOscillator.cpp:24
void generateNewFluxFactor()
Definition GranularOscillator.cpp:159
float m_velocity
Definition GranularOscillator.h:233
void generateGrainsSampler(StereoSample &sampleAccumulator)
Definition GranularOscillator.cpp:871
GranularOscillator()
Definition GranularOscillator.cpp:16
bool m_allowAudiosegmentIncrement
Definition GranularOscillator.h:234
float cube(float val)
Definition GranularOscillator.cpp:82
bool m_keyDown
Definition GranularOscillator.h:218
const float FLUX_PARAM_SKEW
Definition GranularOscillator.h:245
void setSampleRate(double sampleRate) override
Sets the sample rate which the granular oscillator uses to calculate its output.
Definition GranularOscillator.cpp:36
Grain * launchGrain(float paramSize, float paramStart, float paramSpray, Grain::Flavour flavour, float gain=-1.f)
Definition GranularOscillator.cpp:196
AudioDescriptor m_closestDescriptor
Definition GranularOscillator.h:212
float m_fluxFactor
Definition GranularOscillator.h:208
void killNANs(StereoSample &sample)
Definition GranularOscillator.cpp:125
double calculatePlayheadPosition(double startPosition, float halfSpray, float referenceGrainsize)
Definition GranularOscillator.cpp:174
const float PARAMETER_TRUE_THRESHOLD
Definition GranularOscillator.h:242
double getSampleRate() override
Returns the sample rate which which you set with the setSampleRate method.
Definition GranularOscillator.cpp:1030
void flushGranular()
Definition GranularOscillator.cpp:52
SlewLimiter m_directionGatingSmoother
Definition GranularOscillator.h:224
PhaseGenerator m_grainTimer
Definition GranularOscillator.h:203
void setSampleData(SampleEngine *sampleEngine)
Sets the oscillator's internal reference to the SampleEngine structure it is to use.
Definition GranularOscillator.cpp:45
juce::Random m_rand
Definition GranularOscillator.h:201
void stopNote()
Signals the oscillator to begin key up behaviour, usually called by key up event The oscillator may c...
Definition GranularOscillator.cpp:102
float getFrequency() override
Gets the target frequency which you set with the setFrequency method.
Definition GranularOscillator.cpp:1028
void setGranularParameters(std::vector< const float * > &newParams)
Sets multiple internal parameter to new values.
Definition GranularOscillator.cpp:30
int getNumActiveGrains() override
Returns the number of grains currently active for this instance of the oscillator.
Definition GranularOscillator.cpp:1032
StereoSample getNextStereoSample(size_t sampleIndex) override
Updates the granular engine and returns the next audio value.
Definition GranularOscillator.cpp:264
bool analysisResultsAreValid()
Definition KrotosAudioBufferDSP.h:422
AudioDescriptor & audioIndexToDescriptor(int audioIndex)
Definition KrotosAudioBufferDSP.cpp:895
AudioDescriptor & audioFrequencyToDescriptor(float frequency)
Definition KrotosAudioBufferDSP.cpp:919
StereoSample getSampleFromGrainPhase(double grainPhase)
Definition KrotosAudioBufferDSP.cpp:949
std::vector< AudioDescriptor > & getGrainDescriptionByTime()
Definition KrotosAudioBufferDSP.h:452
AudioDescriptor & audioPercentToDescriptor(float audioPercent)
Definition KrotosAudioBufferDSP.cpp:974
float getSampleRate(void)
Definition KrotosAudioBuffer.cpp:506
StereoSample getInterpolatedSample(double index)
Get a stereo sample from the audio buffer.
Definition KrotosAudioBuffer.cpp:318
float getNativeNoteFrequency(void)
Definition KrotosAudioBuffer.cpp:512
void setLoopSize2(int val)
Definition OscillatorUtils.cpp:76
void synchronise(double &grainPhase)
Definition OscillatorUtils.h:98
void setSampleRate(float val)
Definition OscillatorUtils.cpp:105
bool hasLooped2()
Definition OscillatorUtils.cpp:103
bool hasLooped()
Definition OscillatorUtils.cpp:101
void triggerNewGrain()
Definition OscillatorUtils.cpp:92
void setFrequency(float val)
Definition OscillatorUtils.cpp:78
bool hasWrapped()
Definition OscillatorUtils.cpp:99
void nextPhase()
Definition OscillatorUtils.cpp:24
void setLoopSize(int val)
Definition OscillatorUtils.cpp:74
Definition SampleEngine.h:84
int getAudioSegmentLengthInSamples(int segmentIndex)
Returns the length of an audio segment.
Definition SampleEngine.cpp:269
void setGrainLimit(int newLimit)
Definition SampleEngine.cpp:64
float getAudioSegmentNormalisationFactor(int segmentIndex)
Definition SampleEngine.h:259
int getAudioSelectionStartPosition(int segmentIndex)
Returns the start of the selected section of an audio segment.
Definition SampleEngine.cpp:243
void freeGrain(Grain *grain)
Definition SampleEngine.cpp:66
Grain * allocateGrain()
Definition SampleEngine.cpp:31
void prepareNextSegmentIndex(bool sequential=true)
Calculate the next segment to be played back.
Definition SampleEngine.cpp:319
int getAudioSelectionLengthInSamples(int segmentIndex)
Returns the length of the selected section of an audio segment.
Definition SampleEngine.cpp:249
const int getNextSegmentIndex() const
Returns the index of the next segment to be played.
Definition SampleEngine.cpp:413
GranularPlaybackMode getGranularOscillatorTypeIndicator()
Definition SampleEngine.h:135
void setIndicator1(float newVal)
Definition SampleEngine.cpp:85
void setIndicatorRPM(float newVal)
Definition SampleEngine.cpp:91
int getAudioSegmentSampleRate(int segmentIndex)
Definition SampleEngine.h:246
void setIndicator2(float newVal)
Definition SampleEngine.cpp:88
float processSample(float sample)
Definition OscillatorUtils.cpp:196
void setMaxSlewRate(float val)
Definition OscillatorUtils.cpp:238
Definition KrotosAudioBuffer.h:16
float left
Definition KrotosAudioBuffer.h:107
float right
Definition KrotosAudioBuffer.h:107
StereoSample width(float width)
Definition KrotosAudioBuffer.h:98
StereoSample panSine(float pan)
Definition KrotosAudioBuffer.h:90
Definition AirAbsorptionFilter.cpp:2
static const int MIDI_NOTE_MASK
Definition OscillatorUtils.h:21
GranularPlaybackMode
Definition SampleEngine.h:46
static const int MIDI_NOTE_FLAG_DRONE
Definition OscillatorUtils.h:22
static const int SEMITONES_PER_OCTAVE
Definition OscillatorUtils.h:36
A class to contains any attributes we want to store for the described audio.
Definition KrotosAudioBufferDSP.h:177
int grainIndexByTime
Definition KrotosAudioBufferDSP.h:182
int audioIndex
Definition KrotosAudioBufferDSP.h:180
float frequency
Definition KrotosAudioBufferDSP.h:178
float grainSize
Definition KrotosAudioBufferDSP.h:181