波形を合成してみよう
空っぽのサウンドバッファを作り、そこにWaveデータを自分で書きこむ事で、Waveファイルに無い波形データを再生する方法について、ご説明します。
それでは、いつも通りアプリケーションを新規作成してください。
そして、DDSDコンポーネントをフォームに貼りつけます。
まず、TDDSDWaveDataオブジェクトを、wavとして宣言します。
type
TForm1 = class(TForm)
DDSD1: TDDSD;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private 宣言 }
public
{ Public 宣言 }
wav:TDDSDWaveData;
end;
次に、このwavオブジェクトの中身を作っていきます。ここではFormのOnCreateイベントにでも書くこととしましょう。
procedure TForm1.FormCreate(Sender: TObject);
var
Buffer:Array[0..22049] of Byte; //Waveデータを計算するためのバッファ
i:Integer;
begin
//WaveDataの作成
wav:=TDDSDWaveData.CreateBuffer(DDSD1, 22050, 8, False, 22050);
//矩形波で埋める(値の範囲は0〜255だけど、うるさいので128くらいにしておきます)
For i:=0 to 22049 do
Buffer[i]:=((i div 50) And 1) * 128;
//バッファからWaveDataオブジェクトにコピー
wav.BlockCopy(0, @Buffer, 22050);
//チャンネルに乗せる
DDSD1[0].WaveData:=wav;
end;
まず、太字の一行目で、TDDSDWaveDataオブジェクトとしてwavを生成します。
ここで、Createメソッドではなく、CreateBufferメソッドを呼んでいる事に注意してください。
CreateBufferメソッドは、空のバッファを作るためのコンストラクタで、引数は順に
という事になっています。この場合、サンプリング周波数 22050Hz , 8bit , モノラルのデータで、22050バイト(1秒分)のバッファを作っています。
次に、Bufferというローカル変数で示される配列に、矩形波をガシガシ書き込んで、BlockCopyメソッドでwavオブジェクトの中にBufferで示される配列に書きこまれた波形データを転送します。
BlockCopyメソッドの引数は順に
と、なっています。この場合は、Wavオブジェクトの持っているバッファの中を全部書き換えている事になります。
最後にDDSDコンポーネントのチャンネルにWavオブジェクトを乗っけて、今作った波形データをDDSDコンポーネントから再生できるようにします。
ではフォームにボタンを貼って、クリックすると再生することにしましょう。
procedure TForm1.Button1Click(Sender: TObject); begin DDSD1[0].Play; end;
再生は一行だけ。
さて、ちゃんと鳴りましたか? 「ポー」という音がなったらOKです。