パソコン活用研究5番街(Visual Basic、Excel(VBA)、BASIC プログラミング研究)
音楽を演奏する(Play文)
〜N88BASIC
サウンドボードを搭載したPCで、BASICで音楽を演奏するための命令としてPlay文があります。
Play文で演奏の指示に使うMML(Music Macro Language)にはいろいろ方言があるようなので、まず
PC-98用のN88Basic(86) ver6.1のPlay文を中心に説明していきます。
MMLにはいろいろな方言(派生バージョン)がありますが、源流をたとるとN88BasicのMMLから派生して
いったものが多いようです。
サウンドボードやそこに搭載される音源チップの説明も少ししておきます。
PC-9801-26(26K)というサウンドボードは音源チップとしてはヤマハのYM2203を搭載しており、FM音源3音、
SSGの音源3音の合計6音を使えましたが、
N88Basic(86) Ver6.1のPlay文は、これにあわせFM音源3音、SSG音源3音を使えるようになっています。
(*) FM音源
SSG音源 PSG音源と同等
PSG音源(Programmable Sound Generator)というのはファミコンに搭載されていた音源。ガラケーの着メロもPSG音源の音ですね。
あの特有の機械音がPSG音源の音です。
YM2203は略称OPNと呼ばれているヤマハの音源チップ。
NECのPCでは、 NEC PC-6001mkUSR、PC-6601SR、PC-8001mkUSR、PC-8801mkUSR,TR,FR,MR、
PC-8801MH,FH,FE,FE2、PC-88VA、PC-98DO、
PC-9801UV,UX,CV,EX,DX,DS,DA,UF,UR,CS,FA,FX,FS,USの各機種
富士通製では FM-77L2およびFM77AVの各機種
SHARP製では MZ-2500およびMZ-2861の各機種
に搭載された。
PC-9801-26の上位のサウンドボードにPC-9801-86があり、PC-9821シリージに広く搭載された。
PC-9801-86はPC-9801-26に対して高い互換性をもっている。
PC-9801-86はFM音源6音、SSG3音、リズム6音の発音が可能。
サウンドボードの参考ページ
PC-9801-26(26K)サウンドボード
N88BASIC(86)でサウンド機能を利用するには、サウンドBIOSのROMアドレスを&HCC000に設定(サウンドボードのジャンパピン
の設定)し、
マシン後モニタを起動してメモリSW4の3をONにする。SW4の3をONするとは拡張ROM(&HCC000-CFFFF)
が有効になる。
ユーティリティのswitch.n88を使うと簡単。
N88BASIC(86)のPLAY命令の説明はN88BASIC(86)リファレンスマニュアルに掲載されている説明と
同じものがN88BASIC(86)のPLAY命令にありますので参照して下さい。
ここではPlay命令を実際に試しながら、必要な部分のみ説明していくことにします。
まずは、基本コマンドだけでFM音源の音を鳴らしてみます(サンプルプログラム play.n88)。
PC-98エミュレータのT98-Nextで試した動画がありますので、演奏の様子は巻末のN88BASICで音楽を作ってみるの動画を
ご参照下さい。
以下に、サンプルプログラムplay.n88で使ったコマンドの説明をしておきます。
最初に音楽演奏のためのバッファ(サウンドバッファ)を確保する必要があります。
従って、まずCLEAR文を実施し、機械語領域(BASICが使わない領域)を確保します。
PLAY ALLOC
次に、PLAY ALLOC でサウンドバッファの確保及び初期化をします。
確保するサウンドバッファの合計値はCLEAR文で確保した領域の範囲内におさめる必要があります。
書式
PLAY ALLOC [CH1 バッファサイズ][,CH2 バッファサイズ][,CH3 バッファサイズ][,CH4
バッファサイズ][,CH5 バッファサイズ][,CH6 バッファサイズ]
下のサンプルプログラムでは、PLAY ALLOC 255,255,255 で1〜3chのサウンドバッファを確保しています。省略したチャンネルの
バッファサイズは0になります。
PLAY ALLOCを実行するとサウンド機能は以下の通り初期化されます。
SSGエンベロープ | M255,S1(ただし、固定出力にされている) |
SSG音量 | V7 . |
音長 | L4(R4) |
音の長さの割合 | Q7 |
オクターブ | O4 |
テンポ | T120 |
FMチャンネル音色 | 0(初期状態の音色) |
音色バンク | BASIC起動時の状態に設定 |
PLAY
PLAY命令の文字列に演奏データを記述します。この演奏データの文字列がMML(Music
Macro Language)と
呼ばれるものです。
書式
PLAY [#モード番号,][文字列1][,文字列2][,文字列3][,文字列4][,文字列5][,文字列6]
モード番号はチャンネル3のFM音源に対してどのモードで演奏するかを指定します。
#0:音楽モード #1:効果音モード #2:CSMモード(複合正弦波合成モード)
文字列1〜3はチャンネル1〜3に対応するFM音源、文字列4〜6はチャンネル4〜6に対応するSSG音源の
演奏データになります。
MMLコマンド
文字列に記述するMMLコマンド
Lx 音の長さを指定する。xは1〜64の範囲で、1は全音符、4は四分音符、8は八分音符になります。
Lコマンドを省略したときの初期値はL4です。
Cx,Dx,Ex,Fx,Gx,Ax,Bx
音程を指示します。Cがド、Dがレになります。音長の指定のxはLコマンドと同じです。
このコマンドで音長の指定を省略した場合はLコマンドにより指定された音長になります。
Ox オクターブを設定します。xは1〜8です。
@x 音色を指定します。xは0〜81です。
変わった音色としては 16 UFOのような音 17 レーシングカーが走っていくような効果音
53 汽笛の音 74 氷がグラスの中を転がるような音 などがあります。
(*)音色の詳細はN88BASIC(86)のPLAY命令をご参照下さい。
<play.88>
次のサンプルプログラム<play3.n88>では、ch1のみを使い0〜81の音色を順に鳴らしていきます。
PC-98エミュレータのT98-Nextで試した動画がありますので、演奏の様子は巻末のPlay文の動画を
ご参照下さい。T98-NextのサウンドはサウンドボードPC9801-86相当とありますが、どの程度実機を
精密にエミュレートしているかはわかりません。試してみるとそこそこ違った音色は再現されています。
サウンド関係で特段新しいコマンドは使用していませんが、音色を変えていくためにMMLは
A$="@"+STR$(I)+"l4ceg"
としてPLAY命令に読ませています。
あとは、READ, DATA命令を使って、いくつか変わった音色のところは、何の音色か画面に表示させてみました。
10 CLEAR &H8E00 15 DIM TONE$(100) 20 FOR I=0 TO 81 30 PLAY ALLOC 255 35 READ TONE$(I):PRINT STR$(I)+"."+TONE$(I)+":"; 40 A$="@"+STR$(I)+"l4ceg" 50 PLAY A$ 60 NEXT 70 DATA "","BRASS","STRING","EPIANO","","","PIPE ORGAN","FRUTE","OBOE","CLARINET","","","BELL","", "MUSHI(Insect)","DESCENT","UFO","GRANPRI","LASER1","LASER2" 80 DATA "SinWave","","","TRUMPET","","","","","","GUITAR","","","","","Low Pipe Organ","High Pipe Organ" 90 DATA "","PICCOLO","","","GROCKEN","","XYLOPHON","KOTO","ZITAR","","","","HARP","","HARMONICA","STEELDRUM", "TIMPANI","TRAIN","AMBULANCE","Bird Tweet" 100 DATA "Rain Drop","HORN","Snare Drum","Cow Bell","PERC1","PERC2","PERC3","MUSIC BOX","CELLO","", "WW Ensemble","","",Func PLUC",Funk BASS","Syn Lead" 110 DATA "Metal CLES","STAIN","Cube in Glass","Human voice","","Chimes","SPACY","","Old String","Steel's Cry"
SSG音源を鳴らしてみました。
ファミコンのPSG音源風な機械音が鳴ります。
<play3.n88>
10 CLEAR &H8E00 20 PLAY ALLOC 255,255,255,255 30 PLAY "R4","R4","R4","l4cdefg"
N88BASICのPLAY文を使ってみる。
PC-98エミュレータのT98-Next上で試しているので、音は実機とは異なります。
T98-Nextの仕様ではサウンドボードPC9801-86をエミュレートしているそうです。