MSX Datapack wiki化計画

5章 拡張BASIC

※
※ このページは書きかけです。以下の可能性があります。
※ ・誤字、脱字等のチェックをおこなっていません。
※ ・テキスト、表などフォーマットがされていない。
※ ・画像が抜けている。
※

 5.1 拡張BASICの概要

 MSX-MIDIには、各機能を簡単に使用できるように、MSX-MIDI拡張BASICが用意されています。MSX-MIDI拡張BASICは、CALLMUSICのように拡張ステートメントの形式になっています。CALLは、_(アンダーバー)で代用できます。
 MSX-MIDI拡張BASICでは、MIDIインターフェイスを通じて外部のMIDI機器を使用することができます。そのため、コマンドが追加・変更されました。また、MMLもMIDIに対応するため拡張・変更されました。

 5.2 拡張BASICの解説

CALL MUSIC
機能

MSX-MIDIシステムを初期化します。

書式
CALL MUSIC[([<モード>],[,[0] [,<PLAY文第1文字列へのチャンネル数> [,<PLAY文第2文字列へのチャンネル数> [,・・・[,<PLAY文第1文字列へのチャンネル数>]]]]]]]]]])]
解説
 内蔵FM音源LSIの初期化、FM音源のチャンネルをどのように使用するかの指定、MIDIインターフェイスの初期化を行います。CALL MUSIC文により初期化するまでは、拡張BASICステートメントを使うことはできません。

  • <モード>

指定するのは0か1で、以下のような意味があります。

指定意味
0 リズム音を使用しない
1 リズム音を使用する
  • チャンネル数

それぞれのモードで、使用できるチャンネル数は次の通りです。

モードリズム最大チャンネル数
0 無し 9
1 有り 内蔵FM(6音+1リズム)
MIDI(8音+1リズム)
モード1では、MIDIを使うときは使用できるチャンネル数が、8チャンネルまで増えました。
PLAY文の各文字列へのチャンネル数は、内蔵FM音源が使用し、その文字列が幾つのOPLLのチャンネルを占有するか指定します。0は指定できません。
OPLLのチャンネルは9までしかありません。また、モード1ではリズム音用に3チャンネル使います。したがって、モード0ではPLAY文の各文字列へのチャンネル数の合計は9以下、モード1では6以下でなければなりません。
MIDIの場合は、各文字列に対してMIDIチャンネルを1つ割り当てます。2以上の値を指定しても意味は変わりません。
FM音源のチャンネルは、チャンネルの小さい方から割り当てます。MIDIチャンネルは第1文字列から順に、1、2、3・・・と設定されます。これを変更するには、MMLの@Hnコマンドを使用します。
パラメータを1つ以上指定した場合、他のパラメータの省略時の値は0になります。
PLAY文の各文字列へのチャンネル数は、0に設定したり、省略したりすることはできませんが、一部例外があります。次の例を参照して下さい。

CALL MUSIC(0, 0, 0, 5, 0)
                ↑    ↑
0を設定してはいけない(Illegal function callになる)
CALL MUSIC(0, 0, 1,  , 2)
                   ↑
          省略してはいけない(Syntax errorになる)
CALL MUSIC(1, 0, 1, 1, 1, 1, 1, 1, 0, 0)
                                  ↑ ↑
モード1の第7文字列、第8文字列に対してのみ0を設定できる。この時、PLAY文では次のようになる。
 - PLAY #1の場合
    第1文字列〜第8文字列はMIDIに割り当てる。
    第9文字列はMIDIのリズム音に割り当てる。
    第10文字列〜第12文字列はPSGに割り当てる。
 - PLAY #2の場合
    第1文字列〜第6文字列はMIDIに割り当てる。
    第7文字列、第8文字列は無視される。
    第9文字列は内蔵FM音源のリズム音に割り当てる。
    第10文字列〜第12文字列はPSGに割り当てる。

パラメータ無しで使われたときは、

CALL MUSIC(1,0,1,1,1)

と同じになります。
 CALL MUSIC文を実行すると、システムの割り込みのフックがMSX-MIDIのシステムソフトウェアにリンクされるので、割り込み処理ルーチンのオーバーヘッドが増え、システムのスループットが低下します。また、CALL MUSIC文はワークエリア確保のために、内部でCLEAR文に相当することを行っているので、HIMEM(CLEAR文の第2パラメータに相当します)が807バイト小さく再設定され、変数はすべてクリアされます。

文例
CALL MUSIC

デフォルトの設定をする。

CALL MUSIC(0,0,1,1,1,1,1,1,1,1,1)

1チャンネルずつPLAY文の文字列に割り当てる。

CALL MDR
機能

リズム音用MMLで発音されるMIDIノート番号を設定します。

