1

先週プロジェクト用に 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) でスローされたエラーが発生しています。これは、ストリームの末尾を超えて読み取ることができないというものです。私が正しく行っていないのはそれだけではないと思います。洞察はありますか?

4

1 に答える 1