第7回 GBA汎用BGM(MIDI)移植方法 その1 | レトロゲームの改造ブログ

レトロゲームの改造ブログ

メガドライブ、スーパーファミコン、ゲームボーイアドバンス、ワンダースワン等、レトロゲームの簡単な改造講座、改造パッチ等がメインのサイトです。色々なゲームのバイナリエディタを使ったはじめの取っ掛かりのタメの改造方法を記事にしていきます。2014/10/24日設立だよ

烈火の剣IFの作者さんが最初に方法を確立させた、かどうかは知らないけど
「sappyで読み込めるGBAソフトなら全てに適応できるBGM移植改造方法」
ポケモンだろうがファイアーエムブレムだろうがFFだろうがなんだろうが対応可能

資料があれば大抵の人が出来るだろうけど、補足とか入れながら実際にやってみようね

まずは移植するMIDI!
確かに汎用性が高いけど、MIDIがなければ移植出来ないw
カービィの狂花水月とか移植したかったけど、MIDIがない、誰がおせーてwww
で、さらに曲自体もパートが多すぎるとアカン
サンプルはFF13の閃光とか、東方ライブアライブの曲とか嵐の海戦とか色々なやんだ結果
とりあえずアークザラット2の戦闘曲になりました
移植したくて移植しやすいmidiが見つからなかったww
このサイト の一番上のmidiをダウンロードてみよう

お次はファイアーエムブレム烈火の剣IFのromね
攻略wiki からパッチをダウンロード
低速ダウンロード(真ん中or右下)→秒数待ち→左上の認証入力でok

最終的にこのゲームから楽器データを移植するんだけど
テスト段階ではこのゲームを使ってチェックしますw
セーブデータもついてるし、楽器データもポインタ変更済みと色々便利
テストするだけなのでこのゲーム自体をプレイする必要はなし(超凄いパッチだけどなww)
普通はまずは楽器移植後、音楽移植に入るんだけど
色々頑張って楽器移植して結局音楽移植まで進めない、となるとやる気でないと思うのでね
まずは音楽移植っていうのは簡単に出来る、というのを体感するのが一番大事!

後は各自でそろえましょう
sappy12 mod(音楽移植用) ここ とかかな?
Midi2GBA(MIDI変換用)
みーメロエディター(シーケンサ、midi調整用) フリー版で大丈夫です こっち とか

とりあえずこれだけは必須で使う、あとは必要になった時に書くよん

ざっと手順を書くと(何回か繰り返して再現度を上げる必要はある)
①烈火の剣IFに添付されているセーブデータを適応してサウンドルームを開放する

②移植用のmidiをみーメロエディターで開いて編集する

③編集が終わったらmidiをMidi2GBAにドロップしてsファイルを作る

④sファイルをメモ帳で編集する

⑤sappyで烈火の剣IFを読み込み、移植する

⑥完成したらループ処理をして移植する音楽が終了

⑦移植するゲームを32MBにrom拡張する、今回はポケモンファイアレッドでやります

⑧烈火の剣IFから楽器データをファイアレッドに移植する

⑨ファイアレッドに完成した曲を移植して終了


①烈火の剣IFに添付されているセーブデータを適応してサウンドルームを開放する
烈火の剣IFのromとセーブデータの名前を同じにして、同じフォルダに入れる、終了

一度、烈火IFをsappyで読み込んでみよう

ざっとしか確認してないけど
曲は1~1??、670付近、770付近、859までバラバラに入ってるね
注目してほしいのは曲のパート数、上の画像だと6個、6個の楽器ね
一番上のパートでC#4、G#4となってるのが一番上のパートで二つの音がなっているという認識
GBAFEは6パート、1パートで三つの音までが安定、それ以上は怪しいらしい(IF資料より)
実際にやってみれば分かるんだけどそれ以上にすると
確かにGBAFEだと音が抜ける事が多くなるんだよー
これはFEの特徴であって、他のGBAのROMだったら違うからね
移植したいゲームはどのくらいまでパート数があるか、
一つのパートで複数の音が鳴るか、ちゃんと調べると良いと思う
ファイアレッドはパート10までは可、1パートで複数の音を出すのは苦手みたいかなー
でも出来ないわけではなさそうだし、普通に行こう

