SSブログ

メイプルのことがんばって更新します。たまに他のことも更新

音楽変更のキワミ ~ポケモンで流れている音楽を変更する~ [ポケモンROM改造]

音楽変更のキワミ ~ポケモンで流れている音楽を変更する~

------------------------------------------------------------------------------------------------------
これは、sappy2006とMidi2gbaを使い、ポケモンで流れている音楽を変更するためのまとめです。

※不具合が起こる可能性もあるので、音楽変更をする前に必ずROMのバックアップをとりましょう。
※本書は音楽変更の基本事項のみ記載しています。もっと専門的な事を知りたい方は、他をあたってください。
音楽変更、ループ設定などの代行は一切行いません。予めご了承ください。 by Ealgrete

------------------------------------------------------------------------------------------------------
目次

基本編
・インストール、設定
・音楽の置き換え方法

知識編
・音色の改善方法
・ゲーム内で流れている途中でおかしくなる事の改善方法
・ループ設定

応用編
・音楽枠追加方法
・追加した枠に音楽を入れる方法

・Q&A
・付録 FRのボイスオフセット一覧、SongTableに並べられているデータについて
・最後に

------------------------------------------------------------------------------------------------------
~基本編~

インストール、設定

音楽変更を行う為に、以下のものが必要になってきます。各自でご用意ください。
・sappy2006
・Midi2gba
・Midi
・ROM(バックアップ必須)
・諦めない心と日本語が理解できる力


sappy2006(以下sappy)を普通にインストールします。
sappyを少し改変しないと日本語ROMは読み込めないので、インストール後にその設定を行います。
(既に設定済みなら、省略してください)

sappyにROMを読み込ませます。
すると「The game you loaded(gamecode ****) is not known.Would you like to scan for the song table now?」
(ソングテーブルを検索するかどうか)アラートが表示されるのでOKをクリック。

しばらくすると検索が終了するので、検索されたオフセット(0x******)を何かにメモしておきます。

その後、いったんsappyを閉じて同フォルダ内にあるsappy.xmlをメモ帳等で開き、xmlを編集します。
その中に自分が読み込ませたいゲームの名前(Pokemon Fire Red等)を検索するなどして見つけ出し、
ヒットした文字列の上の行にある</rom>という部分から</playlist>までコピーし、その下に貼り付けます。
上に戻り、rom codeとsongtableを編集。
(rom codeは語尾の[E]を[J]に変える。songtableは先ほどメモした数字を入力する)
最後にxmlを上書き保存して終了です。

なお、元々sappyのxmlに含まれているデータはルビー、ファイアレッド、エメラルドだけです。
サファイアやリーフグリーンで読み込ませる場合、
サファイアはルビーのデータを、リーフグリーンはファイアレッドのデータをそれぞれ流用してください。

以上の準備ができたら、sappyで音楽を置き換えます。

------------------------------------------------------------------------------------------------------
音楽の置き換え方法

midi2gbaを解凍、その後、置き換えたいMidiファイルをMidi2GBAのフォルダ内に入れてください。
そして、mid2agbという実行ファイルにMidiをD&Dしてください。sファイルが作られます。

sappyでROMを開いた後、左メニューのAssemble songをクリックします。
表示されたダイアログで生成された.sファイルを選択、Base destination offset に
「Location」とある部分のすぐ下にあるオフセット(一番上の)を入力し、
Assemble that ugly thing! を選択してしばらく待つ。

※Base destination offsetに入力するオフセットを空き領域に指定すると、他の曲に影響が及びません。

すると「Done.Do you want to set the proper entry in the Song Table?」
と表示されるので「はい」を選択。以上で終了です。

後は実際にエミュレータで動作確認してみてください。音楽が流れていれば成功です。

------------------------------------------------------------------------------------------------------
~知識編~

音色の改善法

