5.1さらうどん

@giginetの技術ブログ。ゲーム開発、iOS開発、その他いろいろ

iPhoneゲームでインタラクティブミュージックに挑戦してみた話

先日、『VOXCHRONICLE -オクスクロニクル-』というiPhoneゲームを公開しました!
AppStoreにて完全無料で配布中です。(広告も一切ありません!)

f:id:gigi-net:20130512145921p:plain

VOXCHRONICLE - gigi-net.net

音を奏でる奥スクロールRPG『VOXCHRONICLE -オクスクロニクル-』リリースしました - 5.1さらうどん

f:id:gigi-net:20130512161149p:plain

このゲームは、音楽の動的生成をウリにしていて、他のゲームにはない尖った作品に仕上がっています。

このような音楽の自動生成は最近のゲーム業界では「インタラクティブミュージック」と呼ばれています。最近の事例としては、昨年のCEDECで紹介された『ファンタシースターオンライン2』のBGMのプロシージャル生成の例が記憶に新しいです。

4Gamer.net ― [CEDEC 2012]PSO2の「途切れないBGM」はこうやってできている。セガが語る「BGMのプロシージャル生成」

この記事では、『VOXCHRONICLE』を一例に、iPhoneゲームでのインタラクティブミュージックへの挑戦をご紹介したいと思います。

インタラクティブミュージックとは

インタラクティブミュージック(IM)」とは、狭義では従来、固定された音楽を鳴らしているだけのBGMに過ぎなかった音楽を、プレイヤーの操作により、状況に応じて動的に生成していくような試みのことだと思います。しかし、広義では音楽の動的生成はインタラクティブミュージックの一面にすぎず、音楽とゲームを幅広い形で融合させていこうという試みです。

詳しくは、インタラクティブミュージックについての勉強会などを主催している「インタラクティブミュージック研究会」のページをご覧ください。

InteractiveMusicLaboratory

VISS -オクスインタラクティブサウンドシステム-

概要

『VOXCHRONICLE』では、プレイヤーのコマンド入力によって動的に音楽を生成し、没入感を高めています。このシステムをVISS(ヴァイス)と呼んでおり、今作品のキモとなっております。

まず、以下の動画を見てください。

『VOXCHRONICLE』では、音楽の1小節がゲーム中の1ターンに対応しており、プレイヤーが選択したコマンドにより、次の小節が動的に変化していきます。

VISSは各小節毎に「メイン」「リフ」「ドラム」と呼ばれる3つの音声ファイルを同時に再生することで、様々な状況に応じてリアルタイムに音楽を作り出しています。

ゲームに使われている音声ファイルは、以下のような1小節毎の形になっていて、このような音を規則に沿って3音同時に鳴らしていると考えてください。

http://www.kawaz.org/commons/preview/1607/volca_voxattack0.mp3:sound

また今作ではステージによってガラッと曲調が代わっているのも特徴です。

メイントラック

メイントラックは主人公(オクス・ラスカ)の行動を表現したチャンネルです。

曲のメインメロディに相当します。

プレイヤーの入力したコマンドによって曲が切り替わっていく一番わかりやすい変化です。上記の動画を見て頂ければイメージは掴めるかと思います。

コマンド毎に1小節で終了する技や、連続で使い続けることで4小節が繰り返されるコマンド(剣、杖)があります。

また、イントロやアウトロ、ボス戦QTE時の専用ループなど、ゲームの進行に関わるメロディもメイントラックとして鳴らされます。

リフトラック

リフトラックはモンスターを表現したチャンネルです。

モンスターが固有の音を持っており、今一番近いモンスターが持っている固有音が再生されます。
リフは各音セットに4種類の音があり、出現する各モンスターに割り当てられています。

例えば、以下の動画がリフが一番わかりやすい「遺跡」のステージで一番近くのモンスターを切り替えていった例です。おわかり頂けるでしょうか。
カーソルが載っている敵がマスクと宝箱のモンスターどちらかに注意して音を聞いてみるとわかりやすいかと思います。

マスクのリフ:http://www.kawaz.org/commons/preview/1603/ttn_counter0.mp3:sound
宝箱のリフ:http://www.kawaz.org/commons/preview/1604/ttn_counter1.mp3:sound


