効果音とBGM

効果音とBGM

現バージョン(v2.6.5)では、
音量調節を付けたりBGMをループ再生したい場合にはある程度の制限があります。

AUD指定の素材の場合にはループは曲の最後〜先頭は可能ですが、
任意の位置でのループ再生はできず、 また、曲が終了して先頭に戻る時に一瞬だけ音が途切れてしまいます。

ループの位置が指定できるSND指定のファイルに関しては、
音量の調整が sSndVol によるマスターボリュームのみとなる為、
SNDの全体の音量が変わってしまう事になるのでフェードアウトができない等の問題があります。

どうしてもフェードアウトを使いたい人は現状ではAUD指定の素材を使うしかないのが現状です。
(同じく再生中のSNDを右から左にパンしたりなども出来ないので、その場合もAUD指定の素材を使用します)

始めたばかりで覚える事が多いから後回しにしたかったり、
曲のループが最初〜最後で尚且つループする時に一瞬音が途切れても良い場合は、
指定などが簡単なAUDを使いましょう。

ここでは現状でできる範囲でのSND指定のファイルの個別の音量変更とBGMのループの方法を紹介します。



現バージョンで効果音のボリューム設定をする方法

SNDに関しては音量を調整する関数が存在しない為、
唯一ボリュームの値が設定できる関数 play_sound_vpp を使用します。

play_sound_vpp は変数を使用しないといけないのがネックですが、
ボリューム以外にもピッチ(音程)やパン(音が右〜左のどちらから聞こえるか)が設定できます。

注意してほしいのは、
play_sound_vpp は play_sound と同様、
実行した時に再生されると言う点です。
かならず必要な時にだけ実行するようにスクリプトを記述するようにしましょう。

play_sound_vpp の内容に関しては以下の通りです。

引数1 再生するSND番号
引数2 ボリュームの値が格納された変数 0〜10000の値で指定
引数3 ピッチの値が格納された変数 -550?(可聴で)くらいから10000の値
引数4 パンの値が格納された変数 -10000〜10000

音量を0〜100の値で設定したいと言う場合、
値を100で乗算すると良いと思います。



SNDのループ再生

『注意点』の『AUDとSNDに関して』でも触れていますが、
ZGEでは ×0.01 で保持しているので〜(略)取得したサウンドの再生位置を 1764 で除算(div)すれば1秒単位に変換可能』となっているものの、
ファイルの秒数から逆算しても正確な位置は算出できません
その為、ループ位置に関しては自分の耳で確認しながら調整してもらうしかないのが現状です。

また、play_sound_vpp に関しては、
ループの指定ができる引数が存在しません。

そこで、とりあえずBGM素材ファイルに関しては、
自力で再生位置を調べるのが大変なら、
末尾〜先頭までがループできる形のファイルを用意し、
BGMを再生する専用のキャラクターイベントを作って、
以下のようなスクリプトを実行させましょう。

0 cnt_goto l1 1 1 5
1 let i0  10000 0
2 if(>)more l0  0 5
3 play_sound_vpp 1 i0  
4 let l0  10 0
5 dec_lim l0  1 0
7 get_snd_pos 1  f1  
8 then f1 10 0  
9 let l1  0 0

簡単に説明すると、
要は get_snd_pos の戻り値で任意のSNDが再生されていないなら、
再度SNDを再生すると言う形の内容です。

0行目の cnt_goto はSNDの再生を1度だけ実行するもので、
7行目で再生位置を取得し、
その戻り値で再生されていないと判断したら9行目で cnt_goto のカウンタ用変数を0にし、
再度SNDが再生されるようにします。

2行目と4・5行目に関しては、
play_sound_vpp によるサウンド再生がまれに不自然になるのを回避する為にあります。

これによって音が途切れずにBGMがループできるようになりますが、
先ほども説明した通りZGEでは正常な再生位置は取得できないようなので、
もしかしたらループができず再生が終了する事もあるかもしれません。

もちろん 再生位置を自力で取得させ、
BGM末尾から任意の再生位置をループさせる事も可能です。



SNDの一時停止

SNDファイルは一時停止をする関数が存在しません。
ただし、一応ですが get_snd_pos(再生位置の取得)と set_snd_pos(再生位置の変更)の2つの関数を使う事で、
疑似的に一時停止を再現する事が可能です。

関数の説明を見てもらえば分かると思いますが、
停止時に get_snd_pos で再生位置を変数に格納し、
再開する時にその値を使って set_snd_pos で再生位置を変更すると言うものです。

ただし、取得位置は精密ではないので、
わずかに再生位置にずれが発生します。
その為、この関数を使って疑似的にフェードアウトのような効果を出す事はできません。



強引にSNDをフェードアウト

すべての効果音をAUDで登録し、
BGMだけSNDで登録したものを再生すれば、
sSndVol で音量を調節できるので、
フェードアウトも再現できると言うかなり力押しの方法です。
(他のBGM同士をフェードイン・フェードアウトで重ねる事はできませんが)

この方法で注意しないといけないのは、
AUDの再生中は同じAUD素材は再度再生されないので、
効果音が被った場合は stop_audio で効果音を止める必要がある事と、
音の再生が若干遅くなると言う点です。

大がかりのもので試した事が無い為、
実際に組み込んで正常にゲームが最後まで動作させられるか保証はありません。
また、組み込んだ後に修正するのは非常に手間がかかるので、
使用する場合は自己責任でお願いします。




▲フレームが表示されない人はクリック