音楽は置き換えられるものの、音色がピコピコになってしまうという場合があります。
これは主人公が壁にぶつかったりすると途切れてしまうので、主旋律がピコピコでは話になりません。
それなら、DominoなどのMidi編集ソフトでMidiを再編集しましょう。
まず、曲をMidiファイルに保存してMidi編集ソフトで開いてください。
各パートが使っている音源がわかるはずです。

そして、実際に置き換える音楽の各パートの楽器をマサラの方で使われている楽器の音色にあわせて変更します。
最後に、編集したMidiをsファイルにして、通常通り置き換えてみてください。
ピコピコ感はなくなり、まともになっているはずです。

補足事項
インポートする際に設定可能なVoicegroupを別のオフセットに変更すると、他の曲の音源を使うことができます。
そうすれば、自由自在に音色を変更する事が可能になります。

(FRのボイスオフセットを付録としてテキストの最下部に記載しています)

------------------------------------------------------------------------------------------------------
ゲーム内で流れている途中でおかしくなる事の改善方法

エミュレータで確認していると、再生途中でフリーズしてしまう場合があります。
これは、Midiの「曲のタイムベース(分解能)の数値が高すぎる」可能性が考えられます。

タイムベースが「480」や「960」だと、
エフェクトが多い部分で処理が追いつかず、フリーズしてしまう場合があります。
Dominoでは、「ファイル」→「曲のプロパティ」でタイムベースの設定がいつでも可能です。

タイムベースの数値を低くしても曲自体の変化はあまりないので、
数値を低くしてからのインポートをオススメします。

------------------------------------------------------------------------------------------------------
ループ設定法

ゲーム内では、音楽は永遠にループしています。しかし、普通に音楽を置き換えてもループはしません。
ループをさせる場合には、sファイルの編集が必要となってきます。
そこで今回オススメするのが、「LoopMaker」というソフト。
Kaway氏が製作したソフトで、その名の通り「ループを作る」ソフトです。
ループの開始地点と終了地点のトラックをそれぞれ指定、[ループ作成]でループを作ることができます。
非常に便利なソフトなので、ぜひ活用してください。

ダウンロードはこちらから↓
ttp://www.sendspace.com/file/60jyon
(広告が出てきますが、気にしないでください)

ちなみに、ループの仕組みはこのようになっています。
まず、sファイルをメモ帳などで開くと以下のような感じになっていると思います。

@**************** Track 1 (Midi-Chn.1) ****************@
ファイル名_3:
.byte KEYSH , ファイル名_key+0
@ 000   ----------------------------------------
.byte TEMPO , 154*ファイル名_tbs/2
.byte W16
.byte VOICE , 1
.byte VOL   , 127*ファイル名_mvl/mxv
.byte PAN   , c_v+0
------------------------------------------------
~~~~~~~~~~~~~~~~~~~~~~~~
------------------------------------------------
@ 030   ----------------------------------------
.byte FINE

@**************** Track 2 (Midi-Chn.2) ****************@

そして、ループさせたい任意の部分に
.byte GOTO
.word ファイル名_トラック番号_loop
という風に記してください。

@**************** Track 1 (Midi-Chn.1) ****************@
ファイル名_3:
.byte KEYSH , ファイル名_key+0
@ 000   ----------------------------------------
.byte TEMPO , 154*ファイル名_tbs/2
.byte W16
.byte VOICE , 1
.byte VOL   , 127*ファイル名_mvl/mxv
.byte PAN   , c_v+0
------------------------------------------------
~~~~~~~~~~~~~~~~~~~~~~~~
------------------------------------------------
@ 030   ----------------------------------------
.byte GOTO
.word ファイル名_1_loop
.byte FINE

@**************** Track 2 (Midi-Chn.2) ****************@

これは「ファイル名_1_loop」という言葉がある場所に行きなさい、という命令スクリプトです。
後は入力した部分から手前のループしたいところ(★とある場所だとする)

@**************** Track 1 (Midi-Chn.1) ****************@
ファイル名_3:
.byte KEYSH , ファイル名_key+0
@ 000   ----------------------------------------

