Ys2 Eternalの無限ループSMFの解析

(8/19更新: 内容をふまえ、まとめをちょっと修正)

7月6日に日本ファルコムさんから Ys2 Eternalが発売になりました。

ゲームを普通にインストールすると、BGMの音源は (フルインストール時でも)WaveかCD-DAの2つしか選択肢がないのですが、 おまけCD(Ys Special Collection)の中にあるMIDIデータを 更にインストールしてやることで、追加選択肢として SC88 MIDIとSC88Pro MIDIが現れ、MIDIデータを BGMに使うことができるようになります。

で、MIDIファイルそのものを単体再生すると、長ったらしい初期化の後 2回ループしてキメが入って終了、ってな按配なんですが、ゲーム中のBGMとして 使ってみるとちゃんと無限ループします。

# 曲の切り替え時にはやはり長ったらしい初期化が入る & その間ゲームの処理速度が落ちる:-( ようですが・・

これはMIDIファイルに何か細工がしてあるに違いない、ということで、 適当にダンプしたり実験したりしてみました。 もちろん、背景として 「zmc3/z2m3で、 Ys2-Eternal用のMIDIデータ作れないかな?」 という野望がうずいているのは言うまでもありません(^_^;

なお、言うまでもありませんが、 以下の解析・実験はあくまで私が勝手にやっていることであり、 本件に関しファルコムさんに問いあわせるなどといったことのないよう お願いいたします。

まずは確認

とりあえず、短そう & 確認がすぐ可能な曲ということで、 OPEN YOUR HEART (タイトルBGM; c:/falcom/ys2_win/midi/sc88pro/27ysi01p.mid) をダンプしてみました。 (ダンプツールには、 じんべさんsmfcnv.exeを使用しました)

いきなり結論から入ると、次のようになります。

    • フォーマット0, 全音符の分解能=1920 (四分音符換算で480)らしい
    • どーやら、ループ開始が Markerの'A'(FF 06 01 41), ループ終了がMarkerの'B'(FF 06 01 42)らしい

以下参考に、実際にダンプしてみた結果です。

format 0 ntrk 1 timebase 480 track 1 { 0 Sequence/Track-Name(3) 'OPEN YOUR HEART' 0 Text(1) 'SC-88Pro' 0 Meta-event ff 54 60 00 00 00 00 0 Meta-event ff 59 00 00 0 Time-Signature 4/4 0 Tempo 150.00 [BPM] ( 400000 [us/QN]) 0 Exclusive f0 41 10 42 12 00 00 7f 00 01 f7 (roland adr=00007f) 240 Exclusive f0 41 10 42 12 40 01 30 04 0b f7 (roland adr=400130)

(以下初期化コードが続く。中略)

1410 Exclusive f0 41 10 42 12 40 47 22 01 56 f7 (roland adr=404722) 1440 Tempo 60.00 [BPM] ( 1000000 [us/QN]) 1440 Exclusive f0 41 10 42 12 40 48 22 01 55 f7 (roland adr=404822) 1470 Exclusive f0 41 10 42 12 40 4f 22 01 4e f7 (roland adr=404f22) 1500 Exclusive f0 41 10 42 12 40 1f 17 08 00 02 f7 (roland adr=401f17) 1530 Exclusive f0 41 10 42 12 40 12 16 34 64 f7 (roland adr=401216)

1560 ch.1 ResetAllController 1560 ch.3 ResetAllController 1560 ch.4 ResetAllController 1560 ch.7 ResetAllController 1570 ch.3 Bank_MSB 6 1570 ch.7 Bank_MSB 0 1570 ch.4 Bank_MSB 2 1570 ch.1 Bank_MSB 2

(以下初期化コードその2~演奏と続く。中略)

59630 ch.3 NoteOff E5,64 59630 ch.3 NoteOff A5,64

59640 End-Of-Track

実験その1: とりあえずファイルを入れ替えてみる

z2m3はフォーマット1出力専用のツールであり、 現在フォーマット0は出力できません。イマドキ「フォーマット0でないと困る」なんて 環境が存在するとは思えませんし、 それならば「余計な機能」は持たずに、 扱いやすいフォーマット1だけの方がシンプルでよかろう、 という発想からそうなってます。

しかしながら、もしもYs2-Eternalが「フォーマット0しかダメよ」な環境であったなら、 考えを改める必要がありそうです(^^;

というわけで、以下のようなMMLを書いて、 SMF化したもの(四分音符の分解能は48)をYs2-Eternalに食わせてみました。

(t1) cdefgab<c (t2) cceegg<cc

(われながら芸のないMMLだ・・・)

結果は次のようになりました。

    • フォーマット1でもちゃんと再生される
    • 四分音符の分解能が480でなくてもOK
    • なんとこのままでも最初から最後まで無限ループしてしまう

3番目の結果は意外でしたが、 実際に使用する場合、 初期化コードも含めて無限ループされると困ることの方が多いと思いますので、 これはアテにせずに行きましょう。

実験その2: 実際にMarkerを使ってみる

実験その1で得たSMFに、実際にMarker(FF 06)を挿入してみました。 MarkerはConductor Trackには入れず、 trk1, trk2には最初から最後をループ区間とみなして、 最初にFF 06 01 41(A)を、最後にFF 06 01 42(B)を、 それぞれ挿入しました。

結果は次のようになりました。

    • なんと、音が鳴らない

????

実験その3: 1trkだけにMarkerを入れてみる

実験その2で「音が鳴らない」と言う最悪の結果が出てしまいましたが、 アレコレ原因を考えてみると、「元々はフォーマット0だった = Markerは1対でないとダメなんちゃうか??」という仮説が浮かびました。 早速実験です。

実験その2で得たSMFから、trk2のMarker対を削除します。 これでMarkerはtrk1にしか残っていません。

結果は次のようになりました。

    • trk1のみ無限ループする。trk2は1回だけ演奏して終了。

やはり、Markerは1対であることが前提となっているようです。

まとめ

実際にゲーム中の全シーンで確認したわけではありませんが、 以下の手順でデータを作ることができそうです。

    • 普通にMIDIデータを作る。分解能やフォーマットは問わない。
    • ループ開始ポイントに Marker 'A' を、 ループ終了ポイントに Marker 'B' を挿入する。 ただし、複数トラックに挿入してはならない。
    • (8/19追加) このままではMarker挿入トラックしかループしないので、 format0に変換してやる。なお、ちょっと考えれば分かることだが、 Markerは同一tickグループ内で最前列に持ってきてやることを忘れずに。

やっぱformat0にしてやらないとまずそうですね。 ま、format1→0のプログラムはその気になればすぐ書けるので、その内 z2m3に取り込むとしましょう。

蛇足

どうやらWaveデータにもMIDIデータと同様の無限ループ細工が施されて いるようですが、こちらの解析はほかの方にお任せします:-)

# Waveの自作には興味ないので・・・

E-mail:

1560 Marker(6) 'A' (注目)

59640 Marker(6) 'B'