スクリーンショット_2019-01-11_22

戦闘開始の曲を作ったのと SDL_mixer のループポイントについて良い解決方法が見つかったこと ローグライク(仮)

連日体調不良で日記が途絶えてしまった。今月はどうも調子が悪い。引っ越しが控えていることが精神的に影響しているのかもしれない。

ただ今日は調子がよかったので先日作ろうとしていた戦闘開始の曲の下書きのようなものを作ってみた。試しにゲームをプレイしながら再生してみると雰囲気は出ているので、方向性はオッケーだ。ここから仕上げ作業を行わなければならない。曲作りも久しぶりなので訓練もしていかなければ。プロローグやチュートリアルなどのオープニングに関わる他の曲についてもどんどん作っていきたい。

それと SDL の音楽や音声再生の拡張ライブラリである SDL_mixer について、先日は改造して mp3 をループ再生できるようにしたと綴ったが、そのことについてわかったことがあったので書き留めておきたい。

SDL_mixer でループポイントを使用する方法

楽曲におけるループポイントとは、イントロを再生した後にメイン部分をループするためのループの起点となるもの。実は、SDL_mixer は mp3 ではループについて対応していなかったのだが、ソースコードを読むと wav と ogg についてはループポイントを対応していたのだった。

wav のループポイントの設定は Wavosaur というソフトウェアを使うと行えるらしい。しかし macOS 版が提供されていなかったことと、wav のフォーマットとしてループポイントが規定されておらず、拡張フォーマットで対応する形式のようで、そのフォーマットも簡単に調べたが不明だった。

ogg についてもループポイントの設定が行える。これについては ogg のタグを使用したものが SDL_mixer で使える。このページに作り方が載っていたので参考にさせていただいた。

Audacity は macOS 版もあるのでループ設定もでき無事ループ再生された。この ogg のループポイントの設定方法は RPG ツクールの PC 向けエディションで使えるようなのだが SDL_mixer でも使えるようになっていて、ゲームエンジンの事実上の標準(デファクトスタンダード)なタグになっているようだ。

mp3 をやめた理由

mp3 でも改造したことでループができるようになったのだから別に ogg にする必要はないのではないか?という疑問について回答しておく必要がある。

まず1点は SDL_mixer を改造しなくてもよくなる、という点。これは保守性の確保、バージョンの追従などにデメリットがあった。

もう1点は非常に大きな問題だった。mp3 を Audacity という波形エディタ・ビューワで見ると謎の空白が生まれていることに気付いた。Logic Pro X という DAW や Audacity の LAME のどちらの mp3 書き出しでも同様の空白が生まれていた。

この波形は単純な矩形波を0.00秒から鳴らしているだけの wav データを mp3 に変換したあと Audacity でデコードした結果である。この図では約0.05秒まで無音になっている。mp3 の仕様を詳しく調べてはいないのだが、エンコードの過程で無音を追加しているとしか思えない現象が発生している。

これにより次のような問題が発生する。本来の時間よりすべてが 0.05 秒ずれているため、ループポイントの設定も 0.05 秒ずらさなければならない。正しくは 0.05 秒ではなく、この波形の場合は 2,254 samples だ。samples とは波形の分解能単位で、要するに折れ線グラフの点のことだ。この点が 2,254 個分余計に追加されているというわけである。

しかし、他の曲ではこれが 0.05 秒ではなかった。0.024 秒くらいの無音で、先程の半分程度だ。これが意味するのは、mp3 ではループポイントの設定をするときに楽曲の BPM (1分間の拍数)などに基づいてキッチリと samples で指定するためには、波形をよく見る必要があることと、最初に無音が数ミリ秒(が不安定で)できてしまうことを意識しなければならないことの2点だ。楽曲によっては BPM は一定ではないかもしれないのだが、一定であればサンプリングレートからループポイントを算出できるのに、mp3 ではそれができない、非常に厄介な問題を孕んでいるわけだ。

ogg の Verbis というコーデック(エンコーディング・デコーディングの仕組み・アルゴリズム)ではこのような無音が発生しなかった。それにループポイントの設定も上記のように問題なく行えたので、mp3 を使う理由はなくなった。

オープンソースのライセンスのお話

なお込み入った話になるが mp3 のコーデックにはいくつかのライブラリが存在し、そのなかには LGPL という不自由なソフトウェア・ライセンス(コピーレフト)が用いられていることが多く、SDL_mixer の mp3 用のライブラリである libmpg123 もそのひとつだ。LGPL は利用するときに静的リンクをするとゲーム側のソースコードを開示する必要ができてしまったり、動的リンクであれどリバースエンジニアリングを禁止することができなくなってしまう。所謂ライセンス感染と揶揄される問題が発生するのである。ぼくが作っているのは商用ゲームでありオープンソースソフトウェアではないので、このような危険なライセンスを保有したライブラリは使うことができないのだ。その点、ogg ではどのような利用の仕方でも「著作権・ライセンス表示と、利用者に対して無保証であることを明記すること」さえ守ればソースコードを開示・配布する必要がない BSD License のため開発者は安心して利用できるのだ。
ちなみに SDL_mixer は libmpg123 が存在しなければ動的リンクしないためライセンス感染もないし、SDL_mixer や SDL 本体自身のライセンスも zlib License と呼ばれる BSD License と似たものである。その他ぼくが利用しているほとんどのライブラリは MIT License という、BSD/zlib License よりももっと緩いライセンスとなっている。

今日の結論は、SDL でゲーム開発しているなら、SDL_mixer の ogg を使っておけば間違いなし、ということ。

応援してくださると嬉しいです。よろしくお願いいたします!