3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

MGSDRVのMMLでの#allocの意味と使い方

Last updated at Posted at 2022-03-15

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 }

エラーになります。

  1. 今のコンピュータは、解析したMMLから自動的に各チャンネルのデータサイズを当たり前のように自動決定できますが、80年代のコンピュータはメモリに一切余裕がないため、こんなことも指定する必要があったのです...。

  2. 数値上は16342まで指定できますが、トラックの合計容量が16333バイトを超えるとObject Too Bigエラーが出てコンパイルができなくなります。 2

3
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?