効果音を出せるようになったので次は音楽です。
SGDKを使って効果音を出してみる方法を調べてみた時に、SGDKで音楽を流すにはVGM形式のファイルがよさそうという結論になりました。また、VGM形式のファイルをXGM形式に変換してXGM Driverで音を出すのがよさそう、というところまでわかりました。
まずは既存のVGMファイルを、VGM形式のままSGDKを使って再生してみます。SGDKのsample/sound/resフォルダに、sonic1.vgmというファイルがありますので、これを再生してみましょう。
リソース定義ファイルの中身はこうしておきます。一行だけ。
vgm sonic "sonic1.vgm"
これを再生するプログラムも曲再生の主要部分は一行だけです。
#include <genesis.h;> #include "resources.h" int main() { SND_startPlay_VGM(sonic); while(1) { VDP_waitVSync(); } return (0); }
SND_startPlay_VGM()でVGM形式のデータを再生するという、これまた簡単な仕組みです。
なんだかVGM形式のままでもよさげですが、XGM形式にするメリットの一つに、ファイルサイズが小さくなるというのがあります。先のsonic1.vgmはファイルサイズが34969Byteで約34KByteですから、1Mbitメガロムカートリッジを使った場合、3,4曲しか入らないことになります。ちょっとビックリ。
VGM形式のファイルをXGM形式に変換するには、SGDKのbinフォルダにあるxgmtool.exeを使います。コマンドラインからファイル名を指定するだけです。
こうして作成されたsonic1.xgmは19961Byteに縮まりました。さっそく再生してみます。
リソース定義はこうなります。
再生するプログラムはSND_startPlay_XGM()を使います。先のプログラムのSND_startPlay_VGM(sonic);をSND_startPlay_XGM(sonic);に変えるだけです。
リソースのコンパイル中にWarning: more then 6 Key off or Key on command in a single frame !と表示されますね。何か曲データに制約があるのかも。
完成したrom.binをメガドラエミュレータに放り込んでみると曲の再生が始まります。
vgm形式のファイルを作る方法は、大きく3つあって、Trackerと呼ばれるソフトを使って曲を打ち込む方法と、MIDIファイルからの変換する方法、それからmmlを記述する方法です。VGM作成ができるTrackerソフトにはvgmmakerというフリーソフトがあったようですが、残念ながら現在は配布されていないようです。まぁ、そこはインターネットなので探せば手に入りますが(vgmmaker11.zip)、作者の方がどういう意図で配布をやめられたのかわからないで手を出さないでおきます。
MIDIファイルからの変換は、MIDI用の各種ツールを使えるので便利そうですが、メガドラに特化してないような気がするので手を出さずにおきます。そうなると、残る選択肢はmmlとなりますね。というより、最初からmmlを使う前提でいました。
mmlを使ってvgmを作るにはxpmckというツールを使います。xpmckをダウンロードして展開したbinフォルダにあるxpmc.exeで、mmlファイルからvgmファイルを作るには、このように変換します。
メガドラのPSG 1chを使って音を出す最小限のmmlがこちら。
カエルの歌、またの曲名をジーザス。
mmlから変換したVGM、XGMファイルを聴く度にSGDKでコンパイルするのも手間なので、VGMファイルを手軽に聴く環境が欲しくなります。再生ソフトは色々とありそうですが、MDXやS98ファイルも再生できるKbMedia Playerが対応していました。vgmファイルをダブルクリックで再生できます。ただし、KbMedia PlayerはPCMデータを含むファイルを再生できないようです。
コマンドラインツールになりますが、VGMPlayというのもあります。vgmripsの
General VGM Discussion and SoftwareのProgram: VGMPlay 0.40.6という箇所のちょっと下にあるDownloadから落とせます。VGMPlay_040-6.7zというファイルです。展開したファイルのVGMPlay.exeにvgm(vgzもokみたいですね)を付けると聴けます。
また、VGMPlay.iniをテキストエディタで開いて、126行目あたりのEmulatorTypeを0x01に書き換えておくとメガドラエミュレータのGensに合わせた音がでるようです(どう違うのかよくわかりませんが)。
ここからがまだ手探りなところです。xpmck用のmmlはマニュアルと、xpmckのZIPファイルに含まれているsampleフォルダに入っているいくつかのmmlファイルが参考になりますが、xpmckが色々なゲーム機と音源に対応しているということもあって、なかなか大変です。まずはメガドラ音源のYM2612について理解しないとですね。
以下、その都度、分かったことを書き加えていきます。
@CSnマクロを使います。-63が左、0がセンター、63が右、とxmpckのマニュアルに書いてあります。
■ VGM形式をXGM形式に変換する
>xgmtool.exe sonic1.vgm sonic1.xgm
Parsing VGM file...
VGM duration: 2328480 samples (52 seconds)
Number of command: 13009
Computed VGM duration: 2328480 samples (52 seconds)
Optimizing VGM...
VGM duration: 2328480 samples (52 seconds)
Number of command: 13009
Computed VGM duration: 2328480 samples (52 seconds)
Number of command after PCM command remove: 13009
VGM duration after wait command conversion: 2328480 samples (52 seconds)
Number of command: 13008
Computed VGM duration: 2328480 samples (52 seconds)
Number of command after commands clean: 8915
Converting VGM to XGM...
Number of command: 5498
XGM duration: 3169 frames (52 seconds)
xgm sonic "sonic1.xgm"
■ VGMファイルを作ってみる
xpmc.exe -gen -v mymusic.mml mymusic.vgm
A (
t100 v15 o4 c d e f e d c r e f g a g f e r
)
■ VGMファイルを手軽に聴く
・KbMedia Playerを使う
・VFMPlayを使う
; EmulatorType: 0 - MAME (Genesis Plus GX), 1 - Gens
EmulatorType = 0x01
■ xpmck用のmml メモ
・左右どちらから音を出すか
#NTSC
@CS0 = {-63}
@CS1= {0}
@CS2= {63}
A (
v15 t128 o4
CS0 c
CS1 d
CS2 e
)