音源(正弦波)の生成

私は日記とか、そういう類のものが長続きした試しがありません。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;

}

次回は、全てをクラスにまとめたサンプルコードをアップロードしたいと思います。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です