スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

音に合わせた処理


音に合わせて入出力できると、表現の幅が広がりますよね。
音ゲー作るには必須でしょうし。

今作ではオープニングムービーに使用しました。
処理はできたんですが、センスがアレなので出来はゴニョゴニョです。

wav、mp3、oggなどのオーディオファイルと、midiについてまとめてみました。
処理は似たような感じですが、数値の調べ方がちょっと違います。
詳細は以下。


(2013/05/18追記)
midiについて詳しい記事があったのでリンク。
文系脳でゲームを作るーーウディタでエフェクトを音楽に合わせてみよう!【midi編その1】
だいたい合わせる事に重きをおいて、処理落ちするとずれたりはしますが
そもそもRPGで処理落ちするのはしょぼいPC(私みたいな)だけなので
あんまり気にしなくていいような気がします。
最近共同制作を始めましたが、それを機にそう考えるようになりました。
非常に分かりやすい記事でしたのでぜひ。
(追記ここまで)


まず、1小節あたりの長さを、ミリ秒単位で求めます。
オーディオファイルの場合はテンポなどが分からないので、波形から読み取ることになります。
愛用のAudacityを使って求める方法です。
adc1.png
オーディオファイルを読み込みます。
この曲は分かりやすいですね。ロックっぽい感じなので、スネアやバスドラの音がはっきり波形に出ています。
分かりづらいので、赤い四角の部分を拡大。

adc.png
まだちょっと分かりづらいですが、ちょっと見えてきました。
何度か再生して、リズムを取りつつ何小節あるか数えます。
この曲は4/4拍子で、この区間は8小節(32拍)あるようです。


もっと拡大して、小節の最初と最後の位置をしたのバーで確認すると、
最初が48ms、最後が10958msでした。なので、1拍の長さは
(10958-48)/32≒341ms
ぐらいになります。
この数値を使って、何かしら制御してやります。


まず簡単に思いつくのが、ウェイトを使って制御する方法。
1秒が60フレームなので、適度にウェイトを入れてやれば動きそうです。
が、これには落とし穴があります。
audio1.png
赤い棒が1フレームの時間、青い棒が1フレーム内で行われる処理時間です。
図の上のような軽い処理だと問題は無いんですが、
1フレーム内の処理が16ms以上になると、処理が完了してから次のフレームに移ります。
そうなってくると、ちょっと重い処理が入るだけでどんどんずれていきます。
これでは現実的ではないですね。
そこで、変数操作+を使います。


■サウンド:BGM「」再生 / 処理時間:0フレーム
■ウェイト:1 フレーム
■変数操作: CSelf10[区切り] = 49 + 0
■ループ開始
|■ループ開始
| |■変数操作+: CSelf11[再生位置] = BGM現在再生位置(ミリ秒・1周目のみ/MIDIならTick値)
| |■条件分岐(変数): 【1】CSelf11[再生位置] が CSelf10[区切り]以上
| |-◇分岐: 【1】 [ CSelf11[再生位置] が CSelf10[区切り]以上 ]の場合↓
| | |■ループ中断
| | |■
| |◇分岐終了◇
| |■変数操作: V21[小節数] += 1 + 0
| |■ウェイト:1 フレーム
| |■
|◇ループここまで◇◇
|■イベントの挿入[名]: ["ムービー処理"] <コモンEv 306> / V21[小節数]
|■条件分岐(変数): 【1】CSelf10[区切り] が 10958以上
|-◇分岐: 【1】 [ CSelf10[区切り] が 10958以上 ]の場合↓
| |■ループ中断
| |■
|◇分岐終了◇
|■変数操作: CSelf10[区切り] += 341 + 0
|■ウェイト:1 フレーム
|■
◇ループここまで◇◇

こんな感じです。
毎フレーム再生位置を監視して、区切り(小節、拍のアタマ)を超えた瞬間にループを中断して処理に入る。
処理が終わったら、区切りを増やして監視開始……の繰り返しです。
こういう感じだと、例えばGame.exeのウィンドウを移動している時は処理が中断されますが
変数操作+で取得できる数値は増え続けているので、
ウィンドウの移動が終わった瞬間に頑張って追いついていく様子が見えます。
うまく説明できないですね。
要するに、処理落ちしても追いつけるよって事です。
音ゲーで処理落ちして、その後音がずれ続けるとかゲームとして成り立ちませんからね。
どう動くのか見てみたい方は、動作サンプル(という名の体験版)(15.0MB)をどうぞ。


midiについて書き忘れました。
midiは、テンポや音譜のデータが入っています。
変数操作+でTick値が取得できるので、波形から計算しなくてもいいのでだいぶ楽です。
計算方法はよくわからないので割愛します。
テンポ、分解能、音譜の長さらへんから計算するそうです。
試しにサンプルゲームのTownでやってみたら上手く動いたので、やってみたい方は挑戦してみるといいと思います。


最後になりましたが、ウディタVer2.10では変数操作+の再生位置取得にバグがある気がします。
一応報告して確認してもらったんですが、Win7 64bitでは再現不可だったようなので
環境依存(Win XP? 32bit?)の問題なのかもしれません。
Ver2.02では0/100で、Ver2.10では30/100ぐらいの再現率だったので
音ゲー製作の際にはVer2.02を使うのが無難かもしれません。
関連記事

Comment

Post a comment

非公開コメント

お知らせ

記事移行完了

記事をFC2からcatgames.16mb.comへ移行完了しました。

このサイトは更新されません。

カウンター

2012/09~

メールフォーム

名前:
メール:
件名:
本文:

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。