Visual Studio Express 2013を使用し、C#言語によりWaveファイル形式でWaveデータを作成します。
作成するWaveファイルの仕様を次に示します。
フォーマットID:リニアPCM チャンネル数:ステレオ サンプリングレート:44.1kHz データ転送速度:176400byte/sec バイト/サンプル:16bitステレオ 量子化ビット数:16
今回作成した周波数10Hzで100msのWaveファイルを、「C#によるWaveファイルのデータを用いた波形表示」で作成したchartで表示させると、次のようになります。
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」のバイナリダンプを次に示します。