Waveファイルを作成する(その1)

ここでは「PCM,44,100 kHz, 16 ビット, ステレオ」形式の音声データなしのWaveファイルを作成します。(音声データなしについて :音声データを挿入させるのはちょっと難しい(?)ので今回は却下します。)



■必要なコンポーネント 

■使用するAPI関数

■その他

■ソースは下記のようになります。

■初期宣言
private
{ Private 宣言 }
PCM: TWaveFormatEx;
procedure WaveSave;

■Waveファイルを作成する手続き
procedure TForm1.WaveSave;
var
 hIO    : hMMIO  ; //デバイスのハンドル
 RIFF_INFO :TMMCKINFO; //RITT用構造体
 DATA_INFO :TMMCKINFO; //音声データ用構造体
 FMT_INFO : TMMCKINFO; //fmt用構造体
begin

if SaveDialog1.Execute then
begin

 //新規Waveファイル作成する
 hIO := mmioOpen (PChar (SaveDialog1.FileName), nil,MMIO_CREATE or MMIO_WRITE or MMIO_EXCLUSIVE);

   //RIFFチャンクを作成
   RIFF_INFO.fccType := mmioStringToFOURCC ('WAVE', 0);
   mmioCreateChunk(hIO, @RIFF_INFO, MMIO_CREATERIFF);

    //サブチャンクにWaveフォーマットを書き込む
    FMT_INFO.ckid := mmioStringToFOURCC ('fmt', 0);
    mmioCreateChunk (hIO, @FMT_INFO, 0);
    mmioWrite (hIO, @PCM, SizeOf(PCM) - 2);
    mmioAscend (hIO, @FMT_INFO, 0);

    //音声データを書き込み
    DATA_INFO.ckid := mmioStringToFOURCC ('data', 0);
    mmioCreateChunk (hIO, @DATA_INFO, 0);
    {ここでhioを使ってファイルにデータを書き込む
         ・・・
         ・・・  
         ・・・} 

    mmioAscend (hIO, @DATA_INFO, 0);

   //RIFFチャンクから退出
   mmioAscend (hIO, @RIFF_INFO, 0);

 //デバイスを解放
 mmioClose (hIO, 0);
end;

end;

■実行部
procedure TForm1.FormCreate(Sender: TObject);
begin

 //初期設定

 SaveDialog1.Filter :='*.wav|*.wav';
 SaveDialog1.DefaultExt :='wav';
 SaveDialog1.FileName :='Untitled.wav';

 //WaveFormat構造体にWaveフォーマットを書き込む
 with PCM do
 begin
  wFormatTag := WAVE_Format_PCM;
  nChannels := 2;
  nSamplesPerSec := 44100;
  nAvgBytesPerSec:= 4 * 44100;
  nBlockAlign := 4;
  wBitsPerSample := 16;
  cbSize := 0;
 end;
end;


procedure TForm1.Button1Click(Sender: TObject);
begin
 //Waveファイルの作成
 wavesave;
end;





Win32 APIのページへ



ホーム PV ランキング