.byte TEMPO , 154*ファイル名_tbs/2
.byte W16
.byte VOICE , 1
.byte VOL   , 127*ファイル名_mvl/mxv
.byte PAN   , c_v+0
------------------------------------------------
~~~~~~~~~~~~~~~~~~~~~~~~
------------------------------------------------
@ 030   ----------------------------------------
.byte GOTO
.word ファイル名_1_loop
.byte FINE

@**************** Track 2 (Midi-Chn.2) ****************@

に、このように↓入力してやってください。

@**************** Track 1 (Midi-Chn.1) ****************@
ファイル名_3:
.byte KEYSH , ファイル名_key+0
@ 000   ----------------------------------------
ファイル名_1_loop:
.byte TEMPO , 154*ファイル名_tbs/2
.byte W16
.byte VOICE , 1
.byte VOL   , 127*ファイル名_mvl/mxv
.byte PAN   , c_v+0
------------------------------------------------
~~~~~~~~~~~~~~~~~~~~~~~~
------------------------------------------------
@ 030   ----------------------------------------
.byte GOTO
.word ファイル名_1_loop
.byte FINE

@**************** Track 2 (Midi-Chn.2) ****************@


これを他のトラックも同様に設定します。
(他のトラックの場合「ファイル名_2・・・」のように変わっていくので注意してください。)

すべてのパートの設定が終わったら、最後にsappyで置き換えて、再生してみましょう。
問題なくループしている事を確認したら、エミュレータでの確認も忘れずに。

※各パートのループ位置を統一しないと、ループした時にパートがバラバラになってしまうので注意。

------------------------------------------------------------------------------------------------------
~応用編~

音楽枠増加方法

※バイナリエディタ必須。

まず、sappy2006でROMを開く。そうしたら、音楽データの先頭オフセットにバイナリで飛ぶ。
そこに目印を付けておいて、そこから「00 00 00 00 00 00 00 00」で検索をする。
ヒットした部分の最後部にも目印を付けておく。
先ほどつけた目印から最後部の目印までのデータをコピーする。
コピーした物を適当な空き領域に貼り付ける。(下に十分余裕がある場所にしてください)
そうして、最初につけた目印のオフセットを逆順で検索。
ヒットした部分を貼り付けたデータの先頭オフセットに変えてやる(複数あるので、全て変えてください)
貼り付けたデータの最後部に32バイト分「00」を追加する。

以上です。

※sappyで読み込む際には、xmlファイルの編集が必要です。

------------------------------------------------------------------------------------------------------
音楽を追加する方法

(上記の枠増加を行っていること前提)
「おしえテレビ」の後ろ部分を選択し、Assemble songやImport tracksで入れてやるだけです。
(ヘッダーなどのオフセットは常に空き領域オフセットを指定してください)

なお、音楽番号は「おしえテレビ」が「5A01」なので、
音楽変更スクリプトなどで追加した音楽は「5B01」以降の音楽番号が自動的に振られます。

------------------------------------------------------------------------------------------------------
Q&A

Q.置き換えようとすると「not found MPlayDef.s」みたいなのが出てきて置き換えられない。
A.sファイルはMidi2GBAのフォルダ内に入れておかなければなりません。(MPlayDef.sがあるため。)
 Midi2GBAのフォルダのショートカットを作っておくと、なにかと便利かも。


Q.音楽をmidiファイルに保存できない。
A.sappy2006ではできないので、Bouche氏が作った「Sappy」(2006とは違います)で保存しましょう。
 ただし、それで保存したmidiがsファイルに変換できない場合があります。
 操作方法などは各自で調べてください。


Q.ちゃんとインポートできたのに、たまに「ブー」という音がなってしまう。
A.鳴らしている音の高さが高すぎるか低すぎるものがあります。
 高い音はC9以上。低い音はC2以下(又はC1以下)にすると、こうなります。
 1オクターブ上げたり下げたりするなどの工夫をしましょう。


Q.sappyでは流れるのに、ゲームでは流れない!
A.次のようにやってみてください。
準備するもの:ゲームでは流れない音楽が含まれているROM(Aとする)
       音楽を変えていないROM(Bとする)

