【SMW】ガチ素人がミュージックハックに挑戦
やっほー!私です。ReaZ0nです。この度、スーパーマリオワールド(以降SMW)改造未経験の私がミュージックハックに成功しましたので、備忘録として手順を書いていきます。
使ったツール
AddmusicK 1.0.10
.txtファイル(MML?)をROMに適用し、LunarMagicに音楽を読み込ませるファイルを生成してくれます。
LunarExpand 1.20
SMWのROMの容量を増やします。
midi2smw 1.1.0
midiファイルをAddmusicK 1.0.10で読み込める.txtファイル形式に変換してくれます。CLIソフトなので、使い方をしっかり読んでおきましょう。
MML Editing Tool 2013-03-13 08:02:06
メインの機能は使い方がよく分からなかったのですが、SMW音源の確認に重宝します。
SNES SPC700 Player v2.20.1
.spcファイルの再生・保存ができます。AddmusicKと併用。
midiの準備
SMWというか、スーパーファミコンは、最大で8チャンネルまでしか使えない為、打ち込みでかなり気を遣わなければいけません。もっと踏み込んだ話をするなら、最大同時発音が8音なので、音の重ね過ぎにも注意が必要です。(参考)
例えば、上の画像の様なトラックの場合、上の音と下の音にそれぞれ1チャンネルが割り当てられるため、チャンネル数に余裕が無い場合、切り捨てることを視野に入れる必要がります。
また、ドラムセットなどは存在しておらず、キックやハイハット、スネアなどを別々のチャンネルとして割り当てる必要があります。これにより、切り捨てないのであれば大抵2~5チャンネルを持っていかれます。
今回編曲したmidiは、上の画像のようなトラックになっているため、切り捨てないのであればチャンネルを5つ消費します。
ということで、こちらが今から上記の処理を行うmidiファイルです。
後からチャンネル数を減らすことを考慮し、なるべく少ないトラック数に抑えました。(それでも10トラックですが…)。
原曲は『東方神霊廟 ~ Ten Desires.』より『古きユアンシェン』です。
ベースにしたmidiファイルはこちらです。
移植作業
今回は、.txtを作成→ROMに書き込む準備→ROMに書き込む という順番でやっていきます。
midi2smw
まずはこのツールで、.midiファイルを.txtファイルに変換していきます。CLIソフトですが、毎回コマンドプロンプトを立ち上げ、ディレクトリを移動し、midiファイルのパスに書き換え…
というのが面倒だったので、バッチスクリプトを書きました。テキストファイルに以下のコードをコピーして、.batでも.cmdにでも書き換えて使ってください。
chcp 65001
@echo off
rem usages
echo "sample -> midi2smw_x64.exe <flags> [inputmidi].mid [output].txt"
echo "more options here -> https://github.com/HaydenBL/midi2smw"
echo.
echo Found midi files :
for %%f in (*.mid) do echo %%f
echo.
rem set the midi and output files name
set /P midiS="midiファイルのnameを入力 (拡張子を除く。e.g.->midiname) : "
set /P outputN="outputファイルのnameを入力 (拡張子を除く。e.g.->txtname) : "
rem run
midi2smw_x64.exe -specifyTracks -samples %midiS%.mid %outputN%.txt
pause
見ての通り、かなり醜いコードですが頑張って使ってください。このまま使うと、-specifyTracks と -samplesのフラグが立っているので、配布サイトを頼りに好きなように書き換えてください。-samplesは音源の指定に必須なので、絶対に消さないこと。
てことで実行。
私のバッチスクリプトを使用していれば、このような表示になるはずです。
ソフトと同じフォルダにmidiファイルを配置してください。Found midi files:
の後に変換したいmidiファイルの名前が表示されていればOkです。
また、midiファイル、出力後の.txtファイルの名前には拡張子を含めないでください。
midiファイルが正常に読み込まれれば、このようにトラックの名前と数が表示されます。ここから、音源の設定をしていきます。
MML Editing Tool
名前からして、MMLファイルを編集しそうですが、ここではSMW音源を確認するだけです。起動したら、Toolsタブから(もしくはCtrl+Pで)Sample Player を起動。
これがSample Playerです。各音源名の隣には、音源のIDが振ってあります。これが、AddmusicKに打ち込む値です。クリックすれば音源の音が出ます。
ではIDを打ち込んでいきます。足りない音源は、似た音を探して割り振っていきましょう。
シンバルの音源は、Hard Bass Drumで代用できそうです。この動画ではちゃんとしたシンバルの音がしていますが、どうやってんの。
キックは無くても大丈夫です。これ多方面から怒られそうですが、SMWの場合はスネアの音源が結構低音効いてるので 私 は 切り捨てます。
で、こんな感じになりました。参考程度に。
こんな表示が出てこなかった場合は、-samplesのフラグを立てているか確認してください。
ここで、-specifyTracksのフラグを立てているとこのような表示が出ます。
これは、選んだトラック内の特定の音符を出力ファイルに含めるか、含めないかを手動で設定するためのものです。
必要ないならqキーで帰って、どうぞ。
これは、出力する際に、選択したトラックのどのチャンネルを使用するかを設定するものです。チャンネルについては、midiの準備の章で解説したからいいよね?ちなみに、高い音は0番チャンネル、低い音ほどチャンネルの番号が大きくなっていきます。
間違えて選択してしまった場合は、もう一度選択することでなかったことになります。
当然ですが、8つ以上チャンネルを選択するとエラーになって空の.txtファイルが生成されます。
選び終わり、qでチャンネル選択を終了すると、成功していればこのような表示になります。チャンネルが多かった場合は、専用のメッセージで知らせてくれます。
AddmusicK
先程出力した.txtファイルを読み込みます。
ソフトを立ち上げて、Add new songをクリック。.txtファイルを選択するウィンドウになるので、先程出力したファイルを選択します。このとき、出力したファイルを../AddmusicK_1.0.10/music/[任意のフォルダ名]の中に入れておくと見やすくなるのでおすすめです。ここでは、myMMLsというフォルダに保存しています。
ここで、ファイル名の先頭を半角数字2桁+半角スペースにしておかないとエラーで落ちます。どうやら、ファイルの先頭の文字列をint型として読み込んでいるみたいです。何故?私は今日ミュージックハックをしたばかりなので、よく知りません。
なので、ここではファイル名を41 yuanshen.txtとしています。SMW本家のBGMの番号が40まで使われているので、番号を41にしてみましたが、意味があるのかは知りません。
ROMの準備
ここから、ROMの準備をしていきます。私が使ったのは、USA版SMWv1.0です。バージョンが1.1だと、これ以降の作業ができません。入手経路は教えません。というか、使っている吸出し機がもう売っていないのでリンクを張れません。
Lunar Expand
このソフトで、ROMの容量を1.0MB以上にします。推奨は1.0MBなので、あまり調子に乗って容量を増やし過ぎると痛い目を見るかもしれません。
使い方は単純で、容量を選択した後Apply to ROMをクリックしてROMファイルを選択するだけです。成功してそうなメッセージが出ればOK。(SMW改造wiki@VIPに、成功メッセージをエラーだと思い込んで質問してるアホがいて面白いです。)
AddmusicK
おかえり(ただいま)
ここまできたら、ゴールはすぐそこです。
RUNをクリックして、ROMを選択します。問題が無ければ、このようなメッセージが出ます。
Play this songを押せば、選択したBGMが流れます。
SNES SPC700 Player v2.20.1
うわ、なんか勝手に起動した・・・
これで正常に流れていればOKです。
SAVEを押せば、LTS(なにこれ), WAVファイルとして保存できるので、SMW Centralとかに投稿するなら保存しておきましょう。
ループ設定(追記)
ループの設定はしないつもりだったんですが、テキストファイルの分析をしていたら楽しくなってきてしまったのでついやっちゃいました。
本題のループ記号なんですが、これです。「/」
このスラッシュ記号が、ループの開始地点を意味します。終点の記号は分かりませんでした。一応、調べた記号のメモを張っておきます。
<!-- SMW BGM looping note -->
==Notes==
c, d, e, f, g, a, bXX = 音符(ド,レ,ミ,ファ,ソ,ラ,シ)
rXX = 休符
XXには長さが入る。(Values参照。)
oX = オクターブ
Xにはオクターブが入る。(+1で高さ+12)
==Values==
2 = 2分音符
4 = 4分音符
8 = 8分音符
16 = 16分音符
32 = 32分音符
==Special characters==
X^Y = X+Y
e.g.)r8^32=r40
[X]Y = X*Y
e.g.)[c32r32]2=c32r32c32r32
[[X]]Y = X*Y (上との違いは不明)
/ = a point of start looping
+ = 半音上
e.g.)ド#, レ#
で、これを基にコマンドを手打ちしていきます。MML Editing Toolも使ってみたんですが、使い方がよく分かりませんでした。
打つ
メモ帳でもなんでもいいので、とりあえず.txtを開きましょう。
コマンドがいっぱいで幸せですね。
まずは、ループの開始地点を打ち込みましょう。
ループの開始地点
例を挙げながら解説していきます。これは、主旋律のトラックです。
ループを開始したい場所は、範囲選択(白くなってる所)の端です。なので、白の前と、白の後で休符を分割した後、その隙間にループ記号をいれてやります。
よく分からない?
落書きしてみました。
・ループ前
ループ前には、r1(一分休符)が4つ並んでいるので、r1×4ですね。先程貼ったコマンド表より、r1×4=[[r1]]4となります。ちなみに、何故かは知りませんがr1の乗算"は"、[[r1]]Xの形式で書かれます。一応、それに習って記述しましょう。
・ループ後
ループ後には、r1(一分休符)とr8(八分休符)が隣接しているので、r1+r8ですね。コマンド表より、r1+r8=r1^8です。また、加算の場合、rX^Yの形式はX<Yの大小関係で記述されることが多いです。これは別にどっちでもいいので、完璧を目指すならこのように記述しましょう。
・ループ記号を挿入
では、ループ記号を挿入していきます。
これが、加工前のファイルです。このファイルの場合、今から書き換えていくのは、[[r1]]5r8の部分です。その隣の、o4 e8は、「オクターブ4でE(ミ)の八分音符を鳴らす」というコマンドなので、midiファイルで言うとこの部分のことです。
つまり、書き換える必要はありません。よって、次のように書き換えることができます。
[[r1]]4 / r1^8です。これで開始地点の設定は完了です。
他のトラックも全て同様に設定します。少しでもズレると、少しずつリズムが崩壊していきます。
ループの終了地点
曲の最後で開始地点に戻る場合、終了地点の設定は開始地点よりは難しくありません。
ループの終了地点は、白くなっていない所です。よって、
このように表せます。この場合、終端の休符をr1にしてやればいいということですね。
ファイルを見ると、既にr4が記述されていますが、これは罠ですので削除して、r1に置換します。
これでOKです。
他のトラックも全て同様に設定します。少しでもズレると、ズレたやつに引っ張られて全てのループが破綻します。こっちは分かりやすいので修正が楽ですね。
SPCファイルの保存先(追記)
この記事を書いていたときは、SNES SPC700 PlayerからSPCを保存していたのですが、どうやらAddMusicKでROMに曲を追加する際、SPCファイルも生成されていたみたいです。
保存先はここ。
SCPsという分かりやすい名前のフォルダなのに、どうして気付かなかったんでしょうかね?
終わりに
今回は、SMWの改造を一切齧ったことが無い私が、ミュージックハックに挑戦してみました。意外と簡単にできたというのが感想ですね(作業時間5時間)。ファイルの記号の分析もしてみましたが、まだまだ分からない記号もあってとても興味深いです。
最終的に切り捨てたトラックは以下の通りです。
個人的には、主旋律の前半にフルートとかを使って、後半(サビ)であっと驚かせるような演出をしてみたかったですが、チャンネル数的に厳しかったですね・・・
ではまた。どこかで。!)