2012年5月10日木曜日

自作音ゲー(もどき)の技術解説(前編)

二重の意味で間が開いてしまいましたが、先日jsdo.itで公開した音ゲー(もどき)の技術解説をしようと思います。まだ遊んだことがないという方は、ここに貼り付けておくのでどうぞご自分で一度遊んでみてください


まず、今回のゲームで核となる機能は次のとおりです。

  • 音楽データとパネル表示パターン生成に使うMMLパーサー
  • 音ゲーゆえに音がならなければ話しにならないので、ブラウザー上で音を鳴らす(何らかの)手段
  • ゲームとして成り立たせるためのフレームワーク
上記の内、今回特に苦労したのが前者2つでした。MMLパーサーの"パーサー"の部分については、以前別のゲームを制作した際に汎用性の高い部分をライブラリのような形で定義していたので、それにMML固有の文法や各種パラメータ抽出のセマンティックアクションを定義するだけでよかったのですが、いかんせん、MML自体昔の規格だからか読みづらい!(まあ、MIDIよりはアルファベットでかける分マシなんでしょうけど・・・ちょっと余談ですが、世の中は実に広く不思議なもので、この世には画像ファイルをバイナリで"解析"するバイナリアンという人たちがいます。なんでも、彼らはあの数字の羅列から"画像"をイメージすることが可能なんだとか。もしMIDIファイルのバイナリアンがいたら、数字の羅列から曲をイメージできたりするんですかね〜。そうか、MIDIのバイナリでアスキーアートを表現しつつ、MIDIシーケンサーにかけたらちゃんとした曲になるっていうファイルを作るのも面白そうかもな〜。まあ、きっと二番煎じだろうけど)
え〜、随分脱線してしまいましたが、本題に戻しましょう。MML自体が読みづらいのは構わないんですよ。人間が読みづらいものとプログラムにとってパースしにくいものは等価ではないので。(今でこそプログラミングを当たり前のようにしているので、MMLのソースを見ても特になんとも思わなくなりましたけど、耐性のない人が読んだら確実に暗号ですよね、あれって。試しに次のソースを読んでみてください。なんの曲だかわかりますか?

   @1 t110 l4 cdef edcr efga gfer
   crcr crcr l8 ccddeeff l4 edcr
   l2 {ccd}{dee} {ffr}e dc r4
   (t2) @0 l4 "ceg""ceg""ceg""ceg" "cfa""cfa""cfa""cfa"
   "dgb""dgb""dgb""dgb" "gb<d>""gb<d>""gb<d>""gb<d>"
   "ceg"r"ceg"r "gb<d>"r"gb<d>"r "ceg""dfa" "egb""fa<c>"
   "dfa<c>""g<cd>""eg<c>"r
   l2 "ceg""dfa" "egb""cdfa" "dfgb""ceg" l4 "<ceg<c"


正解は「カエルの歌」です。今回の主題のゲームのサンプル曲から引用したものなんですが、これが歌だとひと目でわかるでしょうか?わからないですよね・・・)

いかんいかん、また脱線してしまった。MMLパーサーを作るにあたってなやんだことは、文法の方言の多さなんですね。昔、(それこそBASICの時代)にMMLは隆盛を極めたようで色々亜種が存在するようです。このゲームを作り始めるまでMMLについて存在自体は知っていたものの、具体的にどのような規格なのかまでは知らなかったのでまず、どのような文法があるか調べその中からどの文法を採用するかに随分時間がかかってしまいました。
なんだか技術的な話ではなくなってきてしまったので次行きましょう。

次は音ゲーの命とも言える音なのですが、このゲームを作成するにあたってFlashは一切使わずに完成させたかったので選択肢は2つに絞られてしまいます。一つ目はMozillaが独自に実装しているAudio Data APIを使う方法、そしてもうひとつがW3Cの勧告にもあるWeb Audio APIを使う方法です。
今回の場合、なるべく早く完成させたかったのとドキュメントの充実性という観点から後者を選択することにしました。(まあ、ドキュメントが充実していると言っても実際はW3Cの勧告ドキュメントだったんですが。それでも、ちょっと検索しただけで実働デモ以上のプログラムが発見できたのは大きなプラスでしたね〜)
なんだか今回は余談だらけで長くなってしまったので、一旦ここで切りたいと思います。次回はWeb Audio APIの解説をします。それでは!(^O^)/

0 件のコメント:

コメントを投稿

なにか意見や感想、質問などがあれば、ご自由にお書きください。