まず、Aをsappyで開き、流れない曲を選択します。そして、左側にあるメニューバーから
Export tracksを選択。1の所はすべてチェックを入れておいて、2のところは『$P』か『$T』のどっちかを入力する、
と書いてあるので、どちらかを入力してそれでOKを押します。
(『$T』だとファイル名がトラックの数字になり、『$P』だとファイル名がそれぞれのトラックの開始地点の
オフセット名になります。)
するとAの入っているフォルダ内に数字のファイル($Tの場合)が生成されたはずです。

次にBをsappyで開き、置き換えたい曲を選択します。そして、今度はImport tracksを選択します。
そして、先ほど生成されたファイルすべてにチェック。(Bの入っているフォルダ内にそれらのファイルを移しましょう)
チェックしたらOKを押す。それで置き換えられるので、最後にはいを選択。以上で完了です。
できたら、エミュで確認してください。今度こそ、きちんと再生されたはずです。


Q.置き換えた曲の次の曲が変になったんだけど・・・。
A.元々あった曲より置き換えた曲のほうが長い場合に起こるようです。
 (パートの数が多いとかでも、おかしくなります)
 どうしても入れたい場合は、空き領域に書き込みましょう。


Q.ループしたら聞き覚えの無い音がした!
A.ループした部分が「音ののばしている部分」だと、誤って再生されてしまいます。
 (これはタイやスラーの部分でも同じ現象が起きるようです)
 sappy2006で再生しても確認できないので、実際のゲームで確かめてください。


Q.音が途中でずれていくんだけど
A.短い音(例えば32分音符とか)を多用すると、ずれてしまう事があるようです。


Q.ドラムが流れない!
A.先述した方法でもダメでしたら、こちらを確認してください。

・ドラムパートの最初にProgram Changeが入っていますか。これが無いと音色を設定していないので、当然流れません。
・他パート数が多すぎると、音が消えてしまうことがあります。
・ピアノ音になる場合は、ドラムのチャンネルを10にしましょう。それで大丈夫だと思います。

 なお、ドラムのどれがちゃんと鳴るかは各自で調べてください。


Q.音楽拡張したら、音が鳴らなくなったんだけど・・・
A.何処かミスがある可能性が高いです。入力ミスがないか確認してください。


Q.エメラルドの音楽をファイアレッドに移せない?
A.先述したExpoet tracksなどを使うやり方で可能です。
 楽器に関する問題は他の方が解析しているので、記載しません。


Q.インポートしたら、インポートした曲又はゲームがおかしくなった。
A.それはインポートした場所がインポートした曲との相性が悪かったからだと思われます。
なので、インポートする際は必ずバックアップを取りましょう、としか言いようがありません。


Q.テキストファイルだけじゃ意味わかんないんだけど?
A.希望があれば、html Document版も作ります。


------------------------------------------------------------------------------------------------------
付録
FRのボイスオフセット

それぞれの音楽で指定されているオフセットで使用できる楽器のまとめ。
これらはいくらでも流用する事ができるので、自由に音源を使うことができます。
数字はMSGS音源参照。

