Как получить массив байт текущего звука 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(не обязательно оттуда, просто, чтобы получить звуки из "Внутренностей компьютера").