MSX Datapack wiki化計画

3.2 MSX-MUSIC 拡張BASIC

 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≦65535M255
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≦64Lnで設定された値
@n n番の音色に切り替える 0≦n≦63
@Vn 音量を細かく設定する 0≦n≦127
@Wn nで指定された長さだけ状態を継続する1≦n≦64Lnで設定された値
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 音色ライブラリ一覧表

音色番号音色名 略号
0Piano 1* Piano 1
1Piano 2 Piano 2
2Violin* Violin
3Flute 1* Flute
4Clarinet* Clarinet
5Oboe* Oboe
6Trumpet* Trumpet
7Pipe Organ 1 PipeOrgn
8Xylophone Xylophon
9Organ* Organ
10Guitar* Guitar
11Santool 1 Santool
12Electric Piano 1* Elecpian
13Clavicode 1 Clavicod
14Harpsicode 1* Harpsicd
15Harpsicode 2 Harpscd2
16Vibraphone* Vibraphn
17Koto 1 Koto
18Taiko Taiko
19Engine 1 Engine
20UFO UFO
21Synthesizer bell SynBell
22Chime Chime
23Synthesizer bass* SynBass
24Synthesizer* Synthsiz
25Synthesizer Percussion SynPercu
26Synthesizer Rhythm SynRhyth
27Harm Drum HarmDrum
28Cowbell Cowbell
29Close Hi-hat ClseHiht
30Snare Drum SnareDrm
31Bass Drum BassDrum
32Piano 3 Piano 3
33Electric Piano 2* Elecpia2
34Santool 2 Santool2
35Brass Brass
36Flute 2 Flute 2
37Clavicode 2 Clavicd2
38Clavicode 3 Clavicd3
39Koto 2 Koto 2
40Pipe Organ 2 PipeOrg2
41PohdsPLA PohdsPLA
42RohdsPRA PohdsPRA
43Orch L Orch L
44Orch R Orch R
45Synthesizer Violin SynViol
46Synthesizer Organ SynOrgan
47Synthesizer Brass SynBrass
48Tube* Tube
49Shamisen Shamisen
50Magical Magical
51Huwawa Huwawa
52Wander Flat WnderFlt
53Hardrock Hardrock
54Machine Machine
55Machine V MachineV
56Comic Comic
57SE-Comic SE-Comic
58SE-Laser SE-Laser
59SE-Noise SE-Noise
60SE-Star 1 SE-Star
61SE-Star 2 SE-Star2
62Engine 2 Engine 2
63Silence 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〜3MULT
bit4KSR
bit5EG
bit6PM
bit7AM
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〜3MULT
bit4KSR
bit5EG
bit6PM
bit7AM
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