MSX Datapack wiki化計画

5章 拡張BASICの変更点

  • 追加された行はこのように表示されます。
  • 削除された行はこのように表示されます。
{{include unfinished_page}}

,{t},{BSIZE:1 0|SIZE:100%}
,{BSIZE:0}←[[4章 アプリケーションの開発]]                                                     ,{BSIZE:0|RIGHT}[[A R800 インストラクション表]]                                                   →

!!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リズム){{br}}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",コントロールチェンジを出力します。{{br}}mはコントロール番号、nはコントロール番号に対する値です。      ,0≦n≦127{{br}}0≦n≦127
,@Sn  ,MIDIリアルタイムクロックに関する命令です。{{br}}n=0 FCH(STOP)を出力し、クロックを停止する{{br}}n=1 FAH(START)を出力し、クロック出力を開始する{{br}}n=2 FBH(CONTINUE)を出力し、クロック出力を開始する{{br}}クロックのテンポは、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{{br}}1≦n≦127
,Zn  ,1バイトMIDIデータを出力します。,1≦n≦255

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

表4.7 リズム音用に追加されたMML
,文字,意味
,@n  ,MIDI機器に対してプログラムチェンジを出力します。内蔵FM音源では無視されます。

表4.8 リズム用に変更されたMML
,文字,意味
,@An,MIDI機器に対しては、Vnと同様にベロシティーを設定します。


表4.9 MMLと各音源との対応一覧表
,  ,文字           ,MIDI      ,FM          ,PSG
,  ,Mn             ,-         ,-           ,○
,  ,Sn             ,-         ,-           ,○
,  ,Vn             ,○[0〜15] ,○          ,○
,  ,Ln             ,○        ,○          ,○
,  ,Qn             ,○        ,○          ,-
,  ,On             ,○        ,○          ,○
,  ,<              ,○        ,○          ,○
,  ,>              ,○        ,○          ,○
,  ,Tn             ,○        ,○          ,○
,  ,Nn{{sup *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{{sup *1}},○         ,○
,  ,S{{sup *1}},○         ,○
,  ,M{{sup *1}},○         ,○
,  ,C{{sup *1}},○         ,○
,  ,H{{sup *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インプリメンテーションチャート

,ファンクション{COLS:2},,送信,備考
,ベーシック{{br}}チャンネル,電源ON時{{br}}設定可能範囲,1 - 9{{br}}1 - 16,{{br}}@Hn
,モード,電源ON時{{br}}メッセージ{{br}}代用,3{{br}}×{{br}}*********,
,ノート{{br}}ナンバー,{{br}}音域,○24 - 119{{br}}*********,O1C - O8B{{br}} 
,ベロシティ, ノート・オン{{br}}{{br}}ノート・オフ,"○9nH , v=8 × n {{br}}{{br}}× 9nH,v=0","Vn,@An(n=0 - 15){{br}}@Anはリズム音のみ{{br}}"
,アフター{{br}}タッチ,キー別{{br}}チャンネル別,×{{br}}×,
,ピッチ・ベンド,,×,
,コントロール{{br}}チェンジ,,○(7){{br}}○(0 - 127),"@Vn{{br}}@Cm,n"
,プログラム{{br}}チェンジ,{{br}}設定可能範囲,○{{br}}*********,@n{{br}}
,エクスクルーシブ,,×,
,コモン,ソング・ポジション{{br}}ソング・セレクト{{br}}チューン,×{{br}}×{{br}}×,
,リアル{{br}}タイム,クロック{{br}}コマンド,○{{br}}○,{{br}}@Sn
,その他,ローカルON/OFF{{br}}オール・ノート・オフ{{br}}アクティブ・センシング{{br}}リセット,×{{br}}○{{br}}×{{br}}×,{{br}}CTRL+STOP
,備考{COLS:2},,Zn : 1バイトデータの送信{COLS:2},

 モード1:オムニ・オン、ポリ  モード2:オムニ・オン、モノ           ○:あり
 モード3:オムニ・オフ、ポリ  モード2:オムニ・オフ、モノ           ○:なし
 *********は送信では意味を持たない


,{t},{BSIZE:1 0|SIZE:100%}
,{BSIZE:0}←[[4章 アプリケーションの開発]]                                                     ,{BSIZE:0|RIGHT}[[A R800 インストラクション表]]                                                   →