また、音量も一番近い敵との距離によって変わります。
ちなみに、ボス戦においてはボスが使用した技によって細かくリフが変化しているのですが、音屋さんとの意思疎通ミスで、非常にリフの変化がわかりにくくなってしまいました。ちょっと心残り。

ドラムトラック

ドラムトラックは場全体を表現したチャンネルです。

場の盛り上がりを何となく推定し、それに応じてリズムを切り替えています。
例えば以下の動画、「草原」のステージがわかりやすい例。プレイヤーが何も操作せずに敵が近づいているだけで、どんどんドラムが盛り上がっていくのがわかると思います。

おそらく、遊んだことのある方はDSの『メテオス』などを思い出すのではないでしょうか。


具体的には、ドラムレベルという0~4の5段階の隠しパラメータがあり、場全体の状況からドラムレベルを推定し、それに応じた5種類のドラム音を切り替えるという処理を行っています。こちらのHPが低かったり、敵が多かったり、パワーが溜められていたり、ピンチの局面にはドラムレベルがどんどん上がっていきます。
(ちなみに、上記のような仕組みを開発内ではDSKY(どすこい・ドラムシステム空気を読む)と呼んでいました)

例として、以下は「深海」ステージのドラムです。

ドラムレベル0:http://www.kawaz.org/commons/preview/1601/negi-3c_drum0.mp3:sound
ドラムレベル4:http://www.kawaz.org/commons/preview/1602/negi-3c_drum4.mp3:sound

ドラムトラックとは便宜上の呼び方で、ステージによってはドラム自体はメイントラックに組み込んでしまい、代わりにパーカッションが使われていたり。例えば「炭鉱」ステージが好例。

上記の5種類の他に、このチャンネルは「インパク」と呼ばれる特殊なドラムを4種類持っています。これは普通の音楽のフィルインに相当します。

このゲームには「パワーチャージ」と呼ばれるキャラクターの強化コマンドが存在しており、チャージしたパワー4段階に応じて、普段のドラムを無視して強制的にインパクトが挿入されます。

例えば、以下の動画のドラムを注意深く聞いて頂くと、パワーの解放タイミングでシンバルなどが鳴っています。

インパクト1:http://www.kawaz.org/commons/preview/1605/volca_impact0.mp3:sound
インパクト4:http://www.kawaz.org/commons/preview/1606/volca_impact1.mp3:sound

これらの音をどうやって繋げているの?

これらの音をどのような仕組みで繋いでいるかは、以下の図解を時系列に沿って見て頂ければご理解頂けるかと。

1. 曲の再生開始=ターンの開始。3音が同時に鳴り始めます。
f:id:gigi-net:20130520171811p:plain

2. 0.5小節が経過。四つ打ち曲なら裏拍のタイミング。モンスターが行動します。
f:id:gigi-net:20130520171816p:plain

3. 0.9小節が経過。この時点でコマンド入力を打ち切り、現在の状況に応じて次のトラックを各チャンネルに挿入します
ここでは何もコマンドが入力されていないので、次のメイントラックは待機音
f:id:gigi-net:20130520171820p:plain

4. 次の小節へ。例えばここでアタック(剣)のコマンドを入力します
f:id:gigi-net:20130520171829p:plain

5. また0.9小節になったタイミングでアタックのトラックを次のトラックに挿入
f:id:gigi-net:20130520171834p:plain

6. アタックコマンド音の1小節目がなり始めます
f:id:gigi-net:20130520171838p:plain


このように、チャンネル毎に待ち行列を持っていて、今の状況に応じて次々と次のトラックをpushしていく作りになっています。

音作りの難しさ

僕は作曲については一切携わっていないので、詳しい解説は曲を作った方々の記事に期待するとして、開発の現場で言われていたことは以下のようなことでした。

1小節しかない行動のメロディ差別化

普通の曲は同じようなフレーズを複数回繰り返して曲を繋げていくのが一般的ですが、このゲームの場合、弓やノックバック、回復など多種多様の行動は1小節で全く異なるメロディを作成しなくてはならず、メロディのバリエーションを差別化するのが非常に困難でした

どのコマンドからでも破綻なく繋がる曲展開

ゲームの仕様上、ほぼ全てのコマンドに遷移してしまうため、どの順番で曲が繋がってもコード進行が破綻しないように作曲する必要がありました。また、溜めの後はスラッシュや魔法に繋がりやすい、といったゲームルールやレベルデザインを完全に理解し、プレイ傾向に応じた曲遷移を考える必要がありました。

