public FilterSampleProvider(uint filterHalfLength) { InputSampleProvider = new DCSampleProvider(); CornerFrequency = 440d; filterCoefficients = new float[filterHalfLength]; inputBuffer = new float[0]; inputCircleBuffer = new CircleBuffer(2 * filterHalfLength); // Generate filter coefficients //int center = filterLength / 2; for (int i = 0; i < filterCoefficients.Length; i++) { //filterCoefficients[i] = (float)Math.Pow(0.5d, i + 1d); // Some BS // Approximate all-pass filter //filterCoefficients[i] = i == (filterCoefficients.Length - 1) ? 0.5f : 0f; // TODO Fix this half-remembered nonsense /*double phase = (i - center) / (double)SampleRate; * double x = 2 * Math.PI * phase * cornerFrequency; * filterCoefficients[i] = x != 0d ? (float)(Math.Sin(x) / x) : 1f;*/ double phase = (i - (filterCoefficients.Length - 0.5d)) / 44100d; double x = 2 * Math.PI * phase * cornerFrequency; filterCoefficients[i] = 0.5f * (x != 0d ? (float)(Math.Sin(x) / x) : 0f); // TODO Apply (real) window function filterCoefficients[i] *= Math.Min(1f, i * 10f / filterCoefficients.Length); } }
public EchoSampleProvider() { inputBuffer = new float[0]; echoCircleBuffer = new CircleBuffer((uint)SampleRate); InputSampleProvider = new DCSampleProvider(); Delay = 0.5f; Amplitude = 0.5f; }
public ModulatedSineWaveProvider() { waveTable = new float[SampleRate]; for (int i = 0; i < SampleRate; i++) { waveTable[i] = (float)Math.Sin(2 * Math.PI * i / SampleRate); //waveTable[i] = 2f * ((float)i / sampleRate) - 1f; // Sawtooth } modulationBuffer = new float[0]; Frequency = 440d; ModulationSampleProvider = new DCSampleProvider(); SaveResetData(); }