35 size numSamples = pcm.
size();
41 if (numSamples <
static_cast<size
>(
mMaxPeriod * 2)) {
114 const float normFactor = 1.0f / 32768.0f;
120 int validSamples = 0;
122 for (size i = 0; i + lag < numSamples; i++) {
123 float s1 =
static_cast<float>(pcm[i]) * normFactor;
124 float s2 =
static_cast<float>(pcm[i + lag]) * normFactor;
130 if (validSamples > 0) {
131 mAutocorrelation[
static_cast<size
>(lag)] = sum /
static_cast<float>(validSamples);
155 float maxValue = -1.0f;
158 for (
int lag =
mMinPeriod; lag <= mMaxPeriod && lag < static_cast<int>(autocorr.
size()); lag++) {
159 float value = autocorr[
static_cast<size
>(lag)];
176 if (peakLag <= 0 || peakLag >=
static_cast<int>(autocorr.
size())) {
180 float peakValue = autocorr[
static_cast<size
>(peakLag)];
188 int windowSize =
fl::max(2, peakLag / 10);
189 float neighborSum = 0.0f;
190 int neighborCount = 0;
193 if (
offset == 0)
continue;
195 int lag = peakLag +
offset;
197 neighborSum +=
fl::max(0.0f, autocorr[
static_cast<size
>(lag)]);
202 if (neighborCount > 0) {
203 float neighborAvg = neighborSum /
static_cast<float>(neighborCount);
207 if (neighborAvg > 1e-6f) {
208 float clarity =
fl::min(1.0f, (peakValue - neighborAvg) / neighborAvg);
209 confidence *= (0.7f + 0.3f * clarity);
224 if (frequency <= 0.0f) {
function_list< void(float hz)> onPitch
function_list< void(float hz)> onPitchChange
~Pitch() FL_NOEXCEPT override
vector< float > mAutocorrelation
float calculateConfidence(const vector< float > &autocorr, int peakLag) const
float periodToFrequency(int period) const
bool shouldReportPitchChange(float newPitch) const
float calculateAutocorrelation(const i16 *pcm, size numSamples)
void fireCallbacks() override
void update(shared_ptr< Context > context) override
void updatePitchSmoothing(float newPitch)
function_list< void(float hz, float confidence)> onPitchWithConfidence
int findBestPeakLag(const vector< float > &autocorr) const
int frequencyToPeriod(float frequency) const
float mPitchChangeSensitivity
function_list< void(u8 voiced)> onVoiced
OneEuroFilter< float > mPitchSmoother
float mConfidenceThreshold
const T * data() const FL_NOEXCEPT
constexpr fl::size size() const FL_NOEXCEPT
fl::size size() const FL_NOEXCEPT
fl::UISlider offset("Offset", 0.0f, 0.0f, 1.0f, 0.01f)
float computeAudioDt(fl::size pcmSize, int sampleRate) FL_NOEXCEPT
Compute the time delta (in seconds) for an audio buffer.
FL_DISABLE_WARNING_PUSH U constexpr common_type_t< T, U > min(T a, U b) FL_NOEXCEPT
constexpr int type_rank< T >::value
constexpr common_type_t< T, U > max(T a, U b) FL_NOEXCEPT
constexpr enable_if< is_fixed_point< T >::value, T >::type abs(T x) FL_NOEXCEPT
Base definition for an LED controller.