-MSXBASIC 命令セット2(初級)PLAY編-

-MSXBAISC 命令セット2(上級)PLAY編-

-MSXBASIC命令セット2(中級)SOUND編-

-MSXBASIC 命令セット2(上級)SOUND編-

-MSXBASIC 命令セット3(初級+α)FM-MUSIC編-

MSXBASIC命令 セットへ戻る
---


-BASIC命令セット2 SOUND命令(中級)-

いまさらきけない
MSXBASICで効果音を出そう!


昔のBASICでは車、飛行機、波などの音をプログラムで作っていました。
波の音はザザザザとノイズの音がゆっくりと大きくなったり小さくなったりします。
PSGはアクティブに1つの音を出力しているのです。
プログラムモードではBEEPで音を切っているので聞こえないようになっています。

■MSX世代の音を感じる

 音といえば効果音、演奏データをイメージしますが、
MSX世代当初はPCの音が少なくBEEP音というものでした。
音楽に関係なく音を聴くというのは不思議なセンスを醸し出すものになるでしょう。
PLAY"SM30000L1O5F"
このFはA〜Gまで変えてみてください。
GとEのくりかえしでピーンポーンという音ですね。
長い音は神秘的な音に最適です。
PLAY"SM30000L1O5DGB"
PLAY"SM30000L1O3DGB"
これを1から16にして速くします。
PLAY"SM30000L16O3DGB"
もう1つ、
PLAY"SM30000L1O5GED"
PLAY"SM30000L16O5GED"
というふうにできれば
ゲットした音とダメージ音がカンタンにできました。
これからはこのような音をもっとこまかく設定します。

■PSGのスピーカーをON

PSGレジスタ 8,7,9の設定

もっとラクに音を出してみます。
SOUND 8,8
これで出力チャンネルの1の音がONになりました。
PLAY命令などで実行した場合に最後の音が残っています。
7は2チャンネル、9は3チャンネルになります。
止めるときはゼロにします。
SOUND 8,0

■音高の設定

PSGレジスタ、0-1,2-3,4-5ペアの設定

Aチャンネルの周波数レベル

レジスター値は次のとおりです。

0,1 チャンネルAの周波数レベル
2,3 チャンネルBの周波数レベル
4,5 チャンネルCの周波数レベル

1チャンネルで設定する場合は0-1の2つのレジスタペアで行います。
SOUND0,0(0〜255)
SOUND1,0(0〜15)16以上でエンベロープあり

たとえば周波数設定はSOUND1,3はSOUND0,0〜SOUND0,255までの音で
SOUND0,256はないのでSOUND1,4からSOUND0,0になります。
これを以下のプログラムで計算すればなめらかな音の変化を楽しめます。

SOUND8,8:SOUND1,0:FORI=65TO130:SOUND0,I:FORZ=0TO25:NEXT:NEXT:SOUND8,0

これで実行できます。turboRではブワッという音に聞こえます。FORのZ値の25を大きく設定します。
処理が遅くなります。

O4〜O5の音階のデータ

O4C=1AC
O4C#=194
O4D=17D
O4D#=168
O4E=153
O4F=140
O4F#=12E
O4G=11D
O4G#=10D
O4A=0FE
O4A#=0F0
O4B=0E3
O5C=0D6
O5C#=0CA
O5D=0BE
O5D#=0B4
O5E=0AA
O5F=0A0
O5F#=097
O5G=08F
O5G#=087
O5A=07F
O5A#=078
O5B=071

O5Cであれば0D6でSOUND1,0:SOUND0,&HD6となります。
SOUND命令は音階が存在しないかわりに周波数で音を出力します。
周波数を変化させることで、ジャンプしたり落ちたりする効果音が簡単にできます。
SOUND8,8:SOUND1,0:FORI=&HD6TO&H86STEP-1:SOUND0,I:FORZ=0TO4:NEXT:NEXT:SOUND8,0
&HD6と&H86を逆転させてみると落ちる音になります。
SOUND8,8:SOUND1,0:FORI=&H86TO&HD6:SOUND0,I:FORZ=0TO4:NEXT:NEXT:SOUND8,0

■音の長さの計算

これからは2秒ごとにポーンポーン…と鳴る不思議な命令をやってみましょう。

入力を間違えると音が止まってしまいます。
おまけとして波の音も作ってみました。

fclock(入力クロック)は1.78977で
(fclock*1000000)¥(16*Hz)

440Hzの場合SOUND0,254:SOUND1,0になります。
周波数ではわからないので音は16等分されて回っています。
SOUND0が0から255までいくとSOUND1が+1になってSOUND0,0から繰り替えされます。

■ノイズ

SOUND6,&B01110

ノイズの周波数は5ビット(数値は1〜31)まで指定できる。

(fclock*1000000)¥(16*(Hz*1000))

シー(高音)ガー(中音)ゴー(低音)とノイズ音が聞こえる。

■ミキシング

b7b6 b5  b4   b3  b2 b1b0
1 0 CN BN AN C B A

