forte1stのブログ

今までに作ったゲームの解説とかを書きます

256FのBGM自動生成システムについて

f:id:forte1st:20181117205217p:plain
256F

2015年4月公開
ニコニコ自作ゲームフェス5にてUnityスタークリエイター賞受賞

 

256Fは自動生成された塔を登っていくジャンプアクションゲームで、BGMがゲームの状況に合わせて自動生成されるのが特徴です。こんな感じのBGMが生成されます。

 

地形の自動生成に関しては、一定の大きさの地形パターンをいくつか用意してランダムに配置した後、穴の開いたパターンを各フロアに1箇所以上配置し、所々に休憩フロアを配置するという単純な仕組みです。横移動を塞ぐ地形がないので、穴が各フロアに1箇所でもあれば通行可能であることが保証されます。

 

音楽の自動生成については少し複雑なことをやっていますが、別に特殊な技術を使っているわけではありません。

まず、コード進行はエリア(64フロア)ごとに固定のパターンを繰り返しています。ただし、固定といっても全く同じコード進行を繰り返すのではなく、似たようなコード進行をいくつか用意してランダムに切り替えています。例えば65F~128FではFM7-G-Am-AmになったりFM7-G-Am-Gになったりします。このコード進行に合わせてベースの音が決まりますが、ベースのリズムパターンはエリアごとに固定です。 

メロディーのリズムは、エリアごとに設定された「音符生成確率テーブル」を元に決定されます。例えば、[1.0, 0.2, 0.2, 0.0]というテーブルが設定されていた場合、各小節の1拍目は必ず音が鳴り、2拍目・3拍目は20%の確率で音が鳴り、4拍目は鳴らないということを意味します(実際には1小節をもっと細かく分割しています)。ここで、プレイヤーのHPに応じて確率に補正をかけ、ピンチの時ほど激しいリズムになるようにしています。また、リズムは毎回新しく生成するのではなく、1回生成したリズムを何度か繰り返すようにしています。人間の作る音楽の多くはそうなっているためです。

こうして生成されたリズムに対して音を割り当てます。音楽理論よく知らないので正直適当です。まず、コード進行が決まっているのでそれに応じたスケール(Cメジャーなど)を設定します。各音符について、その時鳴っているコードおよびスケールの構成音が、割り当てる音の候補となります。これらの候補に対して、以下のルールで確率を設定します。

1. 1つ前の音に近い音ほど確率を高くする
2. 1つ前の音が非コード構成音だった場合、非コード構成音の確率を0とする
3. 表拍は非コード構成音の確率を0とする

 1は、例えば低いドから急に高いドに飛ぶようなメロディーが生成される確率よりも、ド→レ→ミのように滑らかなメロディーが生成される確率を上げるということです。2・3は、非コード構成音が多用されて不自然になるのを防ぐためのルールです。

このようにして設定された確率に応じて抽選を行い、各音符の音を決定します。

 

以上がBGM自動生成の仕組みになりますが、その他にもインタラクティブミュージック的な要素として、フロアを登るにつれてテンポが上がるとか、敵がテンポに合わせて攻撃するとか、休憩所内や一部の敵の攻撃範囲内でフィルタがかかるみたいなこともやっています。