5 jassert(sampleRate > 0.0f);
13 jassert(attackTimeMs > 0 && releaseTimeMs > 0);
24 jassert(attackTimeMs > 0);
30 jassert(releaseTimeMs > 0);
36 int numSamples =
static_cast<int>(inputMonoVector.size());
37 std::vector<float> envelope(numSamples, 0.0f);
39 for (
int i = 1; i < numSamples; i++)
41 float inputSample = fabsf(inputMonoVector.at(i));
44 if (inputSample > fabsf(inputMonoVector.at(i - 1)))
46 envelope.at(i) = envelope.at(i - 1) * (1.0f -
m_gAtt) + (
m_gAtt * inputSample);
50 envelope.at(i) = envelope.at(i - 1) * (1.0f -
m_gRel) + (
m_gRel * inputSample);
59 float min = *min_element(envelope.begin(), envelope.end());
60 float max = *max_element(envelope.begin(), envelope.end());
63 for (
int i = 0; i < envelope.size(); i++)
65 envelope.at(i) = (jmap(envelope.at(i), min, max, 0.0f, 1.0f));
69 jassert(*max_element(envelope.begin(), envelope.end()) <= 1.0f);
70 jassert(*min_element(envelope.begin(), envelope.end()) >= 0.0f);
78 int numSamples =
static_cast<int>(envelopeArray.size());
80 jassert(numSamples > 4);
86 std::vector<float> slopeArray(numRegFrames, 0.0f);
93 std::vector<float> timeLocal(4);
95 for (
int i = 0; i < numRegFrames; i++)
98 iota(timeLocal.begin(), timeLocal.end(),
static_cast<float>(i + 1));
104 std::vector<float>::const_iterator envFirst = envelopeArray.begin() + i;
105 std::vector<float>::const_iterator envLast = envelopeArray.begin() + i + 4;
106 std::vector<float> envLocal(envFirst, envLast);
114 numer += (timeLocal.at(n - 1) - tMean) * (envLocal.at(n - 1) - envMean);
115 denom += powf(timeLocal.at(n - 1) - tMean, 2.0f) + 1e-10f;
116 jassert(denom != 0.0f);
120 slopeArray.at(i) = (numer / denom);
147 std::vector<float> normalisedEnvelopeVector)
156 float maxSlope = *max_element(slopeVector.begin(), slopeVector.end());
160 int finishPosition = 0;
161 int startPosition = 0;
162 std::vector<int> attackPositions;
164 while (finishPosition < slopeVector.size())
166 startPosition = finishPosition + 1;
169 std::vector<float>::const_iterator slopeFirst = slopeVector.begin() + startPosition;
170 std::vector<float>::const_iterator slopeLast = slopeVector.end();
171 std::vector<float> slopeLocal(slopeFirst, slopeLast);
174 std::vector<float>::const_iterator envNormFirst = normalisedEnvelopeVector.begin() + startPosition;
175 std::vector<float>::const_iterator envNormLast = normalisedEnvelopeVector.end();
176 std::vector<float> envNormLocal(envNormFirst, envNormLast);
179 std::pair<int, int> attackFinishPair =
detectAttackSegment(slopeLocal, envNormLocal, thresholdValue);
186 attackPositions.push_back(attackFinishPair.first + finishPosition);
188 finishPosition += attackFinishPair.second;
191 return attackPositions;
195 const std::vector<float>& normalisedEnvelopeFrame,
196 float thresholdValue)
198 std::pair<int, int> attackFinishPair;
202 find_if(slopeFrame.begin(), slopeFrame.end(), [=](
float x) { return (fabsf(x) >= thresholdValue); });
203 auto firstAttackPosition =
static_cast<int>((distance(slopeFrame.begin(), iter)));
205 attackFinishPair.first = firstAttackPosition;
208 if (firstAttackPosition == slopeFrame.size())
211 return attackFinishPair;
216 int localMaxPosition = -1;
217 for (
int i = firstAttackPosition +
m_onset + 2; i < slopeFrame.size(); i++)
222 localMaxPosition = i - 1;
228 if (localMaxPosition == -1)
231 return attackFinishPair;
239 int numRestFrames =
static_cast<int>(
240 floorf(
static_cast<float>(normalisedEnvelopeFrame.size() - localMaxPosition) /
m_decayLength));
246 while (n < (numRestFrames - 1) && rest ==
false)
251 std::vector<float>::const_iterator envSegmentFirst = normalisedEnvelopeFrame.begin() + start;
252 std::vector<float>::const_iterator envSegmentLast = normalisedEnvelopeFrame.begin() + finish;
253 std::vector<float> decayRegionEnv(envSegmentFirst, envSegmentLast);
256 transform(decayRegionEnv.begin(), decayRegionEnv.end(), decayRegionEnv.begin(),
257 [](
float x) ->
float { return x * x; });
258 float movAvgPow = (accumulate(decayRegionEnv.begin(), decayRegionEnv.end(), 0.0f)) /
m_decayLength;
262 if (movAvgPow < 0.01f * normalisedEnvelopeFrame.at(localMaxPosition))
270 attackFinishPair.second = finish;
272 return attackFinishPair;
void setupEnvFol(float attackTimeMs, float releaseTimeMs)
Definition SlopEnvelopeOnsetdetection.cpp:11
std::vector< float > filterVector(std::vector< float > inputMonoVector)
Definition SlopEnvelopeOnsetdetection.cpp:34
std::vector< float > normaliseEnvelope(std::vector< float > inputMonoVector)
Definition SlopEnvelopeOnsetdetection.cpp:57
float m_sampleRate
Definition SlopEnvelopeOnsetdetection.h:52
float m_attackTimeSec
Definition SlopEnvelopeOnsetdetection.h:50
void setReleaseMs(float releaseTimeMs)
Definition SlopEnvelopeOnsetdetection.cpp:28
void setAttackMs(float attackTimeMs)
Definition SlopEnvelopeOnsetdetection.cpp:22
float m_releaseTimeSec
Definition SlopEnvelopeOnsetdetection.h:51
float m_gAtt
Definition SlopEnvelopeOnsetdetection.h:55
EnvelopeFollowerSPD(float sampleRate)
Definition SlopEnvelopeOnsetdetection.cpp:3
float m_gRel
Definition SlopEnvelopeOnsetdetection.h:56
std::vector< int > calculateOnsetsGlobal(std::vector< float > slopeVector, std::vector< float > normalisedEnvelopeVector)
Definition SlopEnvelopeOnsetdetection.cpp:146
int m_onset
Definition SlopEnvelopeOnsetdetection.h:139
float m_sampleRate
Definition SlopEnvelopeOnsetdetection.h:145
float m_epsilon
Definition SlopEnvelopeOnsetdetection.h:143
bool m_finishFlag
Definition SlopEnvelopeOnsetdetection.h:147
float m_threshold
Definition SlopEnvelopeOnsetdetection.h:137
std::pair< int, int > detectAttackSegment(const std::vector< float > &slopeFrame, const std::vector< float > &normalisedEnvelopeFrame, float thresholdValue)
Definition SlopEnvelopeOnsetdetection.cpp:194
void setDecayLengthMiliSeconds(float decayLengthMiliSeconds)
Definition SlopEnvelopeOnsetdetection.cpp:140
int m_decayLength
Definition SlopEnvelopeOnsetdetection.h:141
void setOnsetMiliSeconds(float onsetMiliSeconds)
Definition SlopEnvelopeOnsetdetection.cpp:134
void setThresholdPercentage(float thresholdPercentage)
Definition SlopEnvelopeOnsetdetection.cpp:132
OnsetDetector(float sampleRate)
Definition SlopEnvelopeOnsetdetection.cpp:130
int m_numRegressionPoints
Definition SlopEnvelopeOnsetdetection.h:92
std::vector< float > createSlopeVectorFromEnvelope(std::vector< float > envelopeVector)
Definition SlopEnvelopeOnsetdetection.cpp:76
Definition AirAbsorptionFilter.cpp:2