FC2ブログ

ホーム > WAVEファイルフォーマット > WAVEファイルの書き込み

WAVEファイルの書き込み



WAVEファイルはWindowsのマルチメディアアプリケーションを収めたRIFF形式Resource Interchange File Format)という形式をとっております。

WAVEファイルの書き込み手順は以下の通りです。

  1. マルチメディアファイル入出力関数を使って、WAVEファイルを開きます。
  2. RIFF/WAVEチャンクを作成して、その中に進入します。
  3. fmtチャンクを作成してその中に進入し、WAVEFORMATEX構造体を書き込んだ後、fmtチャンクから退出します。
  4. dataチャンクを作成してその中に進入します。
  5. 音源データを格納するバッファを作成します。
  6. 現在の演奏条件での音源データをバッファに読み込み、ファイルに書き込みます。この作業を音源データが読み込めなくなるまで繰り返します。
  7. RIFFチャンクから退出してファイルを閉じます。





マルチメディアファイル入出力関数を使用するために必要なインクルードファイルとライブラリーです。

#include <Mmsystem.h>
#pragma comment (lib, "winmm.lib")


は指定されたパス名のファイルをマルチメディアファイル入出力関数で開いて、StreamOut関数を呼び出します。

//WAVEファイルの書き込み
BOOL CWaveFile::SaveFile(LPCTSTR lpszFileName)
{
//マルチメディアファイル入出力関数
HMMIO hmmio=::mmioOpen((LPTSTR)lpszFileName,NULL,MMIO_CREATE|MMIO_WRITE);
if (!hmmio) return FALSE;
//Waveストリームへの書き込むStreamOut関数を呼び出します。
BOOL bResult=StreamOut(hmmio);
::mmioClose(hmmio,0);
return bResult;
}


現在演奏中のファイルから音源データを読み込み、現在の演奏条件でWAVEストリームに書き出します。

//Waveストリームへの書き込み
BOOL CWaveFile::StreamOut(HMMIO hmmio)
{
//現在演奏中のファイルハンドルがなければ
//FALSEを返して終了します。

if (!m_hmmioIn) return FALSE;

//WAVEデータ書き込みのための設定
MMCKINFO mmckRiff,mmckFmt,mmckData;
MMRESULT mmr;
LONG size;
//RIFF/WAVEチャンクを作成して、その中に進入します。
mmckRiff.fccType=::mmioStringToFOURCC(_T("WAVE"), 0);
mmr=::mmioCreateChunk(hmmio,&mmckRiff,MMIO_CREATERIFF);
//WAVEチャンクの作成に失敗したら、FALSEを返して終了します。
if (mmr!=MMSYSERR_NOERROR) return FALSE;

//fmtチャンクを作成して、その中に進入します。
mmckFmt.ckid=::mmioStringToFOURCC(_T("fmt "), 0);
mmr=::mmioCreateChunk(hmmio,&mmckFmt,0);
//fmtチャンクの作成に失敗したら、FALSEを返して終了します。
if (mmr!=MMSYSERR_NOERROR) return FALSE;

//現在演奏中のWAVEFORMATEX構造体を取得します。
WAVEFORMATEX wfx;
GetWaveFormatEx(0,&wfx);
//WAVEFORMATEX構造体をファイルに書き込みます。
LONG sizeHeader=sizeof(WAVEFORMAT)+sizeof(WORD);
size=::mmioWrite(hmmio,(const char*)&wfx,sizeHeader);
//書き込みに失敗したら、FALSEを返して終了します。
if (size<sizeHeader) return FALSE;

//fmtチャンクから退出します。
mmr=::mmioAscend(hmmio,&mmckFmt,0);
if (mmr!=MMSYSERR_NOERROR) return FALSE;

//dataチャンクを作成して、その中に進入します。
mmckData.ckid=::mmioStringToFOURCC(_T("data"),0);
mmr=::mmioCreateChunk(hmmio,&mmckData,0);
//dataチャンクの作成に失敗したら、FALSEを返して終了します。
if (mmr!=MMSYSERR_NOERROR) return FALSE;

//派生クラスから書き込み用のバッファサイズを取得します。
UINT nBufSize=GetSizeOfSaveBuffer();
//音源データを格納するバッファを作成します。
CByteArray byteArray;
byteArray.SetSize(nBufSize);
//バッファへのポインタを取得します。
PBYTE pBuffer=byteArray.GetData();
//読み込み用のインデックスをゼロにします。
UINT indexSample=0;
while(TRUE){
//現在の演奏条件での音源データを取得します。
UINT readBytes=StreamIn(pBuffer,nBufSize,&indexSample);
//最後まで読み込んだら、ループを抜けます。
if (!readBytes) break;
//ファイルに音源データを書き込みます。
size=::mmioWrite(hmmio,(const char*)pBuffer,readBytes);
if (size==-1) return FALSE;
}
//dataチャンクから退出します。
mmr=::mmioAscend(hmmio,&mmckData,0);
if (mmr!=MMSYSERR_NOERROR) return FALSE;

//riffチャンクから退出します。
mmr=::mmioAscend(hmmio,&mmckRiff,0);
if (mmr!=MMSYSERR_NOERROR) return FALSE;
return TRUE;
}


戻り値がTRUEなら、WAVEファイルへの書き込みは成功です。

サンプルプログラム(VisualC++net2003ソリューション)WaveFileTest03.zip

上記のzipファイルをダウンロードしてからWinRAR等で解凍し、WaveFileTest03フォルダー内にある「WaveFileTest.sln」を開きます。
「F5」キーを押すと、ビルド確認のダイヤログが表示されるので「Yes」を選択してソリューションをビルドします。



ビルドが終わると直ちにプログラムが自動起動して下の図にあるダイヤログが表示されます。



ダイヤログにある「ファイルを開く」ボタンを押すと、「ファイルを開く」ダイヤログが表示されます。



resフォルダー内の「Sample3.wav」を選択し、「開く」ボタンを押して演奏が始まるのを確認してから、「PAUSE」ボタンを押して演奏を一時停止させ、ダイヤログのメニューで「ファイル」/「名前を付けて保存」を選択し、「名前を付けて保存」ダイヤログでファイル名を「Sample3mono.wav」と入力し、「保存」ボタンを押します。



「PLAY」ボタンを押してから、引き続いて「ステレオ」ボタンを押して、音声がモノラルからステレオに変わるか確認したあと、先ほどと同じく「PAUSE」ボタンを押して演奏を一時停止させ、メニューから「ファイル」/「名前を付けて保存」を選択し、ファイル名を「Sample3Stereo.wav」と入力し、「保存」ボタンを押します。



ダイヤログにある「ファイルを開く」ボタンを押して、先ほど保存した「Sample3mono.wav」と「Sample3Stereo.wav」を読み込み、それぞれモノラルとステレオで正しく演奏されるか確認して下さい。



<<モノラル音源の擬似ステレオ再生ページの先頭CD-DAの再生 第1部>>

スポンサーサイト



コメント: 0

この記事へのコメント
ブログ著者にのみ知らせます。

Trackback+Pingback: 0

TrackBack URL for this entry
http://hiroshi0945.blog75.fc2.com/tb.php/48-e990e982
Listed below are links to weblogs that reference
WAVEファイルの書き込み from マルチメディアファイルフォーマット

Home > WAVEファイルフォーマット > WAVEファイルの書き込み

タグクラウド
ブロとも申請フォーム

この人とブロともになる

ブロとも一覧

このページの先頭へ戻る