パソコン活用研究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>

10 CLEAR &H8E00
20 PLAY ALLOC 255,255,255
30 PLAY "l4cccc","l4eeee","l4gggg"
40 PLAY "l4eeee","l4gggg","l4bbbb"
50 PLAY "l4dddd","l4ffff","l4aaaa"
60 PLAY "@2o4c4d4e4f4g4a4b4o5c2"
70 PLAY "c1","e1","g1"

次のサンプルプログラム<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をエミュレートしているそうです。




TOP PAGE >Basic活用研究目次