0x44F7F0 047,059,048,057,074,002,014
0x44FCB8 048,061
0x4500B4 049,057,061,002,046,034,081,083,084,05,085,091,048,018
0x4504F8 018,049,061,057,034,048,002
0x45093C 002
0x4545B4 002,003,025
0x454BB4 057,074,015,048
0x4551B4 039,049,015,079,025,018,002,030,057,031
0x4557B4 061,049,048,057,
0x455BEC 022
0x455FD0 002,030,031,039,063
0x4565D0 061,048,049,015,057,059
0x456BD0 049,018,025
0x4571D0 018,025,049,079,021,022,074,002
0x4577D0 081,082
0x457800 022,002,081,057,014,074,049
0x457E00 039,025,018
0x4581F0 002,025,018,049
0x4587F0 018,019,039,002
0x458DF0 025,018,
0x4593F0 014,025,049,002,079
0x4599F0 002,049,025
0x459DE0 040,014,059,049,015
0x45A3E0 074,049,059,047,010,057,048,061,014,015,002
0x45A83C 002,079
0x45AE3C 049,057,048,061
0x45B25C 018,025,061,048,015,049
0x45B85C 049,061,057,048,047,015,074
0x45BE5C 048,059,049,015,061
0x45C2B8 018,048,030,025,049,063,031,006,061,005,015
0x45C8B8 018,030,063,022,061,121,057,049
0x45CEB8 034,025,018,049
0x45D4B8 054,030,005,063,048,025,002,061,032,057,049,031,015
0x45DAB8 006,081,084,025,082,049,036,015,128
0x45E0B8 049,025,036,015,082,081
0x45E4D8 002,059,074,022,015,049,082,081,128,127
0x45EAD8 005,018,082,049,034,015,081,093,032
0x45EF34 002,005,006,074,025,093,082,049,081,128,127
0x45F534 005,025,049,074,006,081,047,093,082,013,018
0x45FB34 018,002,025,076,049,082,001,074
0x460134 082,081,093,036,063,032,049,025,018,128,127
0x460734 018,025,022,081,082,057,085,128,127
0x460D34 049,074,061,081,082,046,057,018
0x461334 057,018,059,036,076,084,081,083,082,128,127,074,048
0x461934 074,057,048,059,083,081,084,082,061,049,046
0x461D24 057,074,061,049,046,091,082,090,085,083,048
0x462168 049,025,074,018,081,188,082,0107,093,128,127
0x462768 081,026,025,002,018,049,084,082,093,128,127
0x462D68 002,083,081,082,031,039,093,128,127
0x4634C4 081,082,088,014,025,061,057,003,006,128,127,047,074,048,059,083
0x463DAC 081,082,025,014,061,057,088,003,006,128,127,047,074,048,059,083
0x4641CC 061,057,088,081,082,003,006,005,128,127,047,074,048,059,083
0x4645EC 002,006,005,128,127,047,081,074,057,048,059,083
0x464BEC 047,081,002,074,057,048,059,083
0x464E20 001,057,059,049,048,082,061,025
0x465240 025,036,001,128,127
0x466848 061,049,002,082,093,081,025,128,127
0x466E48 082,025,018,049,081,093,128,127
0x467448 082,025,049,083,093,001,128,127
0x465C48 088,081,032,034,082,063,108,015,058,128
0x465840 039,081,082,086,032,015
0x466248 002,082,128

若干抜けているものがあるかもしれません。
記載しているものでも正常に流れない可能性があるので、
その辺りは各自で調べてみてください。


SongTableに並べられている音楽(効果音含む)のデータについて

SongTableに並べられているデータは8バイトで一つのデータとなっています。

HH HH HH 08 ** 00 ** 00

HH HH HH:Headerのオフセット。
**
00:通常の音楽
01:技用の効果音
02:マップ上での効果音(マップ切り替えを行わない限り、鳴り続けている)

HH HH HHのオフセット先にあるデータは、こうなっています。

++ 00 -- 00 VV VV VV 08 LF LF LF 08.....

++:不明。技の効果音だと01 普通の効果音だと07 普通の音楽だと05となっている。
--:不明。効果音系は05 BGM系だと00になっている。
VV VV VV:VoiceOffset
LF LF LF:Locationの一番上のパートのデータが格納されているオフセット。
パートの数だけこれは増えていきます。

------------------------------------------------------------------------------------------------------
最後に

最初は自分で何とかしてみようと努力すること。
それと先述しましたが、本書では基本事項しか説明していません。
その他高度な技術については、他の方が執筆されたまとめをご覧ください。

貴方の作品がより良いものになる事を心より祈っております。

------------------------------------------------------------------------------------------------------
by Ealgrete

nice!(0)  トラックバック(0) 
共通テーマ:ゲーム

nice! 0

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。