C#によるWaveデータの作成

Visual Studio Express 2013を使用し、C#言語によりWaveファイル形式でWaveデータを作成します。
作成するWaveファイルの仕様を次に示します。

フォーマットID:リニアPCM
チャンネル数:ステレオ
サンプリングレート:44.1kHz
データ転送速度:176400byte/sec
バイト/サンプル:16bitステレオ
量子化ビット数:16

今回作成した周波数10Hzで100msのWaveファイルを、「C#によるWaveファイルのデータを用いた波形表示」で作成したchartで表示させると、次のようになります。

周波数10Hzで100msのWaveファイルの表示

C#によるWaveデータの作成

C#で作成したWaveデータの作成メソッド「createWave」を次に示します。

private void createWave()
{
    string FileName = Environment.GetFolderPath(Environment.SpecialFolder.DesktopDirectory) + @"\test.wav";

    using (FileStream filStream = new FileStream(FileName, FileMode.Create, FileAccess.Write))
    using (BinaryWriter binWriter = new BinaryWriter(filStream))
    {
        createHeader.FormatChunkSize = 16;
        createHeader.FormatID = 1;
        createHeader.Channel = 2;
        createHeader.SampleRate = 44100;
        createHeader.BitPerSample = 16;

        int NumberOfBytePerSample = ((ushort)(Math.Ceiling((double)createHeader.BitPerSample / 8)));
        createHeader.BlockSize = (short)(NumberOfBytePerSample * createHeader.Channel);
        createHeader.BytePerSec = createHeader.SampleRate * createHeader.Channel * NumberOfBytePerSample;
        int DataLength = (createHeader.SampleRate * msec) / 1000;
        createHeader.DataChunkSize = createHeader.BlockSize * DataLength;
        createHeader.FileSize = createHeader.DataChunkSize + 44;

        binWriter.Write(headerBytes());

        for (UInt32 cnt = 0; cnt < DataLength; cnt++)
        {
            double Radian = (double)cnt / createHeader.SampleRate;
            Radian *= 2 * Math.PI;

            // 10Hzの正弦波を作る。
            Wave = Math.Sin(Radian * 10);

            short Data = (short)(Wave * 30000);

            binWriter.Write(BitConverter.GetBytes(Data));
            binWriter.Write(BitConverter.GetBytes(Data));
        }
    }
}
  • 変数「msec」に作成時間(単位:ms)を設定すると、Wave情報の作成時間が設定できます。今回は「100」を設定しました。
  • 17行目で変数「msec」に基づき、Waveファイルに保存されるWaveデータのサイズを計算します。
  • 21行目でWaveファイルのヘッダ作成メソッド「headerBytes」を呼び出します。
  • 29行目で、「10」を設定すると、10Hzの正弦波になります。

Waveファイルのヘッダ作成メソッド「headerBytes」は、Waveファイルのヘッダ部分を作成します。Waveファイルのヘッダの仕様については、「C#によるWaveファイルの解析」を参照してください。

private byte[] headerBytes()
{
    byte[] Datas = new byte[44];

    Array.Copy(Encoding.ASCII.GetBytes("RIFF"), 0, Datas, 0, 4);
    Array.Copy(BitConverter.GetBytes((UInt32)(createHeader.FileSize - 8)), 0, Datas, 4, 4);
    Array.Copy(Encoding.ASCII.GetBytes("WAVE"), 0, Datas, 8, 4);
    Array.Copy(Encoding.ASCII.GetBytes("fmt "), 0, Datas, 12, 4);
    Array.Copy(BitConverter.GetBytes((UInt32)(createHeader.FormatChunkSize)), 0, Datas, 16, 4);
    Array.Copy(BitConverter.GetBytes((UInt16)(createHeader.FormatID)), 0, Datas, 20, 2);
    Array.Copy(BitConverter.GetBytes((UInt16)(createHeader.Channel)), 0, Datas, 22, 2);
    Array.Copy(BitConverter.GetBytes((UInt32)(createHeader.SampleRate)), 0, Datas, 24, 4);
    Array.Copy(BitConverter.GetBytes((UInt32)(createHeader.BytePerSec)), 0, Datas, 28, 4);
    Array.Copy(BitConverter.GetBytes((UInt16)(createHeader.BlockSize)), 0, Datas, 32, 2);
    Array.Copy(BitConverter.GetBytes((UInt16)(createHeader.BitPerSample)), 0, Datas, 34, 2);
    Array.Copy(Encoding.ASCII.GetBytes("data"), 0, Datas, 36, 4);
    Array.Copy(BitConverter.GetBytes((UInt32)(createHeader.DataChunkSize)), 0, Datas, 40, 4);

    return (Datas);
}

Waveデータの作成ソフトの実行

プログラムを実行すると、デスクトップ上にWaveファイル「test.wav」が作成されます。作成したWaveファイル「test.wav」のバイナリダンプを次に示します。

作成したWaveファイルのバイナリダンプ