3.2 拡張BASIC
3.2.1 概要
MSX-MUSICには、各機能を簡単に使用できるように、MSX-MUSIC拡張BASICが用意されています。使い方はCALL MUSICのように拡張ステートメントの形式です。CALLは_(アンダーバー)で代用できます。
MSX-MUSICの拡張BASICはMSX-AUDIO拡張BASICのサブセット版です。MSX-AUDIO用のPCM関連コマンドなどは使用できません。また、音色もできるだけMSX-AUDIOの音色に近づけてありますが、多少異なりますし、ユーザー音色の制限(MSX-MUSICでは1音色だが、MSX-AUDIOでは9音色)もあります。使えないコマンドについては、「3.2.5 MSX-AUDIOのステートメント」を参照して下さい。
3.2.2 この章の表記法
3.2.3 拡張BASICコマンド一覧
1.拡張ステートメント(CALL文と共に使用します)
コマンド名 | 機 能 | ページ |
AUDREG | 音源LSIのレジスタに値を書き込みます。 | 228 |
BGM | バックグラウンド処理を行うかどうかを指定します。 | 228 |
MUSIC | MSX-MUSICシステムを初期化します。 | 229 |
PITCH | FM音源の楽音の音高(ピッチ)を与えます。 | 230 |
PLAY | 音楽をミュージックマクロランゲージにしたがって演奏します。 | 231 |
PLAY | PLAY文が音楽を演奏中かどうかを返します。 | 235 |
STOPM | バックグラウンドで実行中のPLAY文の演奏を停止します。 | 235 |
TEMPER | 音律(テンペラメント)を与えます。 | 236 |
TRANSPOSE | FM音源の楽音に対してセント単位で移調を与えます。 | 237 |
VOICE | FM音源の各チャンネルに音色(ボイス)を直接に指定します。 | 237 |
VOICE COPY | 音色パラメータデータの転送を行います。 | 242 |
3.2.4 拡張BASICの解説
- CALL AUDREG
機 能 |
音源LSIのレジスタに値を書き込みます。
書 式 |
CALL AUDREG(<レジスタ番号>,<値>[,<チャンネル番号>])
解 説 |
音源LSIのレジスタに対する書き込みを行います。システムソフトウェアが割り込みなのでひんぱんに書き込んでいるレジスタには、効果がない場合やシステムの再立ち上げが必要な場合があります。
<チャンネル番号>は0、または省略しなければなりません。これはMSX-AUDIO拡張BASICとの互換性をとるために用意されているものでMSX-MUSICでは意味を持ちません。
文 例 |
CALL AUDREG(&H20,0)
- CALL BGM
機 能 |
バックグラウンド処理を行うかどうかを指定します。
書 式 |
CALL BGM(<変数>)
解 説 |
<変数>は0または1の値をとり、次のような意味を持ちます。
0 PLAY文のバックグラウンド処理を行わない。 1 PLAY文のバックグラウンド処理を行う。
0を与えることでフォアグラウンド処理とすることができます。
文 例 |
CALL BGM(0)
PLAY文のバックグラウンド処理を行わない。
CALL BGM(1)
PLAY文のバックグラウンド処理を行う。
- CALL MUSIC
機 能 |
MSX-MUSICシステムを初期化します。
書 式 |
CALL MUSIC[([<モード>][,[0][,<PLAY文第1文字列へのチャンネル数>[,<PLAY文第2文字列へのチャンネル数>[,…[,<PLAY文第9文字列へのチャンネル数>]]]]]]]]]])]
解 説 |
音源LSIの初期化とともに9個のFM音源のチャンネルをどのように使用するかを指定します。MUSIC文により初期化を行うまでは、すべての拡張BASICステートメントは使用できません。<モード>は0か1で、0はリズム音を使用しないモードで、1はリズム音をを使用するモードです。リズム音を使用する場合にはチャンネル7、8、9を使用しますので、楽音に使えるのは残り6チャンネルになります。したがって、PLAY文で使用するチャンネル数はリズム使用時には6以下、リズムを使わないときは9以下である必要があります。
チャンネルの使用割り当ては、PLAY文では、チャンネル番号の小さい方(1,2,3…)から割り当てます。
パラメータを1つ以上指定した場合、他のパラメータの省略時の値は0となります。
PLAY文の文字列へのチャンネル数を、0に設定したり省略したりすることはできません。次の例を参照して下さい。
CALL MUSIC(0, 0, 0, 5, 0) ↑ ↑ 0を設定してはいけない(Illegal function callになる) CALL MUSIC(0, 0, 1, , 0) ↑ 省略してはいけない(Syntax errorになる)
パラメータなしで使われた時には、
CALL MUSIC(1, 0, 1, 1, 1)
と同じになります。すなわち、
- FM音源のチャンネル1をPLAY文の最初の文字列に割り当てる。
- FM音源のチャンネル2をPLAY文の2番目の文字列に割り当てる。
- FM音源のチャンネル3をPLAY文の3番目の文字列に割り当てる。
- リズム音をPLAY文の4番目の文字列に割り当て使用する。
- PLAY文の5番目以降7番目までの文字列はPSG音源の制御に割り当てる。
という意味になります。
MUSIC文を実行すると、システムの割り込みのフックがMSX-MUSICのシステムソフトウェアにリンクされるので割り込み処理ルーチンのオーバーヘッドが増え、システムのスループットが低下します。また、MUSIC文はワークエリア確保のために内部でCLEAR文に相当することを行っているので、HIMEM(CLEAR文の第2パラメーターに相当します)が807バイト小さく再設定され、変数はすべてクリアされます。
文 例 |
CALL MUSIC
デフォルトの設定をする。
CALL MUSIC(0,0,1,1,1,1,1,1,1,1,1)
1チャンネルずつPLAY文の文字列に割り当てる。
- CALL PITCH
機 能 |
FM音源の楽音の音高(ピッチ)を与えます。
書 式 |
CALL PITCH(<ピッチ1>[,<ピッチ2>])
解 説 |
FM音源で発生する楽音の音高を指定します。<ピッチ>の範囲は410〜459で単位は[Hz]です。中央のCのすぐ上のAの音(a2)の周波数で音高を表します。トランスポーズとは独立に設定でき、デフォルトの値は440です。
ピッチ(またはトランスポーズ値)を変えるとリズム音や音程を持たない音を除くFM音の音の高さが変化します。PSG音源には作用しないので注意して下さい。
ピッチ2は指定しても無視されます。これはMSX-AUDIO拡張BASICとの互換性をとるために用意されているものでMSX-MUSICでは意味を持ちません。
トランスポーズについてはTRANSPOSEの項を参照して下さい。
文 例 |
CALL PITCH(440)
- PLAY
機 能 |
音楽をミュージックマクロランゲージ(MML)にしたがって演奏します。
書 式 |
PLAY[#<モード>,]<文字列1>[,<文字列2>[,<文字列3>]…[,<文字列13>]
解 説 |
PLAY文は音楽を演奏する物で、FM音源(9)、従来のPSG音源(3)の最大12声まで同時発声が可能です。<文字列>に書かれたミュージックマクロランゲージ(MML)にしたがって演奏します。
他の拡張命令と異なりCALL文は必要ありません。
<モード>は0から3までの値をとり、PLAY文の音源や動作モードを次のように設定します。
- 0や省略されたときはPSGのみが音源となり、文字列は最大3つまでとなります。従来のPLAY文と互換性があります。
- 1のとき、「Illegal function call」となります。これはMSX-AUDIO拡張BASICとの互換性をとるために用意されているもので、MSX-MUSICでは意味を持ちません。
- 2または3のとき、FM音源、リズム音、PSG音源を使用できます。(2のときと3のときで動作に違いはありません)。
<文字列>と音源との関係は始めから順に、
<FM音源用文字列1>,…,<FM音源用文字列n>, <リズム音用文字列>, <PSG音源用文字列1>,<PSG音源用文字列2>, <PSG音源用文字列3>
となります。nはMUSIC文で設定されたミュージックマクロランゲージの個数です。
MUSIC文でリズム音を使用しないモードに設定した場合は、リズム音用文字列をカンマと共に省略しなければいけません。
例として初期設定のMUSIC文に対する文字列の配列をあげると次のようになります。
<FM音源用文字列1>,<FM音源用文字列2>,<FM音源用文字列3>,<リズム音用文字列>, <PSG音源用文字列1>,<PSG音源用文字列2><PSG音源用文字列3>
文 例 |
PLAY#2,"CD","EF","GA"
ミュージックマクロランゲージ(MML)の仕様
FM音源、PSG音源MMLの仕様
表7.23 FM音源、PSG音源用MMLの仕様一覧
文 字 | 意 味 | 値のとる範囲 | 初期設定値 |
Mn | エンベロープ周期の設定 | 1≦n≦65535 | M255 |
Sn | エンベロープ形状の設定 | 0≦n≦15 | S0 |
Vn | 音量の設定 | 0≦n≦15 | V8 |
Ln | 長さの設定 | 1≦n≦64 | L4 |
Qn | 音の長さの割合 | 1≦n≦8 | Q8 |
On | オクターブの設定 | 1≦n≦8 | O4 |
> | オクターブを1つ上げる | ||
< | オクターブを1つ下げる | ||
Tn | テンポの設定 | 32≦n≦255 | T120 |
Nn | nで指定された高さの音を発生する | 0≦n≦96 | |
Rn | 休符の設定 | 1≦n≦64 | R4 |
A〜G | 音程の発生 | ||
+,# | 音を半音上げる | ||
- | 音を半音下げる | ||
.(ピリオド) | 音符や休符の長さを1.5倍する | ||
=x; | パラメータnを変数xで設定する | ||
Xx; | 文字変数xに入っているMMLを演奏する(*1) | ||
& | タイ、前後の音をつなぐ | ||
{}n | 連符、n分音符を{}の中の音程の個数で等分にした音を発生する | 1≦n≦64 | Lnで設定された値 |
@n | n番の音色に切り替える | 0≦n≦63 | |
@Vn | 音量を細かく設定する | 0≦n≦127 | |
@Wn | nで指定された長さだけ状態を継続する | 1≦n≦64 | Lnで設定された値 |
Yr,d | 音源LSIのレジスタrにdを書き込む | ||
Zd | 「Illegal function call」になる(*2) |
*1 このマクロを指定した場合、このマクロ以降に何かマクロを書くことはできません。書いた場合はエラーとなります。 *2 MSX-AUDIOの場合、MIDIポートへの出力という意味ですが、MSX-MUSICの場合はエラーになります。
リズム音用MMLの仕様
リズム音の場合、1つのMMLで同時にいくつかの音を発生するために音楽用とは異なった記述様式をとります。まずならしたい楽器を並べてその後に長さを記述します。
表7.24 リズム音用MMLの仕様一覧
文 字 | 意 味 | 値のとる範囲 | 初期設定値 |
B | バスドラム音を発生 | ||
S | スネアドラム音を発生 | ||
M | タムタム音を発生 | ||
C | シンバル音を発生 | ||
H | ハイハット音を発生 | ||
! | 直前の楽器の音量をアクセントボリュームにする | ||
n | 直前までに書かれた楽音を発生し、n分音符分待つ | 1≦n≦64 | |
Vn | アクセントの付いていない楽音の音量を設定する | 0≦n≦15 | 8 |
@An | アクセントの付いている楽音の音量を設定する | 0≦n≦15 |
Tn、@Vn、Rn、=x;、Xx;、.はFM音源と同様です。
例 |
"BSH8H8S!H8H8"
- バス、スネア、ハイハットを鳴らし、8分音符分待ちます。
- ハイハットを鳴らし、8分音符分待ちます。
- スネアをアクセント付きでハイハットと鳴らし8分音符分待ちます。
- ハイハットを鳴らし、8分音符分待ちます。
MMLと各音源との対応
表7.25 MMLと各音源との対応一覧
文 字 | FM音源 | PSG音源 |
Mn | *1 | ○ |
Sn | *1 | ○ |
Vn | ○ | ○ |
Ln | ○ | ○ |
Qn | ○ | *1 |
On | ○ | ○ |
> | ○ | ○ |
< | ○ | ○ |
Tn | ○ | ○ |
Nn | ○ | ○ |
Rn | ○ | ○ |
A〜G | ○ | ○ |
+,# | ○ | ○ |
- | ○ | ○ |
. | ○ | ○ |
=x; | ○ | ○ |
Xx; | ○ | ○ |
& | ○ | ○ |
{}n | ○ | *3 |
@n | ○ | *1 |
@Vn | ○ | *1 |
@Wn | ○ | *2 |
Yr,d | ○ | *1 |
Zd | *4 | *1 |
*1 無視されます。 *2 Rnと同等です。 *3 PSG音源に対しては使用できません。使用するとエラーになります。 *4 MSX-MUSICではエラーになります。
- CALL PLAY
機 能 |
PLAY文が音楽を演奏中かどうかを返します。
書 式 |
CALL PLAY(<PLAY文のストリング番号>,<変数名>)
解 説 |
PLAY文のミュージックキューの状態を調べ、各チャンネルが音楽を演奏中かどうかを判断し、演奏中であれば-1、そうでなければ0の値を返します。ただし、ストリング番号として0が与えられた場合はいずれかのストリングが演奏中であれば-1を、そうでなければ0を返します。
PLAY文のストリング番号は、MUSIC文で指定したストリング数+3まで使えます。すなわち、MUSIC文で指定したFM音源に加え3チャンネルのPSG音源について有効です。
文 例 |
CALL PLAY(0,A):PRINT A
- CALL STOPM
機 能 |
バックグラウンドで実行中のPLAY文の演奏を停止します。
書 式 |
CALL STOPM
解 説 |
バックグラウンドで実行中のPLAY文の音楽の演奏を停止します。
- CALL TEMPER
機 能 |
音律(テンペラメント)を与えます。
書 式 |
CALL TEMPER(<音律番号>)
音律番号 0〜21
解 説 |
音律を与えるステートメントで、FM音源の楽音の音高に影響を与えます。
音律は1オクターブをどのような比率で12音に分割するかを決めるもので、古典音楽には古典音律が適していると言われます。
デフォルト値は9番の完全平均律です。
番 号 | 音 律 |
0 | ピタゴラス |
1 | ミーントーン |
2 | ヴェルクマイスター |
3 | ヴェルクマイスター(*) |
4 | ヴェルクマイスター(別) |
5 | キルンベルガー |
6 | キルンベルガー(*) |
7 | ヴァロッティ・ヤング |
8 | ラモー |
9 | 完全平均律(デフォルト) |
10 | 純正律cメジャー(aマイナー) |
11 | 純正律cisメジャー(b) |
12 | 純正律dメジャー(h) |
13 | 純正律esメジャー(c) |
14 | 純正律eメジャー(cis) |
15 | 純正律fメジャー(d) |
16 | 純正律fisメジャー(es) |
17 | 純正律gメジャー(e) |
18 | 純正律gisメジャー(f) |
19 | 純正律aメジャー(fis) |
20 | 純正律bメジャー(g) |
21 | 純正律hメジャー(gis) |
(*)は平島達司氏による。
文 例 |
CALL TEMPER(0)
- CALL TRANSPOSE
機 能 |
FM音源の楽音に対してセント単位で移調を与えます。
書 式 |
CALL TRANSPOSE(<トランスポーズ値1>[,<トランスポーズ値2>])
解 説 |
移調を行うためのステートメントで、単位はセントです。これは、半音を100とした移調の単位で、1オクターブ上げるには、+1200を与えます。
トランスポーズ値として許される範囲は、±12799以内ですが、実際にはFM音源の音色によってある高さの範囲以外は制限されます。音高制度はLSIの制限により、±2セントていどです。
トランスポーズはピッチとは独立して設定できます。MUSIC文による初期化の値は0です。ピッチについてはPITCH文を参照してください。
トランスポーズ値2は指定されても無視します。これはMSX-AUDIO拡張BASICとの互換性をとるために用意されているものでMSX-MUSICでは意味を持ちません。
文 例 |
CALL TRANSPOSE(0) CALL TRANSPOSE(0,700)
- CALL VOICE
機 能 |
FM音源の各チャンネルに音色(ボイス)を直接設定します。
書 式 |
CALL VOICE([<チャンネル1用のボイス>],[<チャンネル2用のボイス>],…,[<チャンネル9用のボイス>])
ボイス=@+数値 または、配列変数名
解 説 |
音源LSIの9チャンネルあるFM音源のそれぞれに音色を設定します。
音色の設定方法には2つあります。
システムに備えられている音色ライブラリを使う場合には、0〜63の音色の番号を数式により指定します。この場合には数式の前に@記号をつけて次の配列変数名と区別します。
プログラムにより音色パラメータを与えて設定する場合には、配列変数に音色パラメータを入れてその配列変数名を指定します。
音色パラメータのフォーマットの詳細はVOICE COPY文の解説を参照してください。
パラメータを省略したチャンネルの音色は変更されません。
音色ライブラリ(表7.26 音色ライブラリ一覧表参照)のうち*印が付いていない音色や、配列変数で設定する場合は同時に1音色しか設定できません。複数設定しようとしたときはパラメータ列の一番右側のパラメータか最後に実行したCALL VOICE文の設定のみが有効となります。
例
CALL VOICE(@26,@27)
チャンネル1の音色は2と同じ27番の音色になります。
CALL VOICE(@20,@10)
CALL VOICE(,,@21)
チャンネル1の音色は3と同じ21番となります。
CALL VOICE(A,,B)
チャンネル1の音色は3と同じBという配列変数で設定される音色となります。
文 例 |
CALL VOICE(@0,@0,@0,,,,@7,@7,@7) CALL VOICE(@0,@0)
略号は音色の名前としてライブラリに登録されているものです。
表7.26 音色ライブラリ一覧表
音色番号 | 音色名 | 略号 |
0 | Piano 1* | Piano 1 |
1 | Piano 2 | Piano 2 |
2 | Violin* | Violin |
3 | Flute 1* | Flute |
4 | Clarinet* | Clarinet |
5 | Oboe* | Oboe |
6 | Trumpet* | Trumpet |
7 | Pipe Organ 1 | PipeOrgn |
8 | Xylophone | Xylophon |
9 | Organ* | Organ |
10 | Guitar* | Guitar |
11 | Santool 1 | Santool |
12 | Electric Piano 1* | Elecpian |
13 | Clavicode 1 | Clavicod |
14 | Harpsicode 1* | Harpsicd |
15 | Harpsicode 2 | Harpscd2 |
16 | Vibraphone* | Vibraphn |
17 | Koto 1 | Koto |
18 | Taiko | Taiko |
19 | Engine 1 | Engine |
20 | UFO | UFO |
21 | Synthesizer bell | SynBell |
22 | Chime | Chime |
23 | Synthesizer bass* | SynBass |
24 | Synthesizer* | Synthsiz |
25 | Synthesizer Percussion | SynPercu |
26 | Synthesizer Rhythm | SynRhyth |
27 | Harm Drum | HarmDrum |
28 | Cowbell | Cowbell |
29 | Close Hi-hat | ClseHiht |
30 | Snare Drum | SnareDrm |
31 | Bass Drum | BassDrum |
32 | Piano 3 | Piano 3 |
33 | Electric Piano 2* | Elecpia2 |
34 | Santool 2 | Santool2 |
35 | Brass | Brass |
36 | Flute 2 | Flute 2 |
37 | Clavicode 2 | Clavicd2 |
38 | Clavicode 3 | Clavicd3 |
39 | Koto 2 | Koto 2 |
40 | Pipe Organ 2 | PipeOrg2 |
41 | PohdsPLA | PohdsPLA |
42 | RohdsPRA | PohdsPRA |
43 | Orch L | Orch L |
44 | Orch R | Orch R |
45 | Synthesizer Violin | SynViol |
46 | Synthesizer Organ | SynOrgan |
47 | Synthesizer Brass | SynBrass |
48 | Tube* | Tube |
49 | Shamisen | Shamisen |
50 | Magical | Magical |
51 | Huwawa | Huwawa |
52 | Wander Flat | WnderFlt |
53 | Hardrock | Hardrock |
54 | Machine | Machine |
55 | Machine V | MachineV |
56 | Comic | Comic |
57 | SE-Comic | SE-Comic |
58 | SE-Laser | SE-Laser |
59 | SE-Noise | SE-Noise |
60 | SE-Star 1 | SE-Star |
61 | SE-Star 2 | SE-Star2 |
62 | Engine 2 | Engine 2 |
63 | Silence | Silence |
音色パラメータデータのフォーマット
音色パラメータは次の表のように1音色あたり32バイトのデータを使います。
オペレータ0とオペレータ1のデータは同じものの繰り返しになっています。
'''表7.27 音色パラメータのフォーマット
オフセット | 内容 | |
ヘッダ | ||
0〜7 | 音色名 | |
8〜9 | ボイス移調 | |
10 | bit0 | アルゴリズム* |
bit1〜3 | フィードバック | |
bit4 | 固定ピッチ* | |
bit5 | AMD/PMDロード可能* | |
bit6 | PMD* | |
bit7 | AMD* | |
11〜15 | 予約 | |
オペレータ0 | ||
16 | bit0〜3 | MULT |
bit4 | KSR | |
bit5 | EG | |
bit6 | PM | |
bit7 | AM | |
17 | bit0〜5 | トータルレベル |
bit6〜7 | レベルキースケール | |
18 | bit0〜3 | ディケイレイト |
bit4〜7 | アタックレイト | |
19 | bit0〜3 | リリースレイト |
bit4〜7 | サスティンレベル | |
20 | bit4〜7 | ベロシティセンシビリティ(0〜8)* |
21〜23 | 予約 | |
オペレータ1 | ||
24 | bit0〜3 | MULT |
bit4 | KSR | |
bit5 | EG | |
bit6 | PM | |
bit7 | AM | |
25 | bit0〜5 | トータルレベル* |
bit6〜7 | レベルキースケール | |
26 | bit0〜3 | ディケイレイト |
bit4〜7 | アタックレイト | |
27 | bit0〜3 | リリースレイト |
bit4〜7 | サスティンレベル | |
28 | bit4〜7 | ベロシティセンシビリティ(0〜8)* |
29〜31 | 予約 |
*はMSX-AUDIOとの互換性のためにあるものです。MSX-MUSICでは意味を持ちません(無視されます)。
- CALL VOICE COPY
機 能 |
音色パラメータデータの転送を行います。
書 式 |
CALL VOICE COPY(<パラメータ1>,<パラメータ2>)
パラメータ1=@+数式または配列変数名
パラメータ2=@+数式(結果は63でなければなりません)または配列変数名
解 説 |
配列と音色ライブラリ(0〜63)の間でのデータの転送を行います。パラメータ1の音色パラメータをパラメータ2に転送します。@と数式が指定されたときは、その数値の結果で指定される音色番号の音色データが対象となります。
ソース(パラメータ1)に指定できる音色番号は0〜63のうち*印の付いていない音色の番号ですが、ディスティネーション(パラメータ2)に指定できる音色番号は63に限ります。ソース(パラメータ1)に*印の付いている音色番号を指定すると「Illegal function call」となります。
@記号がない場合の変数名は配列変数とみなされ、その内容が転送の対象になります。1つの音色パラメータは32バイトの長さがあります。音色パラメータの詳細については、「表7.27 音色パラメータデータのフォーマット」を参照してください。
文 例 |
CALL VOICE COPY(@17,@63)
17番の音色データを63番に転送する。
DIM A%(16):CALL VOICE COPY(@28,A%)
28番の音色データを配列変数A%に転送する。
CALL VOICE COPY(A%,@63)
配列変数A%の音色データを63番に転送する。
3.2.5 MSX-AUDIOのステートメント
以下のMSX-AUDIOのステートメントは全て「Illegal function call」となります。
文法上の間違いがあっても同様です。
ADPCM/PCM関連のステートメント
CONVA CONVP COPY PCM LOAD PCM PCM FREQ PCMVOL PLAY PCM REC PCM SAVE PCM SET PCM
インスツルメント関連のステートメント
INMK KEY ON/KEY OFF MK PCM MK TEMPO MK VEL MK VOICE MK VOL
MK記録関連のステートメント
APPEND MK CONT MK MK STAT PLAY MK REC MK RECMOD
外部プログラムの呼び出し
SYNTHE APEEK APOKE