先週プロジェクト用に C# で作成した既存の Matlab 8 バンド イコライザー GUI を再実装しようとしています。Matlab では、曲は動的配列としてメモリに読み込まれ、そこで自由に操作でき、再生はサウンド (配列) と同じくらい簡単です。
Mp3 エクストラクタ、プレーヤー、および畳み込みと FFT の両方が便利に既に定義されている NAudio ライブラリを見つけました。Mp3 を開いて、そのすべてのデータを配列に読み込むことができました (ただし、正しく行っているかどうかはわかりません)。配列を取得し、適切に再生できるようにストリームに書き戻します (ファイルに書き込む必要はありません)。
見つけた例に従って、mp3 を次のように読みました。
private byte[] CreateInputStream(string fileName)
{
byte[] stream;
if (fileName.EndsWith(".mp3"))
{
WaveStream mp3Reader = new Mp3FileReader(fileName);
songFormat = mp3Reader.WaveFormat; // songFormat is a class field
long sizeOfStream = mp3Reader.Length;
stream = new byte[sizeOfStream];
mp3Reader.Read(stream, 0, (int) sizeOfStream);
}
else
{
throw new InvalidOperationException("Unsupported Exception");
}
return stream;
}
これで、生のオーディオ データが含まれていると思われるバイト配列ができました。これを最終的に float に変換して、DSP モジュールを通過させる予定です。ただし、現時点では、バイト配列を再生できるかどうかを確認しようとしています。
Stream outstream = new MemoryStream(stream);
WaveFileWriter wfr = new WaveFileWriter(outstream, songFormat);
// outputStream is an array of bytes and a class variable
wfr.Write(outputStream, 0, (int)outputStream.Length);
WaveFileReader wr = new WaveFileReader(outstream);
volumeStream = new WaveChannel32(wr);
waveOutDevice.Init(volumeStream);
waveOutDevice.Play();
現在、WaveFileReader(outstream) でスローされたエラーが発生しています。これは、ストリームの末尾を超えて読み取ることができないというものです。私が正しく行っていないのはそれだけではないと思います。洞察はありますか?