GBAで鳴らすMIDI

GBA用にMIDIを変換する作業のご紹介です。
例によってGBAFEですが、これも他のGBA作品に応用できるかと思います。

楽器セット導入

MIDIを鳴らす第一の壁は楽器セットです。
普通のGBAゲームでも、楽器IDがMIDI汎用のIDと比べてちぐはぐで苦労します。ですが、中にはさらに変態的な楽器セット管理がされてるゲームがありまして、FEは後者に分類されます。なのでBGMに関しては長らく暗黒時代でした。

Native Instrument Map

最もオススメ
この方法は、自由気ままに散らばった楽器指定を、汎用的な並びに整頓するものです。
簡単にFE本来の良質な音源を使えますが、欠点は無い楽器は無いままなので、使うなら他のGBAゲームからインポートする必要があることです。
とはいえ、だいたい必要なものの9割くらいはあります。尺八とか無くても誰も気にしないでしょう?デフォルトだとピアノが音質が悪すぎたり等の欠点はありますが。

Native Instrument Mapをダウンロードして空き領域に貼り付けるだけです。簡単!
(http://feuniverse.us/t/native-instrument-map/69)

問題は日本語版とは楽器が存在するアドレスが違うってところですね。とはいえ、楽器の相対的な位置関係は(少なくとも聖魔は)海外も国内も同じである模様なので、アドレスに+する(もしくはマイナス)する分が判明すれば、すべてのアドレスを計算して変えれば日本語用に出来ます。
聖魔<-$10350>烈火<+$4D1F0>ともに日本版FE向けにNI Mapを移植済みです。


例:聖魔の海外版Native Instrument Map
00 3C 00 00 B8 2A 51 08 FF FA 00 CC ;;0x00(楽器のID)
00 3C 00 00 68 80 2A 08 FF FA 00 CC ;;0x01
00 3C 00 00 8C 91 29 08 FF F9 00 A5 ;;0x02
01 3C 00 00 02 00 00 00 00 00 0F 00 ;;0x03(無指定)
00 3C 00 00 F4 B7 2B 08 FF FD 00 CC ;;0x04
01 3C 00 00 02 00 00 00 00 00 0F 00 ;;0x05
00 3C 00 00 24 F5 28 08 FF F9 00 A5 ;;0x06
01 3C 00 00 02 00 00 00 00 00 0F 00 ;;0x07(無指定)
(以下略)

見ての通り、足りない楽器(無指定)があります。聖魔にチューバがないとか、両方ともオーケストラヒットが無いとかが問題になりがちです。
その場合は楽器の移植が必要です。移植をやってみた記事はコチラです。いつかためしてみるのも良いでしょう。

さて、空き領域にNative Instrument Mapを貼り付けたらそのアドレスを覚えておきましょう。後々Voiceでそのアドレスを指定します。

All-Instrument Hack

この方法は、もう面倒なので全部揃えた楽器セットを最初から用意しようという試みです。
Sappyで開けるGBAゲーム全般で通用する汎用性ですが、音質の保証はできかねます。

使うもの
・NUPS
(http://www.romhacking.net/utilities/606/)
・All-Instrument Hack
(http://www.feshrine.net/hacking/projects/soc-fe7instrumenthack.php)
・バイナリエディタ

さて楽器セットはパッチ形式で配布されています。
upsなので、普通は海外ロムだけにしかあてられないパッチですが、NUPSは整合性を無視してパッチするオプションがあったので、利用します。
これで日本版にもあてられます。

……というか、整合性を無視する上、楽器セットのみを取り出すので、日本版、むしろFEのロムに当てる必要すらありません。烈火用・聖魔用、どっちのパッチでも関係ありませんし。
が、一応、日本版FEにパッチします。

・「Ignore」を選択して下さい
dtihbf
このパッチをあてると、ロムが起動不能になります。
ではその壊れたロムをバイナリエディタで開きましょう。

・「1000000」以降が拡張されています
tunkf
パッチをダウンロードした所の説明に書いてある通り。

Changes:
Begins: 0x11C3AC0
Instrument map: 0x12F471C
Ends: 0x12FC830

必要なデータは「0x11C3AC0~0x12FC830」に存在します。
このデータを自分の改造ロムに、アドレスを一切変えずにコピーして貼り付けましょう。

公式Q「その部分の空き領域を既に利用してしまってるのですが」
公式A「なんとかして空けて下さい。楽器セットを移す方が面倒です」

さて、これだけで汎用楽器セットが利用可能になりました。
なお、利用する場合は制作者の「Blazer氏」のCreditを入れましょう。ダウンロードしたページにそう書いてあります。

烈火if方式

烈火ifは、「SDガンダム Gジェネレーション ADVANCE」の楽器セットをまるまる持ってきてその音源を利用するという方式をとっています。
今更あえてその楽器セットを利用する必要は無いですが、if氏が残した大量のsファイルを使えるという利点があります。その点に魅力を感じる場合は、移植をしておいて損はないでしょう。

同時発音数の拡張

Agro氏による12音まで同時に音を鳴らせる改造を行います。何もしなければ6音までしか鳴りませんが、6音は非常に厳しい制限であるので、ほぼ必須の改造です。
烈火・聖魔、ともに日本版に移植してみたので、どうぞ。封印はややめんどくさそうですね…

MIDIの変換

変換はとても簡単。「Midi2GBA」を解凍し、中の「mid2agb.exe」に調整したMIDIファイルをドラッグアンドドロップすれば変換終了です。送るメニューに入れておけば右クリックからも変換できます。
この時のファイル名次第で、Sappyが読み込むときにエラーを吐く可能性があります。ハイフンとか使うとかなりヤバイ気がします。Sappyがうまく動かなかったら、この部分も疑って下さい。

さて、変換できましたか?変換した.Sファイルはただのテキストファイルです。好きなテキストエディタで開けばいいのですが、流石に標準のメモ帳で開くのは止めましょう。
試聴してみて、音量を変えたい・音色を変えたいと感じた場合、その程度ならSファイルの書き換えだけで済みます。ほとんどはSファイルの編集だけで良く、どうしても無理ならMIDI編集を行います。

だいたいのMIDIはこの変換だけで(音量以外は)素直に鳴りますが、ドラムの音色指定だけはほぼ確実におかしくなります。
 GBAFEの楽器セットではドラムは「127」です。MIDIは「0」となってます。ここだけは書き換えないと全然違う音が鳴ります。唯一絶対に書き換えが必要な箇所です。何故こんな仕様なのかというと、他のGBAでは0がドラムになっているパターンが多いからです。

ドラムはCh.10なので、たぶん下から探した方が速いです。
・Voice「0」になってます。「127」に変えて下さい
tfbkfgvv

テスト視聴

さて、あとはこのファイルをロムに挿入するだけです。
使うものは「Sappy 2006 mod」です。

まずはテストをしなくてはいけませんので、テスト用の生け贄ロム作成し、それをSappyで開きましょう。
生け贄とロムにもちゃんと楽器セットを移植して下さいね。
okrjssfではまず、設定から同時発音数を緩和させてから次へ進みましょう。

開いたら左の方にある「.sをアセンブルする」を選びます。
rdyjvdfyj

なお、Midi2GBAのフォルダにある「MPlayDef.s」というファイルが、挿入しようとしている.Sファイルと同じフォルダ階層に存在しないと、挿入に失敗します。そのファイルだけでいいのでコピーしておきましょう。

.Sファイルはもちろん先ほど変換したものを。
ボイスグループセットは最初に移植した楽器セットのアドレスを指定します。画像はNativeではなくALLの方でやっています(画像が古いので)。
gufkbfgukg
テストなので、これだけで実行しましょう。
 この時点でSappy上での試聴が可能です。Sappy試聴でも十分正確ですので、とりあえずここで調整しましょう。

Sファイル調整

さて、ちゃんと鳴りましたか?

「音が小さすぎ」「うるさすぎ」「なんか思っていた音と違う」
そういう問題は大したことがありません、これから調整していきます。

「音が抜けた」「壊れたような音がなる」「音が歪む」みたいな結果になった場合、これはMIDIを直接編集する必要があります。かなり面倒な作業が必要ですが、どうしても鳴らしたい場合はこのページの最後で紹介しているMIDI調整の工程にすすんで下さい。

では、大した問題ではなかった場合は次に進みましょう。

細かい変更は.Sファイルを開いて書き換えることで出来ます。
でも画面的に見やすいのは圧倒的にMIDIシーケンサーなので、それを併用します。なんでもいいのですが写真は「Domino」を使ってます。

drtvyjkdtj

試聴してみて音量を変えたいと感じたトラックが何番目なのかを、シーケンサーで鳴らしたりして確認します。
では.Sファイルの方を見ましょう。この一番上のチャンネルの音量を変えたいなら

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

から始まっている記述がチャンネル1に関する記述です。
音量を変える場合は

.byte VOL , 100*fe4_player03_mvl/mxv

という風になっている部分を探しましょう。この100の部分が音量ですから、その時々で変わります。
Voiceが使う楽器を示していますので、それも探すときの参考になるでしょう。

さて、音量調整です。色々と試してみてください。冒頭だけ大きく、なんて調整もいいかもしれませんね。

音量の基準は「40」くらい?と思いますが、30でも十分目立つ楽器や、127(最大)でようやくまともな音量だったりで、まちまちです、楽器セットによりますしね。ちなみにNI_Mapならば、間違いなくトランペットが弱いので、使っているようなら音量を上げておきましょう。その他、色々と納得のいくまで調整します。

さてSappyでだいたいOKだと思ったら、次はエミュレータを起動してサウンドルームで試聴を行いましょう。以下にサウンドルームを(半端に)解放する改造を載せたのでテスト用にどうぞ。

・SoundRoom解放?
000a6d96:03 0D > 00 00
000a6d9a:20 > 02
000abda0:0B > FF

(http://feuniverse.us/t/fe7-unlocking-the-sound-room-by-default/37)

聖魔はわたしが勝手に探しました。

・サウンドルーム全開
B3A00:C0 46

なお、これだけだとランダム再生にしたときにフリーズする可能性があります

サウンドルームで鳴らせば他の曲と音量が比較できるから良いですね。MIDIで移植した曲は高確率で音量が大きすぎなので。
そうでも無かったのなら構いませんが、爆音だった場合は全体の音量をまず落としましょう。

sファイルを開いた時のほぼ先頭あたりに

_mvl, 127

みたいな命令があると思いますが、これが曲の全体的な音量の命令です。適当に下げて下さい。そして、他の曲と同じくらいの音量にしていきます。
 
 
音量の他にも、エミュレータでの試聴は、フレームスキップを駆使すればSappyではおろそかになりがちな後半の部分のチェックが楽というメリットがあります。Sappyだけの試聴だと後半の調整が甘くなりがちなんですよね。

さて試聴結果はOKでしょうか。でもサウンドルームでのテストだけで満足してはいけません。最終的には、戦闘BGMなら戦闘中に、マップBGMならマップでテストしないとダメです。ここで聞いてみて大丈夫そうなら、今度は実際に鳴らす場面で視聴しましょう。マップBGMならアニメオフ戦闘中でも鳴るか?などを確かめたいです。

そして、これでOKだ!!!と思ったなら、仕上げに.Sファイルにループ処理などを加え、テスト用じゃない自分の改造ロムに書き込み…という案配ですね。

Sファイルに追加

変換した.sファイルを書き換えてループをさせます。なお、MIDI自体にはループさせる機構は備わっていません。今までの行程は粗に目を瞑ればmidi上で済ますことも可能でしたが、ループが必要なので結局.sファイルの編集は必須になります。(戦闘BGMなら別にループしなくてもいいと思いますけれど)

ここではKaway氏の「LoopMaker」とかいうループ挿入支援ソフトを使いましょう。
「loopmaker ポケモン」でググれば出ます。VB6SP6ランタイムはビクターから落とした物を使うのが確実です。
rytjvdhr

ループさせる地点は「Domino」か何かで確認しましょう。
調整の済ませた.sファイルを読み込ませ、今回の曲なら、「トラック3の最初から、トラック35の最初まで」とすれば良いはずです。

あとはループ作成を押せば全自動です。

それと…最後にMIDIによっては曲の始まりにウェイト命令を置く必要もあります。
いきなり始まっている曲だと、曲の先頭がうまく鳴らなくなったりする兼ね合いです。
という訳で、自分のMIDIがいきなり始まっている曲だと思ったなら、ウェイト命令も追加していきましょう。if氏によると、6~12が適当だそうです。

.byte W06

こんな命令です。
以下、使用例


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

fe4_player03_1:
.byte KEYSH , fe4_player03_key+0
.byte W06
@ 000 ----------------------------------------

全部のチャンネルに挿入しないといけません。そこそこ大変。

さあ、これでほぼ終わったようなものです。

Sファイル挿入

挿入はさっきのSappyと同じ要領です。今度は曲リストのあいているところに挿入しましょう。

「書き込みオフセット」には、今度はしっかりと空き領域を指定します。
tdukvcdjyr
曲グループは、マップBGMに使うのならば、「1」「1」にします。…説明を読むとその筈ですが、わたしがやったところ、何を入力しようが変わってくれません。バグなんでしょうか?
仕方が無いので、構造体などでこの後自分で書き換えます。つまりゼロのままでもOKです。

さて、これでMIDIの移植完了です! おつかれさまでした。
 
 
 
で、ようやくNI_Mapを使ってくれる作品が出てきたのでその動画を紹介しておきます。こういうのは数をこなせば上手くなる作業だと思いますし、移植した私本人よりよほど数をこなしていますから
YouTube

補足 MIDIの調整

残念ながらGBAFEの限界を突破してしまっていたMIDIの場合、MIDIの調整が必要です。
その限界というのはゲームソフトによってかなり異なります。ここではGBAFEの限界について紹介します。
なお、以下の記述は古いので、6音以下に収める作業を行っています。

MIDI調整のルール(GBAFE)

MIDIはそのままではまず鳴りません。大抵はGBAの限界を超えたものだからです。
GBAはGBAでもゲームによってどれくらい余裕があるかはまちまちです。ここではGBAFEのMIDI調整のルール(予想込み)を列挙します。

使える楽器の限界

使える楽器…というか使えるチャンネル数の限界です。if氏によると6チャンネルが安定。限界は7チャンネルだそうです。他の音楽を見ても6に納めてあるので、可能なら6にするのが良いです。
また、楽器数につき使えるパートは3パートが限度らしいです。和音は3までということになります。
MIDIやGBAは、途中で音色を変更する事が可能なので、その気になればあってないような制限です。もちろん、相当に手間なのは確実でしょうけれど。

同時に鳴る音数の限界

これを突破すると音が抜けます。ユニットの足音や戦闘の効果音なども頭数に含まれます。なのでオープニングなど、その他の音と重ならないBGMだと、1つ多く音が鳴らせます。抜けるのは高いチャンネルID(基本的にドラム)からです。
普通にやると、確実に鳴るのは「6」までです。「7」が実に微妙。同時にバッと鳴らす場合は効果音に消されますが、伸びている音に重ねる場合ならセーフ?使い方次第ですね。「8」は鳴る方がレアです。「9」は鳴りません。

数ある制限の中で、間違いなくこの制限が一番の大敵でしょう。
サビなどで、一斉に鳴ったときに抜けるケースは、抜ける部分の目立たない音を抜いて下さい。

同時に鳴る音量の限界

突破するとブツブツというノイズが鳴るので分かりやすいです。音割れですね。そもそもそんな場合、他のBGMと比べてかなりうるさくなっている筈なので、限界というより警告みたいなものです。音量を落として下さい。

GBA負荷の限界

激しい音楽を移植してたらビープ音みたいな音が鳴ってしまいました。
色々と試した結果、立て続けに3連譜を使っていたのが原因だった模様です。
他にもそんなケースはあると思います。激しい譜面は一部を休符にするしかありません。

シーケンサーでの調整

使うもの

・MIDIシーケンサー
み~メロエディター
Domino

・Midi2GBA
・Sappy 2006 mod 17.1(Verは新しい物を)


今回はVGMusicからいただいた「Player Phase 01」を調整します。
実に重厚感が出ています。素晴らしいデキのMIDIですね。
そして、そういうものに限ってだいたい調整作業は手間がかかるものです。

まず使うのはまず「み~メロエディター」です。
「み~メロエディター」でMIDIを開いて下さい。そして即上書き保存して終了します。
端から見たら意味の分からない行為ですね。

では何が変わったかを見て貰いましょう。

・Before
aeyhvdtsc
・After
gyukfbv
(なお、この画面へは「Tabキー」で切り替わります)

…とまあこんな感じです。何が良いかというと、和音をすべて別々のトラックにしてくれるのです。
あの重厚感溢れる音をはがして貰ったのです。これをやってくれるツールが全然見つからなかった。保存だけなら試用期間が過ぎても使えるようですし、完璧ですよ。

すでに触れた通り、GBAFEは和音含めて6音が同時発声の限界です。和音でまとまったままだと数の判別も、削除も、全然捗らなくて参っていました。

ではまず一番上の「PortA Ch.01」を削除して下さい。これは毎回出てくるゴミのようなものです。これを消したらいよいよ本当の調整作業に入ります。

ここからはすでに列挙したルールに則って削除していくだけです。ここからは個人のセンスが重要になっちゃいますが…まぁ一緒にやっていきましょうか。

まずはパート上限を考えると、チャンネルの3と4がオーバーしてます。
さて悩みどころ…となるところですが、悩む前に全体を眺めましょう。3も4も、明らかに一番下のパートはおまけみたいな存在です。こういうのは真っ先に消します。
tudbyhfv
30-31が唯一の出番。

では本題です。小節6-7を見て下さい。9音鳴ってます。まず間違いなく音が抜けるでしょうね。何かを削らなくてはいけません。

左の方を見ましょう。
各チャンネルにスピーカーがついてますね。右クリックしたり左クリックすれば、ソロ・2パートのみ、などで鳴らせます。これを使って何度か試して、一番不要そうなチャンネルを削除する、というのが今からやる作業です。「一番不要そうな」は普通に主観なので個人のセンスですね。

さて鳴っているのは主旋律の「トランペット2和音」、バックで重厚感を醸している「ストリングス四重奏」、それを迫力を加えてさらに際立たせている「ドラム」と「ティンパニ」ですね。…あと「ベース」。

わたしは惜しみなく「Ch.05」のベースを消します。そもそもFEのBGMにベースって。不要な気がするのでチャンネルごと消します。


これで「8」になりました。理論上、ドラムが抜けますね。最低でも「7」に抑えなくてはいけません。
和音である主旋律のトランペットかストリングスにひとつ抜けてもらう事にしましょう。どちらを消すのか、これは好みの問題になります。わたしはバックのストリングスが好みなのでCh.2のトランペットの音譜を減らします。音が重なる部分では鳴らないようにしましょう。

・歯抜けのCh.2
hik,jnmhnjm

よく見ると、Ch.2はCh.1の2番目と合同させても問題なさそうですね。どちらもトランペットですし。ついでにしておきましょう。
該当箇所をコピペしてCh.2を削除すればOKです。


さてこれが終わったらお次は「ストリングスx10」への対処ですね。鳴るわけがない。しかもティンパニとドラムも前半にちょっと被ってますね。一二音同時です。

これはどうしようもないですね。「ストリングス七重奏」に減ってもらうしかありません。
どれを削るかやはり悩ましい。
yudjbcf
しかしよく確認すると、高音のストリングス六音はほとんど被っており、実際には三音みたいなものです。

対して低音の方はきれいな和音です。
tdukibhfb
これは高音の方に退場して貰うのが筋ですね。
Ch.4は丸ごと退場してもらいましょうか。その代わりにCh.3の音量を上げるってことにしましょう。

最初の部分で打楽器と被っている部分は、低音の方に一次的に抜けて貰いましょう。

さて! あとは繰り返しになっているようなので、実質的にこれで調整完了です。
結構、楽な方でしたね。まぁ短いからなんですけれど。誤魔化し誤魔化しやればある程度は収まるのが分かりましたか?

それじゃあMIDI出力をします。「SMF書き出し」を行いましょう。
tdi7ftb
「format 0」を選択すれば、分離した和音を再び戻すことができます。ただし大事を取って、両方のformatで書き出しを行っておいた方が後悔しないと思います。

これで、同時発音数の削減についての作業を終わります。

コメントを残す

メールアドレスが公開されることはありません。