CN-Cチャンネルのノイズセット
C-Cチャンネルの音セット

SOUND7,&B10111111

1で音が出ない、0で音が出る設定になる。
波の音ならSOUND7,&B10110111
すなわちSOUND7,183

■エンベロープ周期

ウワウワウワ、ウーワウーワウーワというエンベロープ(波形)の周期を設定します。

音が減衰して0になるまでの時間を2秒とする

EP=fclock¥256fE

EP=14

CT+(FT¥256)=14¥256

の方程式になり(・@;フム

CTとFTが

CT=54 FT=176になる。

FT値はSOUND11,176となりCT値はSOUND12,54

もっと自由に長さを決めるにはエンベロープ有効と8の波形
SOUND8,16:SOUND13,8
音が決まったらまずSOUND12,1からやってみる。
123456とSOUND12,7で周期が長くなるT=140くらいだ。
もっと落としてみる。SOUND12,20でかなり遅い。
だいたいの長さを決めたら微調整はSOUND11でやってみる。

さて、波の音は波長が長いので^^;
SOUND 12,128:SOUND11,255
これでエラーが出ない限り、音が聴けます。


■エンベロープ形状

PLAY文のSの値をレジスタ13に入れる

SOUND 13,8

波の音であればSOUND 13,14にセット。

★正確に指定するとこんなに(@@〜

 正直言って、自分はヘルツもわかりません、だいたいです。それよりもSOUNDの数値の方を覚えています。

プログラミングする場合はBA=B\256:BB=BMOD256:SOUND 0,255-BB:SOUND 1,というようにします。
これはチャンネルAの音程をBの変数を入れることで指定します。

■サウンドサンプル

★ボイスの代わりに音がなる

美少女ゲームなどではボイスはあたり前な時代になっていました。
昔のゲームでは女性のセリフはピピピピピピで男性のセリフはボボボボボボ
というビープ音に近いものでした。これだけでも、結構雰囲気がありましたね。

★チョロチョロ音を作る

CTRL+Gで音を止めます。
手軽に高音のチョロチョロの音を作ります。

FORI=0TO1:A=INT(RND(1)*255):SOUND1,0:SOUND0,A:SOUND8,10:I=0:NEXT

これはAの値が1〜255のランダムな数を発声させてみます。
もっと音をしぼるならA=INT(RND(1)*128)になって
10〜255であればA=(INT(RND(1)*246)+9)になります。
これで限定したランダムな音を作ることができるわけです。

★PSGスネアを弾く、ドラクエのほこらなど

波の音はどうだったでしょうか?このほか…
実はPSG、FM音源を演奏中にメトロノームのような周期的なスネアの音が可能になります。
PLAY文演奏中にノイズ、エンベロープを有効にすればチチチチチチ…と周期的にノイズを発生できます。
この時にはPLAY文のエンベロープは使えません。
ドラクエのほこらも音を止めると音の大小の波が聞こえます。
ということは波の音と演奏をミックスすることが可能なのです。


■ちょっとハイレベルな使い方

★ルーレット音のような和音

 使い方によってはC(ドミソ)のアルオペジオでクセのあるCの音をSOUNDで作ることができます。
MSX2テクニカルハンドブックの268ページに載っている表を使えば誰でも1チャンネルで可能です。
先にPLAY命令のCの全音符で聞いてみましょう。

PLAY"O5C1","O5E1","O5G1"

では擬似的にSOUNDでやってみます。

10 SOUND8,10
20 FORI=0TO1
30 FORJ=0TO1:SOUND0,&HD6:SOUND1,0:NEXT
40 FORJ=0TO1:SOUND0,&HAA:SOUND1,0:NEXT
50 FORJ=0TO1:SOUND0,&H8F:SOUND1,0:NEXT
60 I=0:NEXT

 このようにやっていきます。60行はI=1では終了するのでI=0に戻して無限ループさせています。
デジタルのルーレットが回っている感じの音がします。

★テルミンのようなプログラム

10 X=100:Y=100:X$="":SCREEN1
20 FORI=0TO7:X$=X$+CHR$(255):NEXT
30 SPRITE$(1)=X$:SOUND8,10
40 A=PAD(12)
50 IFSTRIG(0)THENSOUND8,0:I$=INPUT$(1)
60 X=X+PAD(13):Y=Y+PAD(14)
70 YY=2800+(212-Y)*6:XX=X\2.5
80 PUTSPRITE 1,(X,Y),15,1
90 SOUND8,(256-XX)\16:B=YY:BA=B\256:BB=BMOD256:SOUND0,255-BB:SOUND1,15-BA
100 GOTO40

 マウスを使って上下が音程、左右が音量になっています。
PSGの音がウワオウワオーと鳴ります。
マウスをゆっくり動かしたり速く動かしたりしてみましょう。

YY=2800+(212-Y)*6:XX=X\2.5
2800からの周波数レベル。数値が大きくなると高音になります。
6は音程の変化の具合、数値が小さくなると変化が小さくなります。
2.5は音量の絞り値です。