{{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] [, [, [,・・・[,]]]]]]]]]])] ,解説  内蔵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(,,,,) ,解説  リズム音用の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音源を使用できます。 <文字列>との関係ははじめから順に、 ,... , , ,, となります。 *2または3のとき、FM音源、PSG音源を使用できます(2のときと、3のときとでは動作は同じ)。 <文字列>との関係ははじめから順に、 <内蔵FM音源用文字列1>,... <内蔵FM音源用文字列n>, <内蔵FM音源リズム音用文字列>, ,, となります。  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 インストラクション表]] →