オクスとラスカの差別化

今作はオクスとラスカのダブル主人公、キャラチェンジが実装されていて、その二人のコマンドを大きく差別化させるのが難しかったようです。例えば、リズムを変えたり、楽器を変えたり、拍子を変えたりと、各楽曲様々な趣向で二人の行動を差別化させています。

全14曲の圧倒的ボリューム

『VOXCHRONICLE』はプロ含め12人の音屋さんによる14つの曲セットという圧倒的ボリュームを秘めています。

上記の解説のような曲データを全部持つと、各曲セット毎に50小節前後の音声ファイルが必要になります。ゲーム中の全小節数の合計はなんと738小節。この規模感が伝わるでしょうか?

また、曲セット毎にかなり細かく音声の共通化設定を行えるような設計になっています。(例えばオクス・ラスカのドラム音を別々にするか、共通化するかなど)。そのため、最も少ない曲セットで43小節、最大構成で64小節の構成となっています。

ゲーム中で利用している楽曲はgithubにて視聴できますので、ご興味のある方はどうぞ

VOXCHRONICLE/VOXCHRONICLE/Resources/Music at master · giginet/VOXCHRONICLE · GitHub

iPhone上での実現の問題点

iOS上でインタラクティブミュージックを実現するにあたって、一番の問題点はメモリと曲の聞こえ方のトレードオフでした。

最初に、何も考えずに逐次ロードを試してみたところ、シームレスに音楽が繋がっているように聞こえるために、デコードなどの遅延がオーバーヘッドとなり、スムーズに音が繋がらない場合が多々ありました。(特にiPhone4などではまともに遊べなかった)

グラフィックでの数フレームの遅延はなかなか目視できないモノですが、音楽の場合は1フレーム途切れただけでもすぐにわかってしまいます。

そのため、音声データをバッファとしてメモリ上に全て展開しておく方針に転換しました。
こちらはこちらで、ロードを効率よく、かつ適切なタイミングで行わなければ、大きなロード時間が発生したり、メモリリークが発生したりするという新たな問題が発生しました。

そこで、要件としては以下を満たす必要がありました

  1. 小節切り替えに合間ができない
  2. 曲セットの変わるタイミングでロードが入らない
  3. メモリリークが起きない
  4. デコードはなるべく高速化
  5. アプリ容量は極力削減しなくてはならない

『VOXCHRONICLE』の場合は、1ステージ中に同時に使用される可能性のある小節数は多くても60程度、さらにステージ間でステージセレクト→イントロが鳴って操作不可能な時間が存在するので、そのタイミングで今まで使っていたステージの曲セットを解放し、同時にそのステージ中で利用するファイルを全て展開しています。

メモリ上に全て展開することで1の問題、操作不能なタイミングで1小節ずつ非同期ロードを行うことで2の問題は解決しました。

3, 4, 5の問題を解決するためには、音声フォーマットの選別と圧縮が必要でした。

WAVEは音質、デコード速度共に優れていますが、アプリ容量の面から難しく、mp3はループサウンドに不向きという特徴、OGGiPhone上でのデコードが難しいという理由からそれぞれ採用を見送りました。

結局、iPhone上でこのような動的変化をさせるには、CoreAudio一択となります。
具体的にはafconvertでCoreAudioのIM4 Codec、ステレオ22050bpsで固定することで、音質を損なわずにメモリ、容量の削減を行うことに成功しました。

コンシューマ機から見るとまだまだいろいろと甘いんでしょうが、今作はこれでiPhone3GSでもほぼ遅延なく動作できるように実装できたので、及第点ではないでしょうか。

ご興味を持った方は

自分でやっておいて言うのもなんですが、インディーズゲームでは前代未聞の規模感、仕様で実装できたなあと思っています。(おそらく無料の限界!)

もし、インタラクティブミュージックや、ゲーム開発そのものにご興味を持って頂いた方は、インタラクティブミュージック研究会(IM研)や札幌ゲーム制作者コミュニティKawaz、そしてこの『VOXCHRONICLE』をよろしくお願いします!

札幌ゲーム制作者コミュニティKawaz

VOXCHRONICLE for iPhone, iPod touch, and iPad on the iTunes App Store