私は日記とか、そういう類のものが長続きした試しがありません。Twitterも驚きのツイート1回のみ。Facebookも、私の誕生日に「お友達」からのメッセージとそれに対するお礼。このほか、一緒に飲んだり、講演、他諸々したときの写真にタグ付けされ、それがタイムラインに載る程度。そんな私は、ブログを綴っているとは。自分でも驚いています。
さて、音源データ作成の続きです。細かい説明は後にしてまずは、そのサンプルコードを紹介します。
int WriteOutSound(int nAmplitude, int nFrequency, int nDuration)
{
double dA;
double dDeltaFT;
int nSamples;
int nCycles;
int nGap;
dA = ((nAmplitude * 2 ^ 15) / 1000) -1;
if (nFrequency == 0)
{
// 周波数ゼロの場合
dA = 0;
dDeltaFT = Math.PI * 2 * (double)0 / (double)SamplingRate;
}
else
{
dDeltaFT = Math.PI * 2 * (double)nFrequency / (double)SamplingRate;
}
nSamples = (SamplingRate * nDuration / 100) / 10;
// 正弦波2PIの終わりで止めるための計算
if (dDeltaFT != 0)
{
nCycles = (int)((dDeltaFT * (double)nSamples) / (Math.PI * 2.0));
nGap = nSamples % nCycles;
}
else
{
nGap = 0;
}
for (int T = 0; T < nSamples – nGap; T++)
{
short Sample;
Sample = (short)(dA * Math.Sin(dDeltaFT * T));
bwWave.Write((short)Sample);
bwWave.Write((short)Sample);
}
return nSamples;
}
このサンプルコードに出てくるbwWaveとは、BinaryWriteのオブジェクトです。私はもともとC++/アセンブラでコードを書いていた人間なのですが、最近ではすっかりC#ばかり。便利ですね。
MemoryStream msWave = new MemoryStream();
BinaryWriter bwWave = new BinaryWriter(msWave);
あとは、サンプルコードにもあるように、bwWave.Write()でメモリーストリームのデータを着だすことが出来ます。ヘッダーのような構造化されたものは、以下のようなコードでバイト列に変換することが出来ます。バイト列に変換さえ出来てしまえば、後は簡単ですね。
byte[] StructureToByteArray(object obj)
{
int nLen;
byte[] rgbArray;
IntPtr ptrMem;
nLen = Marshal.SizeOf(obj);
rgbArray = new byte[nLen];
ptrMem = Marshal.AllocHGlobal(nLen);
Marshal.StructureToPtr(obj, ptrMem, true);
Marshal.Copy(ptrMem, rgbArray, 0, nLen);
Marshal.FreeHGlobal(ptrMem);
return rgbArray;
}
次回は、全てをクラスにまとめたサンプルコードをアップロードしたいと思います。