ma2のblog - わんくま版(仮)

うどん、より、そば

目次

Blog 利用状況

ニュース

Xbox360ゲーマータグ

リンク

書庫

日記カテゴリ

fmod APIを使ったサウンドプログラム - 楽曲のループと繰返し範囲

fmod APIを使用したプログラムについて解説します。

前回は、システムの初期化からBGMの再生までの方法を紹介しました。
今回はそれを拡張する形でfmodの機能を紹介していきます。

前回はmusic.oggをBGMとして読み込みました。
しかし、プログラムを実行してみるとわかりますが、一度BGM再生が終了するとそれ以降は音が出ません。
繰り返しなり先頭に戻って再度演奏をするようにはなっていません。
これを繰り返し演奏にするには、FMOD_System_CreateStream APIの引数を以下のように変更します。

// fmodTest01の呼び出し(一度だけ再生)
result = FMOD_System_CreateStream( fmodsystem, "./music.ogg", FMOD_DEFAULT, NULL, &fmodsound );

// 繰り返し再生
result = FMOD_System_CreateStream( fmodsystem, "./music.ogg", FMOD_DEFAULT | FMOD_LOOP_NORMAL, NULL, &fmodsound );

FMOD_MODE定数には、FMOD_LOOP_NORMAL(通常の繰り返しを有効にする)というフラグがあります。
これを指定すると、読み込んだデータの先頭からシュウたん終端までを繰り返しの範囲とすることが出来ます。

次に、ループ範囲を指定するAPIを紹介します。
これを使うことで、オーディオファイルに含まれている特定の範囲を繰り返しの範囲にすることが出来ます。

API名 FMOD_Channel_SetLoopPoints
構文 FMOD_RESULT FMOD_Channel_SetLoopPoints( FMOD_CHANNEL* channel, unsigned int loopstart, FMOD_TIMEUNIT loopstarttype, unsigned int loopend, FMOD_TIMEUNIT loopendtype );
引数
channel 繰返し範囲を設定するFMOD_CHANNELのポインタです。
FMOD_System_PlaySoundで演奏を開始した際に取得したものを使用します。
loopstart 繰返し範囲の開始地点を指定します。
指定する値の単位は、loopstarttypeで指定したFMOD_TIMEUNIT定数によって変更することが出来ます。
loopstarttype loopstart値の単位を指定します。
loopend 繰返し範囲の終了地点を指定します。
指定する値の単位は、loopendtypeで指定したFMOD_TIMEUNIT定数によって変更することが出来ます。
loopendtype loopend値の単位を指定します。
返り値 FMOD_RESULT(FMOD_OKであれば成功、それ以外は各種エラーコード)
解説 channelで指定したチャンネルの繰り返し範囲を設定します。
開始地点/終了地点の設定値と単位は引数の項の通りです。
loopstarttype/loopendtypeで指定できる単位(FMOD_TIMEUNIT定数)にはさまざまな種類がありますが、一般的なものは以下の定数です。
FMOD_TIMEUNIT_MS ミリ秒(1/1000秒)単位での指定です。
FMOD_TIMEUNIT_PCM PCMでのサンプル単位です。
サンプリングレートが44.1KHzのデータであった場合、チャンネルやビットレートに関わらず1/44100秒刻みの単位になります。
FMOD_TIMEUNIT_PCMBYTES PCMでのバイト指定です。
FMOD_TIMEUNIT_PCMBYTESとは違い、サンプリングレート/チャンネル/ビットレートに応じて計算方法が異なります。

例として、開始地点を1000ミリ秒/終了地点を9000ミリ秒にする場合の記述をする場合は以下のようにします。

long PlayMusicStream( void )
{
  FMOD_RESULT result;

  // BGMの再生(頭出し状態...一時停止)
  result = FMOD_System_PlaySound( fmodsystem, FMOD_CHANNEL_FREE, fmodsound, TRUE, &fmodchannel );
  if( result != FMOD_OK ){
    return -1;
  }
  // 繰返し範囲の設定
  FMOD_Channel_SetLoopPoints( fmodchannel, 1000, FMOD_TIMEUNIT_MS, 9000, FMOD_TIMEUNIT_MS );

  // 演奏位置の設定 ... (*A)
  // FMOD_Channel_SetPosition( fmodchannel, 1000, FMOD_TIMEUNIT_MS );

  // 一時停止状態解除
  FMOD_Channel_SetPaused( fmodchannel, FALSE );
  return 0;
}

# 見慣れないAPIがありますが後述します

繰返し範囲を設定する場合には、APIの呼び出しを工夫する必要があります。
FMOD_Channel_SetLoopPointsを呼び出す際にFMOD_CHANNEL*をあらかじめ取得しておく必要があります。
しかし、FMOD_CHANNEL*を取得する際にFMOD_System_PlaySoundを前回のサンプル(fmodTest01)そのままの状態で呼び出してしまうと演奏が始まってしまいます。
そこで第四引数のpausedをFALSEからTRUEにします。
これでAPI呼び出し直後から演奏が始まる事を防ぐことが出来ます。
次に、FMOD_Channel_SetLoopPointsを呼び出します。
最後に、FMOD_Channel_SetPausedを呼び出して一時停止を解除します。
FMOD_Channel_SetPaused APIは、FMOD_System_PlaySoundの第四引数pausedの状態だけを変更するAPIです。
このAPIの解説は省略します。

この状態で演奏をすると、最終的に繰り返し再生になりますが、初回の演奏のみBGMが先頭から演奏されます。
これを回避する処理がコメントになっている(*A)の部分になります。

API名 FMOD_Channel_SetPosition
構文 FMOD_RESULT FMOD_Channel_SetPosition( FMOD_CHANNEL* channel, unsigned int position, FMOD_TIMEUNIT postype );
引数
channel 繰返し範囲を設定するFMOD_CHANNELのポインタです。
FMOD_System_PlaySoundで演奏を開始した際に取得したものを使用します。
position 演奏を行う地点を指定します。
指定する値の単位は、postypeで指定したFMOD_TIMEUNIT定数によって変更することが出来ます。
postype position値の単位を指定します。
返り値 FMOD_RESULT(FMOD_OKであれば成功、それ以外は各種エラーコード)
解説 channelで指定したチャンネルの演奏位置を設定します。
変更は、チャンネルが一時停止状態でない場合は即座に反映されます。
チャンネルが一停止状態であった場合は、一時停止が解除された瞬間に指定地点からの演奏が始まるようになります。
postypeで指定できる単位(FMOD_TIMEUNIT定数)はFMOD_Channel_SetLoopPoints APIの解説を参照してください。

(*A)のコメントを解除した場合、初回の演奏から繰返し範囲の先頭から演奏が始まります。

以上が繰り返し再生とその設定方法になります。

投稿日時 : 2008年11月12日 23:38

コメントを追加

No comments posted yet.
タイトル  
名前  
URL
コメント