②アークザラットのmidiをみーメロエディターで開いて編集する
まず一番最初に確認するのは、パート数、今回は全部で22パート

FEだと6パート程度、ファイアレッドだと10パート程度
22パートなんて、まぁ、無理、移植しても半分以上音が消えるねw
だからこのままやる海外パッチの音楽移植って大抵音が消えてるからしょっぼいんだよね
さて日本人の技術力を見せ付けてやる時だ!

いらないパート数の複合化(IFの人は圧縮と表現してる)
全パートの音量を全て30する


終わったら名前をつけて保存(MIDI フォーマット0(*.mid)を選択する)
ファイル名は何でも良いと思うけど1とか数字にした方がいい?
(IFの人も数字でやってたので何か意味があるのかも)


保存したファイルをもう一度読み込むとパートが12になっている

これで複合化終了
このみーメロエディターって自動複合化機能が備わってるみたいなんだよねw
だから全く同じ音で、音量と楽器が違うだけのパートとかを削除するし
同じ楽器だと複合化できるところを勝手に複合してくれる、超便利シーケンサなわけよww
(他にもこういうシーケンサはあると思います、もっと高性能なのがあったら教えてw)

多分、IFの人はマニュアルで圧縮してるんだと思うけど、
一般人にマニュアルで圧縮なんて出来るわけねーだろ?
当然マニュアルでやった方がクオリティが高いんだけど、自動でやってもかなり高いレベルにはなるしw
てか出来ないからしょーがないw

お次は楽器選択だねー、とりあえず書くとおりにやって(ここは結構自由かもね)
ジャズギター、フレットベースは0番(ピアノ)
スクエアウェーブはオルガン系(19番)
ストリングスはそのまま
ドラムもそのまま
スクエアウェーブは4パートあるのでチャーチオルガンを2つ
リードオルガルを2つにする

終わったら再び上書き保存、タイプはさっきと同じMIDI フォーマット0(*.mid)
というかこのエディターで保存する時は常にMIDI フォーマット0(*.mid)で保存する事
これ以外は使わない

保存したmidiをMidi2GBAのフォルダ内に移す
その後、mid2agb.exeにドロップしてsファイルを作る、矢印消えてるけど、ドラッグしてます



1,sファイルが作成される、今度はこれをメモ帳で開く



Track 1のVOICEを0から6にする(6は単音系の楽器)



Track 2のVOICEを19から13に変える(13はオルガン系)



Track 3のVOICEを20から13に変える(13はオルガン系)


Track 4のVOICEを48から2に変える(2はストリングス系)


Track 5のVOICEを0から127に変える(127はドラムセット)


ここで終了、ひとまず上書き保存
今度はsappyで烈火の剣IFのromを読み込み、31番にあわせる
31番は通常戦闘BGM、サウンドルームの09番


Assemble songを選択


s,fileは先ほど編集が終わったファイル
Base offsetは移植場所0x1000000以降ならok(チェック用なのでバグらなければ何処でも良し)
不安なら画面通り0x1400000に移植すればいい
voice groupは0x1d59924(これが烈火の剣IFで使われている楽器セット)
入力が終わったらCook it


ここでエラーが起こる事もあるらしい、私はならなかったので分かりません


はいをクリックして、移植されているか確認
sappyでちゃんと鳴っていてもエミュでは駄目な事もあるので、ちゃんとVBAで確認する事


この記事通りにやってればちゃんと鳴るはず…え、鳴ったよね?
ちなみに冒頭部分が長いので最初のW96をW6にすると良い、全バート分ね


あとはループ処理で曲自体は完成
ループ処理はこっち のサイトを見れば出来るはず

今日はここまでーといっても
あとはROM拡張して、楽器移植して、もう一度sappyで移植するだけなんだけどねw

そしてほとんどIF資料に書かれている事をそのままやってるだけというww

