二つのBGMをコントロールする
図1のムービーは,簡易的なミキサー風のムービーです。A・Bの二つの曲の音量や,どちらの曲の音を出力するかをコントロールしています。初期設定の状態では,Aの曲の音のみを出力しますが,ムービーの下端のクロスフェーダー用のツマミをB側に動かすことによって,だんだんとBの曲の音の出力を上げています。また,A・Bの曲の基本音量を個別に設定することも可能です。
図1:ミキサー風ムービー(クリックするとムービーを表示します)
このような形で,ActionScriptを使って複数の音素材の音量をコントロールする場合には,ちょっとしたコツが必要となってきます。
BGMの再生状態をチェックする
では,個別の音素材の制御方法を見てみましょう。図2のように,二つの音素材が[ライブラリ]パネルに準備されているとします。それぞれの音素材ファイルは,ActionScriptから制御できるように「BGM_01」「BGM_02」と識別子がつけられています。
図2:[ライブラリ]に用意された音素材
まずは識別子「BGM_01」の音素材をスクリプトから制御してみましょう。ステージ上に一つのボタンインスタンス「playBGMCh01」を配置し,このボタンを押したら「BGM_01」を再生させます。この処理は,前回ご紹介したようにSoundクラスのattachSoundメソッドとstartメソッドを使用して,以下のようにコードを記述すればOKです。
//BGMを制御するためのインスタンス生成 var BGMCh_01:Sound = new Sound(); //音素材を割り当てる BGMCh_01.attachSound("BGM_01"); //ボタンを押したらBGMをスタート playBGMCh01.onRelease = function() { BGMCh_01.start(); };
図3:ボタンを押すとBGMが流れるムービー(クリックするとムービーを表示します)
ボタンを押すときちんとBGMが流れましたね(図3)。でもこのムービー,連続してボタンを押すと,ボタンをおした回数分だけBGMが重なって再生されてしまいます。短い効果音であれば多重に再生されても構わないのですが,BGMのような長いものとなると,ちょっとうるさくなってしまいます。
そこで,「再生されていない場合のみ,再生を開始する」という処理を加えてみましょう。再生されているかどうかを判定するにはいろいろな方法があります。今回は,Soundクラスに用意されている「サウンドの現在の再生時間(再生位置)」を取得できる「positionプロパティ」と,「サウンド全体の再生時間(継続時間)」を取得できる「durationプロパティ」を使用した処理を作ります(表1)。
プロパティ | 説明 |
---|---|
positionプロパティ | サウンドの再生位置を取得 |
durationプロパティ | サウンド全体の再生時間を取得 |
この二つのプロパティを使用すると,「サウンドが再生されていない状態」は,positionプロパティの値が0の状態のとき,あるいは,すでに再生が完了してpositionプロパティの値がdurationプロパティの値と等しくなっている状態のときの二つが考えられます。
そこで,ボタンを押したときに実行する処理を以下のように変更してみましょう。
//ボタンを押したらBGMをスタート playBGMCh01.onRelease = function() { //現在の再生位置を取得 var p:Number = BGMCh_01.position; //再生状態になければ再生 if (p == 0 || p == BGMCh_01.duration) { BGMCh_01.start(); } };
図4:再生状態のチェック処理を加えたムービー(クリックするとムービーを表示します)
今度はボタンを連続で押しても多重再生されませんね(図4)。このようにpositionプロパティとdurationプロパティを使用すれば,サウンドの再生情況を判定することができます。