書式
CALL MDR(<BのMIDIノート番号>,<SのMIDIノート番号>,<MのMIDIノート番号>,<CのMIDIノート番号>,<HのMIDIノート番号>)
解説
 リズム音用のMMLで使用するB、S、M、C、Hコマンドに割り当てるMIDIノート番号を指定します。
 MIDI音源の多くは、1つのチャンネルの各ノートにリズム音を割り当てる機能(リズム専用トラック)を持っています。PLAY文の各文字列は、1つのチャンネルにしか対応していません。同時に複数音を発音するリズム音の場合は、このリズム専用トラックを使用するようにして下さい。
 このリズム音の割り当ては、各MIDI機器によって異なります。お手持ちのMIDI機器のマニュアルを参考に割り当てて下さい。
 パラメータは0〜127を指定します。省略はできません。初期値はすべて0に設定されています。

文例
CALL MDR(35,38,45,49,42)
PLAY
機能

音楽をMMLにしたがって演奏します。

書式
PLAY [#<モード>,]<文字列1>[,<文字列2>[,<文字列3> ...[,<文字列13>]
解説
 PLAY文は音楽を演奏するもので、内蔵FM音源(9音)+PSG音源(3音)、またはMIDI機器(9音)+PSG音源(3音)の、最大12音まで同時発音が可能です。<文字列>に書かれたMMLにしたがって演奏します。
他の拡張命令と異なり、CALL文は必要ありません。
<モード>は0〜3までの値をとり、PLAY文の音源や動作モードを次のように設定します。

  • 0や省略されたときはPSGのみが音源となり、文字列は最大3つまでとなります。
  • 1のとき、MIDI機器、PSG音源を使用できます。

<文字列>との関係ははじめから順に、

<MIDI機器用文字列1>,... <MIDI機器用文字列n>,
<MIDI機器リズム音用文字列>,
<PSG機器用文字列1>,<PSG機器用文字列2>,<PSG機器用文字列3>

となります。

  • 2または3のとき、FM音源、PSG音源を使用できます(2のときと、3のときとでは動作は同じ)。

<文字列>との関係ははじめから順に、

<内蔵FM音源用文字列1>,... <内蔵FM音源用文字列n>,
<内蔵FM音源リズム音用文字列>,
<PSG機器用文字列1>,<PSG機器用文字列2>,<PSG機器用文字列3>

となります。
 nはCALL MUSIC文で設定されたMMLの個数です。CALL MUSICでリズム音を使用しないモードに設定した場合は、リズム音用文字列をカンマ(,)と共に省略しなければいけません。

文例
PLAY #1,"CD","EF","GA"

MIDI機器用MMLの仕様
 ここでは、MIDI機器用に追加および変更されたMMLを説明します。

表4.5 MIDI機器用に追加されたMML

文字 意味値の範囲
@Hn 使用するMIDIチャンネル番号を設定します。1≦n≦16
@Cm,nコントロールチェンジを出力します。
mはコントロール番号、nはコントロール番号に対する値です。
0≦n≦127
0≦n≦127
@Sn MIDIリアルタイムクロックに関する命令です。
n=0 FCH(STOP)を出力し、クロックを停止する
n=1 FAH(START)を出力し、クロック出力を開始する
n=2 FBH(CONTINUE)を出力し、クロック出力を開始する
クロックのテンポは、PLAY文の第1文字列と同じになります。

表4.6 MIDI機器用に変更されたMML

文字意味値の範囲
Ln 長さを設定します。1≦n≦96
Rn 休符を設定します。1≦n≦96
@Wn nで指定した長さだけ状態を継続します。1≦n≦96
Vn MIDI機器に対しては、8倍した値をノートオン・ベロシティーとして出力します。1≦n≦15
@Vn ボリューム(コントロールチェンジ#7)を出力します。1≦n≦127
@n 内蔵FM音源に対しては音色変更を出力しますが、MIDI機器に対してはプログラムチェンジを出力します。0≦n≦63
1≦n≦127
Zn 1バイトMIDIデータを出力します。1≦n≦255

リズム用MMLの仕様
 ここでは、リズム音用に追加および変更されたMMLを説明します。

表4.7 リズム音用に追加されたMML

文字意味
@n MIDI機器に対してプログラムチェンジを出力します。内蔵FM音源では無視されます。

表4.8 リズム用に変更されたMML

文字意味
@AnMIDI機器に対しては、Vnと同様にベロシティーを設定します。

表4.9 MMLと各音源との対応一覧表

文字 MIDI FM PSG
Mn - -
Sn - -
Vn ○[0〜15]
Ln
Qn -
On
<
>
Tn
Nn*1
Rn
A〜G
+
-
#
.
=x;
Xx;
&
n ×
@n ○[0〜127]○[0〜63] -
@Vn ○[0〜127]○[0〜127] -
@Wn Rnと同様
@Hn ○[0〜16] -
@Cm, n○[0〜127]-
Yr,d-
Zn ○[0〜255]- (×)
@Sn ○[0〜2] -

*1   nの値はMIDIノートナンバーではありません。従来通りの音階です。
★   MSX-MIDIで追加された命令です。
×   エラーになります。
ー    無視されます。
[ ]  パラメータの範囲を示します。
( )  旧版(MSX-MUSIC)での対応を示します。

表4.10 リズム音用MML

コマンド MIDI FM
B*1
S*1
M*1
C*1
H*1
n
!
Vn
@An
@Vn ○[0〜127]
Tn
Rn
=x;
Xx;
Yr,d
@Hn ○[0〜16]
@Cm,n○[0〜127]
@n ○[0〜127] ー (×)
Zd ー (×)

*1   MIDI機器の場合は、前もって発音されるノート番号をCALLMDRで定義しなければなりません。
★   MSX-MIDIで追加された命令です。
×   エラーになります。
ー    無視されます。
[ ]  パラメータの範囲を示します。
( )  旧版(MSX-MUSIC)での対応を示します。

 5.3 MIDI機器に対して無効なステートメント

以下のステートメントは、MIDI機器に対しては意味を持ちません。

CALL AUDREG
CALL PITCH
CALL TEMPER
CALL TRANSPOSE
CALL VOICE

MIDI機器の音色設定はCALL VOICEではできません。MMLの@nを使って設定します。

 5.4 MIDIデータフォーマット

MSX-MIDI拡張BASICのMIDIデータフォーマットは以下のようになっています。

5.4.1 送信

1.ノート送信

・ノートオン
    ステータス         1001nnnn(9nH)    n=0〜15  MIDIチャンネル番号
    ノートナンバー     0kkkkkkk         k=24(C0)〜119(B7)
    ベロシティ         0vvvvvvv         v=8*I     I=0〜15
    ベロシティ値はVn、@Anで指定された値を8倍にして出力します。
・ノートオフ
    ステータス         1001nnnn(9nH)    n=0〜15  MIDIチャンネル番号
    ノートナンバー     0kkkkkkk         k=24(C0)〜119(B7)
    ベロシティ         00000000         ノートオフ
    リズム音を複数音同時に発音または発音停止するときは、ランニングステータスで出力します。

2.コントロールチェンジ

 ・@Vv (ボリューム)
    ステータス         1011nnnn(BnH)    n=0〜15  MIDIチャンネル番号
    コントロール番号   00000111         c=7
    コントロール値     0vvvvvvv         v=0〜127
 ・@Vv (ボリューム)
    ステータス         1011nnnn(BnH)    n=0〜15  MIDIチャンネル番号
    コントロール番号   0ccccccc         c=0〜127
    コントロール値     0vvvvvvv         v=0〜127

3.プログラムチェンジ

 ・@p (プログラムチェンジ)
    ステータス         1100nnnn(CnH)    n=0〜15  MIDIチャンネル番号
    プログラム番号     0ppppppp         p=0〜127

4.システムリアルタイムメッセージ

 ・タイミングクロック
    ステータス         11111000(F8H)
    タイミングクロックは、@S1または@S2でクロックが開始されていて、かつPLAY文が実行されているときにのみ送信されます。PLAY文を終了すると、クロックは停止します。この時、ストップFCHは出力されません。
 ・@S1   スタート
    ステータス         11111010(FAH)
    クロックの出力を開始します。
 ・@S2   コンティニュー
    ステータス         11111011(FBH)
    クロックの出力を開始します。
 ・@S0   ストップ
    ステータス         11111100(FCH)
    クロックの出力を停止します。

5.4.2 受信

 拡張BASICでは受信は行いません。

表4.11 MSX-MIDI 拡張BASIC MML MIDIインプリメンテーションチャート

ファンクション送信備考
ベーシック
チャンネル
電源ON時
設定可能範囲
1 - 9
1 - 16

@Hn
モード電源ON時
メッセージ
代用
3
×
*********
ノート
ナンバー

音域
○24 - 119
*********
O1C - O8B
ベロシティノート・オン

ノート・オフ
○9nH , v=8 × n

× 9nH,v=0
Vn,@An(n=0 - 15)
@Anはリズム音のみ
アフター
タッチ
キー別
チャンネル別
×
×
ピッチ・ベンド×
コントロール
チェンジ
○(7)
○(0 - 127)
@Vn
@Cm,n
プログラム
チェンジ

設定可能範囲

*********
@n
エクスクルーシブ×
コモンソング・ポジション
ソング・セレクト
チューン
×
×
×
リアル
タイム
クロック
コマンド


@Sn
その他ローカルON/OFF
オール・ノート・オフ
アクティブ・センシング
リセット
×

×
×

CTRL+STOP
備考Zn : 1バイトデータの送信
モード1:オムニ・オン、ポリ  モード2:オムニ・オン、モノ           ○:あり
モード3:オムニ・オフ、ポリ  モード2:オムニ・オフ、モノ           ○:なし
*********は送信では意味を持たない