35 if (cor[ZE] < cor[P1])
38 maxSteps = int(
float(previousGrain) * tolerance) - previousGrain;
43 maxSteps = previousGrain - int(
float(previousGrain) / tolerance);
51 int grain = previousGrain;
53 while ((!((cor[ZE] > cor[M2]) && (cor[ZE] > cor[M1]) && (cor[ZE] > cor[P1]) && (cor[ZE] > cor[P2]))) &&
54 (grain < range.
max) && (grain > range.
min))
78 if ((grain >= range.
max) || (grain <= range.
min) || (maxSteps == 0))
86 void findPeaks(std::vector<float>& graphArray, std::vector<Point<float>>& markerArray,
int maxPeaks)
88 int graphSize =
static_cast<int>(graphArray.size());
89 int startAnalisys = 2;
90 int endAnalisys = graphSize - 2;
94 for (
int i = startAnalisys; i < endAnalisys; ++i)
96 if ((graphArray[i - 1] < graphArray[i] && graphArray[i] > graphArray[i + 1]) &&
97 (graphArray[i - 2] < graphArray[i] && graphArray[i] > graphArray[i + 2]))
99 markerArray.push_back(Point<float>{(float)i / (
float)graphSize, graphArray[i]});
101 if (markerArray.size() >= maxPeaks)
108 int graphSize =
static_cast<int>(graphArray.size());
109 int startAnalisys = 3;
110 int endAnalisys = graphSize - 3;
112 if ((position <= startAnalisys) || (position >= endAnalisys))
118 if (graphArray[position] < graphArray[position + 1])
124 while ((!((graphArray[i - 1] < graphArray[i] && graphArray[i] > graphArray[i + 1]) &&
125 (graphArray[i - 2] < graphArray[i] && graphArray[i] > graphArray[i + 2]))) &&
126 (i < endAnalisys) && (i > startAnalisys))
128 i = int(
int(i) + increment);
131 if ((i >= endAnalisys) || (i <= startAnalisys))
139 void sortMarkersByX(std::vector<juce::Point<float>>& markerArray,
bool decending =
false)
142 int n =
static_cast<int>(markerArray.size());
144 for (i = n / 2; i > 0; i = i / 2)
146 for (j = i; j < n; j++)
148 for (k = j - i; k >= 0; k = k - i)
153 if (markerArray[k + i].getX() < markerArray[k].getX())
158 if (markerArray[k + i].getX() > markerArray[k].getX())
163 Point<float> temp = markerArray[k];
164 markerArray[k] = markerArray[k + i];
165 markerArray[k + i] = temp;
172 void sortMarkersByY(std::vector<Point<float>>& markerArray,
bool decending =
false)
175 int n =
static_cast<int>(markerArray.size());
177 for (i = n / 2; i > 0; i = i / 2)
179 for (j = i; j < n; j++)
181 for (k = j - i; k >= 0; k = k - i)
186 if (markerArray[k + i].getY() < markerArray[k].getY())
191 if (markerArray[k + i].getY() > markerArray[k].getY())
196 Point<float> temp = markerArray[k];
197 markerArray[k] = markerArray[k + i];
198 markerArray[k + i] = temp;
206 const int useableIndexEnd,
const int startGrainSize)
208 int phaseZeroPosition = audioIndexStart;
209 int previousGrainSize = startGrainSize;
213 if (newGrainSize < 0)
217 returnGrains.push_back(newGrainSize);
218 phaseZeroPosition += newGrainSize;
219 previousGrainSize = newGrainSize;
220 }
while (phaseZeroPosition < useableIndexEnd);
225 const int audioIndexStart,
const int useableIndexEnd,
226 const int startGrainSize)
228 int phaseZeroPosition = audioIndexStart;
229 int previousGrainSize = startGrainSize;
233 if (newGrainSize < 0)
237 phaseZeroPosition -= newGrainSize;
238 if (phaseZeroPosition < useableIndexEnd)
242 returnGrains.push_back(newGrainSize);
243 previousGrainSize = newGrainSize;
244 }
while (phaseZeroPosition > useableIndexEnd);
249 const std::vector<int>& grainsList,
const int startGrainAudioIndex,
250 bool goingBackwards =
false)
252 int audioIndex = startGrainAudioIndex;
253 bool newSubPath =
true;
255 for (
int i = 0; i < grainsList.size(); i++)
257 int newGrainSize = grainsList[i];
258 float frequency = this->
getSampleRate() / (float)newGrainSize;
262 audioIndex -= newGrainSize;
265 descriptors.push_back(
AudioDescriptor{frequency, 0, audioIndex, (float)newGrainSize, 0,
true,
false});
271 audioIndex += newGrainSize;
300 FloatVectorOperations::disableDenormalisedNumberSupport();
312 std::vector<AudioDescriptor> grainDescriptionByFrequency;
313 std::vector<AudioDescriptor> grainDescriptionByTime;
318 int useableIndexEnd = int(
float(this->
size()) *
m_endPos);
322 std::vector<int> grainListFwds;
323 std::vector<int> grainListBack;
328 int bestLengthFwds{0};
329 int bestLengthBack{0};
331 int bestLength =
static_cast<int>(1000000000000);
332 int bestAudioIndex{-1};
333 int bestGrainSize{0};
335 int startGrainAudioIndex =
337 static_cast<float>(this->
size()));
342 int engineHz = engineRPM / 60.f;
344 int startGrainSize =
static_cast<int>(this->
getSampleRate() / engineHz);
347 useableIndexStart =
static_cast<int>(
static_cast<float>(this->
size()) *
m_startPos);
348 useableIndexEnd =
static_cast<int>(
static_cast<float>(this->
size()) *
m_endPos);
349 grainListFwds.clear();
350 grainListBack.clear();
355 if (grainListFwds.size() > 0)
356 grainListFwds.pop_back();
357 if (grainListBack.size() > 0)
358 grainListBack.pop_back();
360 std::vector<AudioDescriptor> descriptorsFree;
362 buildDescriptors(descriptorsFree, grainListBack, startGrainAudioIndex,
true);
364 if (!descriptorsFree.size())
368 std::sort(descriptorsFree.begin(), descriptorsFree.end(),
373 for (std::vector<AudioDescriptor>::iterator it = descriptorsFree.begin(); it != descriptorsFree.end(); ++it)
375 it->grainIndexByTime = timeIndex++;
378 const int numCycles = 1;
379 std::vector<AudioDescriptor> descriptorsTime;
383 descriptorsTime = descriptorsFree;
387 int cycleCounter = 0;
388 float grainSizeAccumulator = 0;
389 for (std::vector<AudioDescriptor>::iterator it = descriptorsFree.begin(); it != descriptorsFree.end(); ++it)
391 grainSizeAccumulator += it->grainSize;
392 if (++cycleCounter == numCycles)
396 newDesc.
grainSize = grainSizeAccumulator;
398 descriptorsTime.push_back(newDesc);
399 grainSizeAccumulator = 0.f;
406 std::sort(descriptorsTime.begin(), descriptorsTime.end(),
410 int frequencyIndex = 0;
411 for (std::vector<AudioDescriptor>::iterator it = descriptorsTime.begin(); it != descriptorsTime.end(); ++it)
413 it->grainIndexByFrequency = frequencyIndex++;
416 grainDescriptionByFrequency = descriptorsTime;
419 std::sort(descriptorsTime.begin(), descriptorsTime.end(),
422 grainDescriptionByTime = descriptorsTime;
424 if ((grainDescriptionByFrequency.size() > 0) && (grainDescriptionByTime.size() > 0))
Definition KrotosAudioBufferDSP.h:113
int max
Definition KrotosAudioBufferDSP.h:159
void setToLimits()
Definition KrotosAudioBufferDSP.h:144
int min
Definition KrotosAudioBufferDSP.h:158
void setLimits(GrainRange limits)
Definition KrotosAudioBufferDSP.h:138
void setAnalysisGrainSizeRange()
Set the frequency range we want to analyse for.
Definition KrotosAudioBufferDSPPhaseDetection.cpp:276
AnalysisCoefficientsPhase m_phaseAnalysisCoefficients
Definition KrotosAudioBufferDSP.h:586
void buildDescriptors(std::vector< AudioDescriptor > &descriptors, const std::vector< int > &grainsList, const int startGrainAudioIndex, bool goingBackwards)
Definition KrotosAudioBufferDSPPhaseDetection.cpp:248
float m_trackingValue
Definition KrotosAudioBufferDSP.h:564
float m_endPos
Definition KrotosAudioBufferDSP.h:584
volatile std::atomic< bool > m_trackingDataIsValid
Definition KrotosAudioBufferDSP.h:568
bool scanBackwardsForGrainsFreeMarker(std::vector< int > &returnGrains, const int audioIndexStart, const int useableIndexEnd, const int startGrainSize)
Definition KrotosAudioBufferDSPPhaseDetection.cpp:224
float m_startPos
Definition KrotosAudioBufferDSP.h:583
int calcFreeGrain(int centerIndex, int previousGrainSize, GrainRange range)
calcFreeGrain - find the next grain size
Definition KrotosAudioBufferDSPPhaseDetection.cpp:13
void invalidate()
Definition KrotosAudioBufferDSP.h:414
int size()
Definition KrotosAudioBufferDSP.h:394
std::vector< AudioDescriptor > m_grainDescriptionByFrequency
Definition KrotosAudioBufferDSP.h:572
std::vector< AudioDescriptor > m_grainDescriptionByTime
Definition KrotosAudioBufferDSP.h:575
void setPhaseAnalysisCoefficients(AnalysisCoefficientsPhase coeff)
Definition KrotosAudioBufferDSP.h:392
GrainRange m_analysisGrainSizeRange
Definition KrotosAudioBufferDSP.h:567
bool scanForGrainsFreeMarker(std::vector< int > &returnGrains, const int audioIndexStart, const int useableIndexEnd, const int startGrainSize)
Definition KrotosAudioBufferDSPPhaseDetection.cpp:205
float m_trackingCycles
Definition KrotosAudioBufferDSP.h:565
void analysePhase()
Definition KrotosAudioBufferDSPPhaseDetection.cpp:298
float autoCorrelateCentred(int centerIndex, int testSize)
autoCorrelateCentred - Autocorrelate both sides of supplied index
Definition KrotosAudioBufferDSPCorrelation.cpp:52
void setDefaultPhaseAnalysisCoefficients()
Definition KrotosAudioBufferDSPPhaseDetection.cpp:286
float getSampleRate(void)
Definition KrotosAudioBuffer.cpp:506
Definition AirAbsorptionFilter.cpp:2
void findPeaks(std::vector< float > &graphArray, std::vector< Point< float > > &markerArray, int maxPeaks)
Definition KrotosAudioBufferDSPPhaseDetection.cpp:86
void sortMarkersByY(std::vector< Point< float > > &markerArray, bool decending=false)
Definition KrotosAudioBufferDSPPhaseDetection.cpp:172
void sortMarkersByX(std::vector< juce::Point< float > > &markerArray, bool decending=false)
Definition KrotosAudioBufferDSPPhaseDetection.cpp:139
int centralise(std::vector< float > &graphArray, int position)
Definition KrotosAudioBufferDSPPhaseDetection.cpp:106
AnalysisCoefficientsPhase - A class containing attributes used during phase analysis of audio.
Definition KrotosAudioBufferDSP.h:29
float cycles
Definition KrotosAudioBufferDSP.h:31
float cal5
Definition KrotosAudioBufferDSP.h:35
float cal0
Definition KrotosAudioBufferDSP.h:32
float cal4
Definition KrotosAudioBufferDSP.h:34
float tracking
Definition KrotosAudioBufferDSP.h:30
float cal3
Definition KrotosAudioBufferDSP.h:33
A class to contains any attributes we want to store for the described audio.
Definition KrotosAudioBufferDSP.h:177
int grainIndexByTime
Definition KrotosAudioBufferDSP.h:182
float frequency
Definition KrotosAudioBufferDSP.h:178
float grainSize
Definition KrotosAudioBufferDSP.h:181