DDSDチュートリアル(1)

効果音を鳴らしてみよう

 

 ここではDDSDを使ってアプリケーションの中から効果音を鳴らす方法について、ご説明します。

DDSDを使うための下準備


 Delphiを起動し、「アプリケーションの新規作成」を選んでください。アプリケーションの名前は、DDSDTUTとでもしておきましょう。

 ではまず、DDSDコンポーネントをフォームに貼り付けてください。

 そうしたらUSES節に、DSoundを加えてください。DirectSound用の定数の宣言などがこのユニットの中で行われているので、DDSDコンポーネントをフォームに貼り付けただけではまだ完全に使えるようになったとは言えないのです(^^;)

uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, DSound, DDSD;

DDSDコンポーネントは、同じアプリケーションに対し、二つ以上貼り付けないでください。

 

音データの読み込みと再生

 さて、面倒な事は言わず、一気にWAVEファイルの再生までご説明します。…といっても非常に簡単です。

 とりあえず、起動とともにWAVEファイルを読み込み、ボタンを押すと音が鳴るような仕掛けにしておきましょう。

 フォームにボタンを一個付けてください。

 まず、Form1のpublic宣言の所にでも、Waveファイルの中の波形データをDDSDで扱えるようにするためのDDSDWaveDataオブジェクトを宣言します。

type
TForm1 = class(TForm)
  DDSD1: TDDSD;
  Button2: TButton;
  procedure Button2Click(Sender: TObject);
  procedure FormCreate(Sender: TObject);
  procedure FormDestroy(Sender: TObject);
  private
  { Private 宣言 }
  public
  { Public 宣言 }
    Wave1:TDDSDWavedata;
end;

 次に、OnCreateイベントで、さっき書いたTDDSDオブジェクトにWAVEファイルを読み込む処理を書きます。

procedure TForm1.FormCreate(Sender: TObject);
begin
  Wave1:=TDDSDWaveData.Create(DDSD1,'bomb.wav');
  DDSD1.Channels[0].WaveData:=Wave1;
end;

 DDSD1というのはフォームに貼り付けたDDSDコンポーネントの名前です。

 太字になっている部分で上の一行がWAVEデータの読み込み、下の一行でDDSDコンポーネントのチャンネルに対して、読み込んだWaveデータを割り当てています。こうする事で、チャンネル0番で、Bomb.wavというWaveファイルを鳴らす事が出来るようになるわけです。

 各自で適当なWaveファイルを用意し、そのWaveファイル名を指定してください

 次に、Button1.OnClickイベントに、読み込んだWaveを鳴らす処理を書きます。

procedure TForm1.Button1Click(Sender: TObject);
begin
  DDSD1[0].Stop;
  DDSD1[0].Play;
end;

 

 再生自体はたったの一行。ちゃんと書くと、 DDSD1.Channels[0].Play; ですが、Channelsプロパティはデフォルト配列プロパティなので、記述を省略できて便利です。

 Playメソッドで再生していることはなんとなくお分かり頂けると思うのですが、なんでその前にStopメソッドが挟まっているのかというと、これは、ボタン(ここではButton1)が連射されたときのための対処です。

 一部の環境(おそらく過半数だと思いますが)では、Playメソッドを一度呼んだら、その後に、Stopメソッドを実行しないと、次のPlayメソッドが正しく実行されないことがあるのです。ですので、Playの前にはStopを挟むことをお勧めします

 ともかく、これで効果音の再生が一応出来ますね。

 チャンネルは複数同時に使う事が出来ます。何チャンネルまで同時に使うかは、DDSD.ChannelCountプロパティで設定できます。尚、ChannelCountプロパティは、実行時に変更することは出来ません

 チャンネル0を扱う時はDDSD1[0]としたように、例えばチャンネル5を扱う時は、DDSD1[5]とするだけでOKです。

 

音データの停止とか

 Waveの再生を強制的に停止したい場合は、当然といえば当然ですが、先に説明したStopメソッドを使います。

 ループで再生したい場合は、LoopPlayメソッドを呼べばOKです。LoopPlayメソッドの実行前にもStopメソッドを挟む事をお勧めします。理由はPlayメソッドの場合と同じです。

 この他にも再生時の周波数を変えたり、パン(スピーカーの左右どちらから聞こえるか)を設定したりもできますので、一度リファレンスの方もお読み下さい。

 

TDDSDWaveDataオブジェクトの解放

 TDDSDWaveDataを、Form1.OnDestroyイベントで解放します。

procedure TForm1.FormDestroy(Sender: TObject);
begin
  Wave1.Free;
end;

 ここまで読んで、どうしてチャンネルに直接Waveデータを読み込むようになっていないのか、と不思議に思う方もいらっしゃるでしょう。それは、音源カード上の限られたメモリをより有効に利用できるようにするためです。

 同じ効果音を複数のチャンネルで鳴らす場合、音源カード上のメモリをそれぞれのチャンネルの分重複して持つのももったいないので、TDDSDWaveDataを作って、各チャンネルがWavedataプロパティという形で波形データを参照する、というスタイルを取っています。

 

プライマリバッファの設定

 とりあえず音を出して消して、くらいのことは先に述べた事項だけで十分出来るようになったと思います。でも、実際にプログラミングを始める前に、もう1ステップ加えましょう。

 DirectSoundの中には、複数の波形データをハードウェアないしソフトウェアでミックスして再生する仕組みがあるのですが、ミックスした結果を一旦置くためのバッファを、プライマリバッファと呼びます。

 このため、全ての波形データは再生の直前に、一旦プライマリバッファのフォーマットに合うように変換されるのです。つまり、プライマリバッファが、8ビット・11.025KHz・モノラルに設定されていれば、どんなに高品位な波形データを用意して、再生させようとしても、DirectSoundが勝手に8ビット・11.025KHz・モノラルに変換してくれやがった上で再生するのです(^^;)

 よって、たとえばCDクォリティ(16ビット・44.1KHz・ステレオ)で波形データを再生したいんだ!という場合には、デフォルトのプライマリバッファのフォーマットではなく、以下のようにSetPrimaryBufferFormatメソッドを呼び出して、プライマリ・バッファのフォーマットをきちんと設定すべきです。

procedure TForm1.FormCreate(Sender: TObject);
begin

  //プライマリ・バッファのフォーマットの指定

  //44100Hz、16ビット、ステレオ(True)に設定
  DDSD1.SetPrimaryBufferFotmat(44100, 16, True);

end;

 この処理は単に効果音を鳴らしたいだけなら、絶対に必要というわけでは有りませんので、こういう事もあると記憶に留めていただければ結構です。

 無論、効果音を鳴らすだけの場合でも、プライマリバッファのフォーマットと、よく使う効果音データのフォーマットを一致させたほうが、一般に実行速度の面で有利だと言えます。

 以上でDDSDチュートリアルを終了します。用途を絞り込んで作ったので、少々貧弱ですが、その分簡単になったと思います。 では、頑張ってくださいね(^^)