Skip to content →

リベンジ・オブ・サウンド実装

前回のエントリから1ヶ月以上間が空きましたが,作業に集中していたとか,仕事が忙しかった等のそれらしい理由は一切なく,ひたすらゲームしてました.1ヶ月間たっぷり充電したので,当分は私の中のバッテリーが持ちそうです.

……あれ,今週末はドラクエ発売?いやいや,さすがに今RPGに手を出すと,過充電で発火の危険があります.

* * *

さて,ゲームの合間に少しづつ調査し,以前から問題が多いと述べていたサウンドまわりの実装にようやく解決の兆しが見えてきました.

Apple環境では音響まわりは充実していて,サウンド実装ひとつでも様々な実装方法が提供されています.ゲーム向けの実装として推奨されているのがOpenALの利用で,扱いが簡単なうえに低遅延,そして3D座標を与えるだけで3次元定位オーディオを実現できるという,まさにゲーム向けの実装です.それもそのはず,OpenALは元々ゲーム開発の過程で生まれたライブラリですから.

しかし,このOpenALがこちらの意図した通りに動作せず,扱いが簡単な反面こちらが制御できる余地もあまり多くはなく,与えられるパラメータを総ざらいしてみたけど原因が掴めなかった……というのが以前のエントリで書いたお話.それに加えて,ごく稀にOpenAL内部で停止してしまう現象が発生しており(ここ2ヶ月で3回ほど発生),そろそろ本腰を入れて解決しなければといったところです.ちなみに,ほぼ同じソースを使用した「反撃BLOCKS」では数年間のプレイでも停止現象は発生していませんのでご安心を.

解決といっても原因は今まで散々調べてきても分からなかった訳ですから,別の手段で解決を図る必要があります.OpenALの悩みから解放される,もっとも確実な方法……要するに使わなければ良いのです.という訳で,macOSやiOSで現実的な範囲で最も低レベルな(根っこの部分からの)実装になる,Audio Unitという仕組みで実装し直しています.ちなみに,ドキュメントによるとOpenALもAudio Unitで実装されているとの事.

この方法は最も難しいというイメージがありましたが,蓋を開けてみれば至ってシンプルな実装で,単純に波形を与えればその通りに音が鳴るというだけのものでした.単純に音を鳴らすだけであれば,音の波形がデジタルデータとしてどう表現されているかという予備知識があれば十分なほど.反面,OpenALの特徴である3次元定位オーディオのような機能は自前で実装しなければならなくなりますが,そもそも2Dゲームなので今回に限っていてば大した問題にはなりません.

ひとまずSEまわりの再生に対応してみたところ,少なくともゲームをプレイしている限りでは不審な挙動もノイズもなく良好に動作しているようです.まだあまり細かく動作検証できていないので全体もいまいち見えていませんが,何となく問題は収束に向かっているような感じです.

それにしても,簡単に波形を作って発音できる環境を手に入れたとなると,ゲームにFM音源シーケンサなんかを実装して発音したくなりますね.FM音源はそれなりにCPUリソースを消費するため,実際のところ実用性には乏しいのですけど,何となく夢が広がります.

* * *

音声関連でちょっとだけ余談.

「反撃BLOCKS」はストーリー上は70年代後半のお話ですが,当時はまだゲームにFM音源やPSGといったデジタルサウンドは使用されておらず,ディスクリート回路で発音していた時代です.BGMがアナログシンセサイザー+ループシーケンサ(を再現したソフト)で作られているのは,その辺の事情が元ネタになっています.

一方,SEに関しては一部を除いてFM音源で収録しています.これは,FM音源の音色は人工的に作ろうとしなければ発せられることが殆ど無く,結果として他の音に掻き消されにくいという特性があるためです.身近な例として,JRの電車の発進メロディはFM音源で作られていることは一部では有名ですが,あのメロディは雑踏の中でもよく聞こえたりします.「反撃BLOCKS」はバックグラウンドで音楽を再生しているとBGMが消えてSEだけ鳴るという仕組みが入っており,後ろでどのような音楽が流れていてもSEが聞き取れるようにしたかったのです.

どちらもアイデアは悪くなかったと思うんですよ.私自身の作曲&音色作りのスキルが乏しいという根本的な問題を除けば.

* * *

ついでにゲーム開始前のUIまわりも少しだけ変更しました.

……のですが,スクリーンショットをアップロードしようかと思いましたが,よくよく見てみると未調整な部分が結構多い事に気付いたので保留にしておきます.

Published in 反撃BLOCKS 活動記録

Comments are closed.