ファミコン開発:PAL対応(音楽)

PAL対応するにあたってのメモ書きです。NTSCは60フレーム/秒ですが、PALだと50フレーム/秒らしいです。調べていくと他にもいろいろなこと書いてあって、何がなんやらサッパリなんですが…。

NESDEV:Cycle reference chart
https://wiki.nesdev.com/w/index.php/Cycle_reference_chart

秒間50回更新ということは、毎フレーム1ドット進むキャラの場合…PALは1秒で50ドット進み、NTSCなら60ドット進む。つまりPALは1.2ドット(120%)進めば、同じ速度となります。

で音楽の場合…今回作ったゲーム(炎のレンジャーマン)はマッパー0で容量も少ないのでサウンドドライバーは最低限の機能しか持っていない。音楽を20%速める機能なんてものはないわけです。なので、データそのものをPALで聞いても問題ないように調整が必要と。

まず、ハイデンさんに書いていただいた曲はテンポ180と150の2種類がある。ここから四分音符の長さを計算するわけですが、テンポ値は1分間の四分音符の数を意味しています。ですので、NTSCなら[60フレーム * 60秒 / tempo]で四分音符の長さがわかります。PALなら[50フレーム * 60秒 / tempo]。各音符の長さは以下の通り

//----------------------------
// NTSC
60フレーム x 60秒 ÷ 180 = 20
60フレーム x 60秒 ÷ 150 = 24
            t180    t150
四分音符     20      24
八分音符     10      12
十六分音符   5       6
三十二分音符 2.5     3

//----------------------------
// PAL
50フレーム x 60秒 ÷ 180 = 16.666...
50フレーム x 60秒 ÷ 150 = 20
            t180    t150
四分音符     16.66.. 20
八分音符     8.88... 10
十六分音符   4.44...  5
三十二分音符 2.22...  2

テンポ180の場合は、PALの方がキレイにまとまってるじゃん。二分音符は33.333ではなくて、内部は整数なので32になる。

今後サウンドドライバーを拡張していきたいけど、いろんなテンポに対応する場合、辻褄を合わせる処理を考えないといけない。上の場合、テンポ180で32分音符32個だと64フレームで、四分音符4個だと80フレームになってしまう。音楽としては等価値なので、32分音符を5つ配置した段階で音符の長さを1フレーム分足すなどの処理が必要なのだろうか? MMLコンパイラ側でその辺の進行具合を管理して、都度差し込むのかな? いろいろと考えるべきことが多い…。

※追記
上のサイトにも書かれてるけど、PALだとスキャンライン数もVBLANKの長さも違うようです。VBLANKが長いのは得した気分ですが、NTSCで動かないのであればどうしようもないですね…。

この記事が気に入ったらサポートをしてみませんか?