Как получить массив байт текущего звука c#

Целый день пытаюсь понять как получить текущий звук в виде массива. Честно говоря я сам плохо понимаю как вообще можно получить звук в виде массива. Однако. Есть следующий метод:

public double[] FFT(double[] data)
    {
        double[] fft = new double[data.Length];
        System.Numerics.Complex[] fftComplex = new System.Numerics.Complex[data.Length];
        for (int i = 0; i < data.Length; i++)
            fftComplex[i] = new System.Numerics.Complex(data[i], 0.0);
        Accord.Math.FourierTransform.FFT(fftComplex, Accord.Math.FourierTransform.Direction.Forward);
        for (int i = 0; i < data.Length; i++)
            fft[i] = fftComplex[i].Magnitude;
        return fft;
    }

который на вход принимает массив дробных чисел, как видно, и делает быстрое преобразование Фурье. Есть проект, где этот код работает с микрофоном, используя NAudio:

WaveIn wi = new WaveIn();
        wi.DeviceNumber = audioDeviceNumber;
        wi.WaveFormat = new NAudio.Wave.WaveFormat(RATE, 1);
        wi.BufferMilliseconds = (int)((double)BUFFERSIZE / (double)RATE * 1000.0);
        wi.DataAvailable += new EventHandler<WaveInEventArgs>(AudioDataAvailable);
        bwp = new BufferedWaveProvider(wi.WaveFormat);
        bwp.BufferLength = BUFFERSIZE * 2;
        bwp.DiscardOnBufferOverflow = true;
            wi.StartRecording();

/////////////

int frameSize = BUFFERSIZE;
        var audioBytes = new byte[frameSize];
        bwp.Read(audioBytes, 0, frameSize);

        if (audioBytes.Length == 0)
            return;
        if (audioBytes[frameSize - 2] == 0)
            return;

        int BYTES_PER_POINT = 2;

        int graphPointCount = audioBytes.Length / BYTES_PER_POINT;

        double[] pcm = new double[graphPointCount];
        double[] fft = new double[graphPointCount];
        double[] fftReal = new double[graphPointCount/2];
        
        for (int i = 0; i < graphPointCount; i++)
        {
            Int16 val = BitConverter.ToInt16(audioBytes, i * 2);

            pcm[i] = (double)(val) / Math.Pow(2,16) * 200.0;
        }

        fft = FFT(pcm);

        double pcmPointSpacingMs = RATE / 1000;
        double fftMaxFreq = RATE / 2;
        double fftPointSpacingHz = fftMaxFreq / graphPointCount;

        Array.Copy(fft, fftReal, fftReal.Length);
        
        scottPlotUC1.Clear();
        scottPlotUC1.PlotSignal(pcm, pcmPointSpacingMs, Color.Blue);
        scottPlotUC2.Clear();
        scottPlotUC2.PlotSignal(fftReal, fftPointSpacingHz, Color.Blue);

        if (needsAutoScaling)
        {
            scottPlotUC1.AxisAuto();
            scottPlotUC2.AxisAuto();
            needsAutoScaling = false;
        }

Но я не могу понять как сделать тоже самое, но так, чтобы звук получался из, скажем, Master Volume(не обязательно оттуда, просто, чтобы получить звуки из "Внутренностей компьютера").


Ответы (0 шт):