public void AddSample(float sample)
        {
            SampleProcessed++;

            if (Samples.Count < FFTLength)
            {
                Enqueue(sample);
            }
            else
            {
                Enqueue(sample);

                CurrentGap++;

                if (CurrentGap < SampleGap && SampleProcessed != SampleCount)
                {
                    return;
                }

                CurrentGap = 0;

                if (Samples.Count == FFTLength)
                {
                    Complex[] fft = new Complex[FFTLength];

                    int i = 0;

                    foreach (var s in Samples)
                    {
                        fft[i].X = (float)(s * FastFourierTransform.HammingWindow(i, FFTLength));
                        fft[i].Y = 0;
                        i++;
                    }

                    FastFourierTransform.FFT(true, m, fft);


                    SampleAnalysis[] result = new SampleAnalysis[FFTLength];


                    for (int n = 0; n < fft.Length; n++)
                    {
                        result[n].Frequency = Physics.GetFrequency(n, AudioReader.WaveFormat.SampleRate, FFTLength);
                        result[n].Amplitude = Physics.GetAmplitude(fft[n]);
                    }

                    Processed?.Invoke(result);
                }
            }
        }
        private void OnSample(object sender, SampleEventArgs e)
        {
            FFTBuffer[FFTPosition].X = (float)(e.Right * FastFourierTransform.HammingWindow(FFTPosition, FFTLength)); // e.Right ? seems equal to e.Left in this case (mono?)
            FFTBuffer[FFTPosition].Y = 0;
            FFTPosition++;
            if (FFTPosition >= FFTBuffer.Length)
            {
                FastFourierTransform.FFT(true, (int)Math.Log(FFTLength, 2.0), FFTBuffer);
                FFTPosition = 0;

                SampleAnalysis[] result = new SampleAnalysis[FFTLength];

                for (int n = 0; n < FFTBuffer.Length; n++)
                {
                    result[n].Frequency = Physics.GetFrequency(n, AudioReader.WaveFormat.SampleRate, FFTLength);
                    result[n].Amplitude = Physics.GetAmplitude(FFTBuffer[n]);
                }

                Processed?.Invoke(result);
            }
        }