追記
ループ処理に関して、ポケモンのサイトに丸投げしてましたね
いや、やり方としてはあのサイト見た方が早いと思うのですが、丸投げしたのには理由がありまして
まぁ、つまり上手くできなかったんですなw
ループ自体はするのですが、綺麗なループとは言いがたい
音楽の終わりで突然、最初から再生される感じなんですよー

烈火IFをやってる時も思ったんですが、唐突な音楽の切れ目にとても違和感を感じるんですよ
あの改造はほとんどが綺麗にループされているからこそ、
数曲の美しくないループが目立ってしまったのかも知れませんが
自分で移植してみて、このループが出来ないと結構萎えます、低クオリティですw
やはりこういう所まで作りこまないと、良い物は出来ないと、そう私は考えますね

で、色々やってみたんですが、上手くいかない
果てはIFの作者さんが配布してくれた200曲近いsファイルを一個ずつ調べてみた次第
こういう時、やはり膨大な情報を提供してくれた人は偉大だと感じますな

綺麗にループしてる時の共通点みたいな物は分かったような気がしますので
今回のアークザラットのsファイルでちょっとやってみます

トラック1の末尾はこうなってると思います

@ 080 ----------------------------------------
.byte PATT
.word 1_1_040
@ 081 ----------------------------------------
.byte PATT
.word 1_1_001
@ 082 ----------------------------------------
.byte PATT
.word 1_1_002
@ 083 ----------------------------------------
.byte PATT
.word 1_1_003
@ 084 ----------------------------------------
.byte N12 , Gn0 , v112
.byte W12
.byte An0
.byte W12
.byte Dn1
.byte W12
.byte Cn1
.byte N03 , Dn1 , v100
.byte W54
.byte FINE

で、次にループ処理を加えるときに、下のように記述するようです

@ 080 ----------------------------------------
.byte PATT
.word 1_1_040
@ 081 ----------------------------------------
.byte PATT
.word 1_1_001
@ 082 ----------------------------------------
.byte PATT
.word 1_1_002
@ 083 ----------------------------------------
.byte PATT
.word 1_1_003
@ 084 ----------------------------------------
.byte GOTO
.word 1_1_loop
@ 085 ----------------------------------------
.byte FINE

084の部分を全部削除
重要なのは上の083、PATTっていうのは多分、繰り返し命令?
003をそっくり再生する、というような命令なんですかね、多分
だからループ開始地点は004の冒頭にする、というような感じになってるのかな~?
ループの開始地点は下のようにする

.byte En0
.byte N03 , Dn1 , v100
.byte W12
.byte N12 , An0 , v112
.byte W12
.byte Gn0
.byte W12
.byte An0
.byte N03 , Dn1 , v100
.byte W12
.byte PEND
@ 004 ----------------------------------------
1_1_004:
1_1_loop:
.byte N12 , Gn0 , v112
.byte W12
.byte An0
.byte W12
.byte Dn1
.byte W12
.byte Cn1
.byte N03 , Dn1 , v100
.byte W12
.byte N12 , An0 , v112
.byte W12

こうすると003まで繰り返し再生された後に004から再生されるから
全く違和感なくループ処理が完成する、と思われます
あとは全部のトラックで084を削除してループ開始地点を004にする
これだと凄く理にかなったやり方ですね、無理やり割り込むのではなく
自然と再生される次の部分に開始点を持ってきてるので

あ、ちなみにsファイル編集中もページアップ、ダウンボタンは便利ですよ!

つまりsファイルのトラック末尾にあるPATT

.byte PATT
.word 1_1_003(ここの数の次にループ開始点を入れる)

ただしどのトラックの末尾を使うかは、編集者によりけり?
PATTによる分かりやすい開始点が見つけれられない場合も、多数あり

この説明で分かりますかね??
どう伝えればいいか、分からないw
今回のsファイルはかなり分かりやすいタイプだったんだと思いますがー
後は作戦名、みんな頑張れでw
ゆーてもrom改造の記事ってあんまり読まれてないんだけどね

しかし面倒くさいやり方ですな
やっぱり綺麗に高クオリティを目指すって事は2手間、3手間かけなきゃ駄目なんでしょうね