Skip to content

Commit 9379e01

Browse files
committed
Correcting frequency selection, and making low cutoff properly scale with volume
1 parent 42a438a commit 9379e01

File tree

2 files changed

+10
-7
lines changed

2 files changed

+10
-7
lines changed

ColorChord.NET/NoteFinder/Gen2NoteFinder.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -203,11 +203,13 @@ public override void UpdateOutputs()
203203
this.AllBinMaxSmoothed = this.AllBinMax < NewAllBinMax ? (this.AllBinMax * 0.8F) + (NewAllBinMax * 0.2F) : (this.AllBinMax * 0.995F) + (NewAllBinMax * 0.005F);
204204
this.AllBinMax = Math.Max(0.01F, AllBinMaxSmoothed);
205205

206+
Vector256<float> CutoffVal = Vector256.Create(this.AllBinMaxSmoothed * 0.02F);
206207
for (int Step = 0; Step < AllBinValuesScaled.Length; Step += 8)
207208
{
208209
Vector256<float> MiddleValues = Vector256.LoadUnsafe(ref RawBinValuesPadded[Step + 1]);
209210
Vector256<float> Scaled = Avx.Divide(MiddleValues, Vector256.Create(this.AllBinMaxSmoothed * 2.2F));
210-
Scaled.StoreUnsafe(ref AllBinValuesScaled[Step]);
211+
Vector256<float> WithCutoff = Avx.Max(Vector256<float>.Zero, Avx.Subtract(Scaled, CutoffVal));
212+
WithCutoff.StoreUnsafe(ref AllBinValuesScaled[Step]);
211213
}
212214

213215
for (int Outer = 0; Outer < PeakBitsPacked.Length; Outer++)

ColorChord.NET/NoteFinder/Gen2NoteFinderDFT.cs

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -175,15 +175,16 @@ public sealed class Gen2NoteFinderDFT
175175
RawBinWidths = new float[BinCount];
176176

177177
uint MaxAudioBufferSize = 0;
178-
for (uint Bin = 0; Bin < BinCount; Bin++)
178+
for (int Bin = 0; Bin < BinCount; Bin++)
179179
{
180180
float BinFrequency;
181181
uint ThisBufferSize;
182182
float ThisOctaveStart = StartFrequency * MathF.Pow(2, Bin / BinsPerOctave);
183183
BinFrequency = CalculateNoteFrequency(StartFrequency, BinsPerOctave, Bin);
184-
float NextBinFrequency = CalculateNoteFrequency(StartFrequency, BinsPerOctave, Bin + 2);
184+
float NextBinFrequencyUp = CalculateNoteFrequency(StartFrequency, BinsPerOctave, Bin + 1);
185+
float NextBinFrequencyDown = CalculateNoteFrequency(StartFrequency, BinsPerOctave, Bin - 1);
185186
//float IdealWindowSize = WindowSizeForBinWidth(TopOctaveNextBinFreq - TopOctaveBinFreq); // TODO: Add scale factor to shift this from no overlap to -3dB point
186-
ThisBufferSize = RoundedWindowSizeForBinWidth(NextBinFrequency - BinFrequency, BinFrequency, SampleRate);
187+
ThisBufferSize = RoundedWindowSizeForBinWidth(NextBinFrequencyUp - NextBinFrequencyDown, BinFrequency, SampleRate);
187188

188189
RawBinWidths[Bin] = MathF.Log2((BinFrequency + BinWidthAtWindowSize(ThisBufferSize, SampleRate)) / BinFrequency) * BinsPerOctave;
189190

@@ -627,7 +628,7 @@ public void CalculateOutput()
627628
{
628629
float OutBinVal = this.RawBinMagnitudes[Bin] * this.LoudnessCorrectionFactors[Bin];
629630
this.OctaveBinValues[Bin % BinsPerOctave] += OutBinVal / this.OctaveCount;
630-
this.AllBinValues[Bin + 1] = MathF.Max(0, OutBinVal - 0.08F);
631+
this.AllBinValues[Bin + 1] = MathF.Max(0, OutBinVal);
631632
}
632633
}
633634

@@ -735,8 +736,8 @@ private static uint RoundedWindowSizeForBinWidth(float binWidth, float frequency
735736
return (uint)Math.Min(ABSOLUTE_MAX_WINDOW_SIZE, MathF.Round((MathF.Max(MinWindowSizePeriods, MathF.Min(MaxWindowSizePeriods, MathF.Round(PeriodsInWindow))) * PeriodInSamples) + (PeriodInSamples * 0.5F)));
736737
}
737738

738-
private static float CalculateNoteFrequency(float octaveStart, uint binsPerOctave, uint binIndex) => octaveStart * GetNoteFrequencyMultiplier(binsPerOctave, binIndex);
739-
private static float GetNoteFrequencyMultiplier(uint binsPerOctave, uint binIndex) => MathF.Pow(2F, (float)binIndex / binsPerOctave);
739+
private static float CalculateNoteFrequency(float octaveStart, uint binsPerOctave, int binIndex) => octaveStart * GetNoteFrequencyMultiplier(binsPerOctave, binIndex);
740+
private static float GetNoteFrequencyMultiplier(uint binsPerOctave, int binIndex) => MathF.Pow(2F, (float)binIndex / binsPerOctave);
740741

741742
/// <summary> Gets a factor to multiply the output amplitude by to correct for percieved loudness. </summary>
742743
/// <remarks> Output is based on ISO 226:2023 data, and assumes a fixed loudness, and that the item being multiplied is sqrt(dB level). </remarks>

0 commit comments

Comments
 (0)