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」のバイナリダンプを次に示します。

