MGSDRV用のMMLコンパイラMGSCは出力データサイズに制限があり、全トラックのデータの合計で約16KB以下にする必要があります。
MGSDRVではモード#opll_modeによってトラック数が変わりますので、デフォルトでは各トラックの最大サイズが次のように設定されます。
表1 トラックの最大サイズのデフォルト
| モード | トラック数 | 各トラックの最大サイズ |
|---|---|---|
| #opll_mode 0 | 18 | 903 |
| #opll_mode 1 | 16 | 1016 |
1トラックあたりの使用容量が上記のサイズを超えるとTrack buffer fullエラーになってしまいます。こんな感じのエラーメッセージが出ます。
Track buffer full in 17
>> 1 cdefgab>c<cdefgab>c<cdefgab>c<cdefgab>c<cdefgab>c<cdefgab>c<
こうなってしまうともうお手上げかというとそうではなく、他のトラックにまだ空き容量がある場合、他のトラックのデータ最大サイズを減らして、別のトラックのデータサイズを増やすことができます。これを行うためのコマンドが#allocです1。
#alloc の使い方
#alloc トラック名 = 最大サイズ という形式で指定します。最大サイズは163332まで指定できます。
例えば、トラック1の最大サイズを1500バイトにする場合は、
#alloc 1=1500
とします。複数指定することもできて、トラック1の最大サイズを1500バイト、トラックaの最大サイズを1200バイトにする場合は
#alloc 1=1500
#alloc a=1200
となります。また、まとめて1行にして
#alloc { 1=1500, a=1200 }
というような書き方もできます。
注意点としては、
- すべてのトラックの容量を合計して16333バイトを超えることはできません2。
- #allocを書かなかったトラックは、
- そのトラックのMMLを全く使っていなければ、トラックの最大サイズが0バイトとして扱われます。
- そのトラックのMMLを使った場合は、表1のバイト数が割当てられます。
- トラック番号0は音色データ用のトラックです。
TIPS1:各トラックの使用量の確認方法
#alloc コマンドで最大サイズを決める場合は、各トラックがどの程度のサイズを使っているかを把握する必要があります。これは、コンパイル結果の画面から分かります。
例えば以下のデータをコンパイルしてみると、
#opll_mode 1
@e0 = {2,31,fn8.0=26}
@e1 = {3,0,f0}
@e2 = {0,0,fca}
1 l16v13 [[@1c4@0c4rv-3cv+3r8|c4]4 cccc]0
2 @2v12l16 [
2 o2 [ e8>e<e>>d<q2eq6d>e<<d>e<q2dq6db>>c&d<<e ]2
2 o2 [ d8>d<d>>c<q2dq6c>d<<c>d<q2cq6ca>a+&>c<<d ]2 ]0
結果は、こんな感じになります。
MGSC MML compiler version 1.11
Copyright(c) 1992-94 by Ain
Compile complete
track : 0 ( 1016) ( 21) ( 995)
track : 1 ( 1016) ( 42) ( 974)
track : 2 ( 1016) ( 108) ( 908)
...
たぶん見てなんとなく分かると思いますが、()で囲まれた数字が左から順に、そのトラックの最大サイズ、使用されたサイズ、空きサイズ、になります。
#alloc コマンドにどのぐらいの値を設定すれば良いかは、こちらのサイズを見ながら、合計が16333バイトを超えないように考えて設定していくことになります。
Track buffer full メッセージが出たタイミングでは、トラックがどのぐらいのサイズを使っているのか分かりません。エラーが出ている場合は、MMLを減らしてコンパイルが通るようにしてから確認する必要があります。
TIPS2: エラーになる書き方
多重alloc
同じトラックに対して2回以上 #alloc すると、2回目はエラーになります。
#opll_mode 1
#alloc { 1 = 1500 }
#alloc { 1 = 1200 }
これをコンパイルすると
Can't allocate in 3
>> #alloc { 1 = 1700 }
こうなります。
MMLを書いたあとで alloc
トラックのMMLをひとつでも書いたあとで、そのトラックに対して #alloc を使うとエラーになります。
#opll_mode 1
1 o4v12cde
#alloc 1=1500
これをコンパイルすると、
Can't allocate in 2
>> #alloc { 1 = 1500 }
エラーになります。