超暇人MSX

Programmable Sound Generator

PSGについて書いてみました。PSG=“Pretty Sexy Girls” の略語では無いんですよ。図はテキトーです。私は物理とか楽典とか分かりませんので、ウソ800かもしれません。

音とは何か?

“音”とは、何らかの原因で起きた “気体分子の密度の変化で起きる波(弾性波)” を生き物が特定の感覚器官で感じたものです。なので(昔の特撮やアニメ以外の)真空に近い宇宙空間では音はしないハズです。また、扇風機を回して前に頭を持って行き耳を向けると 「バババ・・・」 という様な風の音がしますが、手を持っていっても音はしません。手で感じる場合は “風” で、耳で感じたときに “音” となります。通常 “音” と言う場合は、人の耳で聞こえる範囲の空気の波動を指しますちなみに、水は空気の4倍、固体はそれ以上に振動 (もしそれを耳で感じられれば “音” ) を伝えるそうです。

音は気体の波

大気中で高速に物を振動させると、その振動に応じて一時的に空気の密度が濃い部分と薄い部分(疎密差)が出来て、空気の波=音が発生します。特に指向性を持たせない限り、音は全方向に球状に広がります。右図は音の作る球の断面図と、音源からの一定距離の空気密度の高い低いを、時間を横軸にとってグラフにしたものです。ガラスの水槽に起した波を横から見たような “波形” グラフとなります。

波形と音の関係
 音を電気信号の波形に変えれば、音の高さは周波数(周期の細かさ)、音の大きさは振幅(×2=波の高低差)となります。特定の周期で空気が振動する時に人が感じる音に名前を付けて整理したものが、音楽の音名や音程です。440Hzから880Hzの様に2倍の周波数の間を、同じ比率で音が高くなっていくように12段に分けたもの(完全平均律)が普通に使う音階(スケール)で、通常は440HzのAの音(ハ長調ならラ)を中心にして、おおよそ人の耳で差が分かる範囲である12×8段(8オクターブ)の音階を使います。

ページのTOPへもどる

シンセサイザの原理

音の高さ(音高)は波形の周波数、音の大きさ(音量)は波形の振幅なので、電気的に作った波形の周波数や振幅を任意に変えてから空気の波に変換すれば、原理的には自由に好きな高さと大きさの音を発声できるわけです。また、その波形をある音の波形そっくりに似せれば、その音色が再現できるわけです。そういう考えに基づいて作られた機械がシンセサイザです。

シンセサイザの基本構成

VCO(DCO、OSC)・・・電圧制御型オシレータ。元にする音の高さ(レンジ                 )と波形を決める  VCF(DCF)    ・・・電圧制御フィルタ。元の波形に倍音を加減したりフ                 ィルターをかける  VCA(DCA)    ・・・電圧制御型アンプ。音量とその時間による変化をつ                 ける  NG          ・・・ノイズジェネレータ。特定の周波数を保たない信号                 (擬似乱数の周波数信号)を出す  LFO         ・・・低周波オシレータ。VCOより低い周波数を発生し                 トレモロやビブラートに使う  EG          ・・・エンベロープジェネレータ。VCAをコントロール                 して、パターンどおりに音量を変える

 自然の音は、ある周期の音(基音)と、その整数倍の周期の音(倍音)が複数合わさったもので、それが音色(倍音の含み具合による波形の違い)を作ります。音色が違っても、周期が同じなら同じ高さの音に聞こえます。人の声の様に一見ギザギザに見える音の波形も、時間を拡大すればサインカーブっぽい波形の集まりです。 音色とは?
エンベロープとは?  その他に音の感じを作る要素として、音を出して消えるまでの音量の変化があります。ピアノはキーを押して出た音の音量がすぐ変わる「ポォーン」という音で、オルガンはキーを押している間中ほぼ同じ音が出る「ブーーー」という感じの音ですよね。そういう音量の変化を波形の振幅の変化で表し、振幅の頂点を結んだものが「エンベロープ」です。
 シンセサイザで実楽器の音を真似しようとする時、音色(倍音の含み具合)を似せると共に、エンベロープ(音量の時間的変化)を似せる事がとても重要で、昔の人がそのエンベロープをアタック(立ち上がり)、ディケイ(減衰)、サスティン(持続)、リリース(消滅)の4つに分けて表し、調整する事にしました注1 ADSR

それだけではまだ、実楽器に似ない事もあるので、さらに波形を加工して音に効果をかけられるようにもしました。

 効果の色々

 ビブラート ・・・周期的に音の高さを少し変え(周波数をずらし)て戻す事を繰り           返し、音を震わせる  トレモロ  ・・・周期的に音の大きさを少し変えて戻す事を繰り返し、音をうねら           せる  ポルタメント・・・ある音と別の高さの音の間を(半音より)細かく補完して、滑ら           かに繋ぐ  ディレイ  ・・・少し遅れて、同じ音を小さくして出す。山彦。エコー  リバーブ  ・・・ホールや風呂場のような反響をつける。残響。ある音が、壁・床           ・天井などに反射して60dB減衰するまでを残響時間と言い、会議           、演説、映画、歌物、管弦楽の順に0〜2秒程度が最適時間  コーラス  ・・・少しだけずらした音をだして、同じ音を複数で演奏しているよう           に見せる。和声のコーラスではなくユニゾン?

ビブラート トレモロ ポルタメント  残響(順次音量&間隔減衰ディレイ)
シンセサイザの効果 残響の定義

注1.シンセサイザが考えだされた当時は、発生させたアナログ信号を、人が摘まみを     回して調節して音を作る方法だった為、4つ位にしか分けられなかった。現在の     楽器音はPCM(実楽器音をデジタル録音したもの)なので、この4つの役割は     似せるというより音の加工用に変わったのかも??

ページのTOPへもどる

PSGは超簡易シンセサイザ

もともとビデオゲームに使用する事を意識して作られた低価格音源がPSG(プログラマブル・サウンド・ジェネレータ)です。80年代には、最もポピュラーな音源でした。最大3つのトーン(ピーという感じの音)に1つのノイズ(ザーという音)を混ぜて同時に発声できます。3つの音はICの別のピンで出力されるので、チャンネル毎に音を左右のスピーカーに振り分けることも出来ます注2。幾つか同等のチップがありますが、MSXではAY-3-8910(相当品)というものです。チップ自体や呼び方も違うPC-8801(mkIISR以降)でも、レジスタ構成は同じです。

 PSGレジスタ ┌──┬─────────┬─┬─┬─┬─┬─┬─┬─┬─┬────┐ │  │   機能    │7│6│5│4│3│2│1│0│ 説明 │ ├──┼─────────┼─┴─┴─┴─┴─┴─┴─┴─┼────┤ │ 0│チャンネルA周波数│  周波数 下位8ビット   │    │ ├──┤         ├───────┬───────┤    │ │ 1│         │−−−−−−−│ 上位4ビット│    │ ├──┼─────────┼───────┴───────┤    │ │ 2│チャンネルB周波数│  周波数 下位8ビット   │    │ ├──┤         ├───────┬───────┤    │ │ 3│         │−−−−−−−│ 上位4ビット│    │ ├──┼─────────┼───────┴───────┤    │ │ 4│チャンネルC周波数│  周波数 下位8ビット   │    │ ├──┤         ├───────┬───────┤    │ │ 5│         │−−−−−−−│ 上位4ビット│    │ ├──┼─────────┼─────┬─┴───────┼────┤ │ 6│ノイズの平均周波数│−−−−−│  5ビット   │    │ ├──┼─────────┼───┬─┴───┬─────┼────┤ │ 7│ミキサー&ポート │B│A│C│B│A│C│B│A│ *1 │ ├──┼─────────┼───┴─┬─┬─┴─────┼────┤ │ 8│チャンネルAの音量│−−−−−│M│ 4ビット  │    │ ├──┼─────────┼─────┼─┼───────┤    │ │ 9│チャンネルBの音量│−−−−−│M│ 4ビット  │ *2 │ ├──┼─────────┼─────┼─┼───────┤    │ │10│チャンネルCの音量│−−−−−│M│ 4ビット  │    │ ├──┼─────────┼─────┴─┴───────┼────┤ │11│エンベロープ周期 │  周波数 下位8ビット   │    │ ├──┤         ├───────────────┤    │ │12│         │  周波数 上位8ビット   │    │ ├──┼─────────┼───────┬─┬─┬─┬─┼────┤ │13│エンベロープ波形 │−−−−−−−│C│T│L│H│ *3 │ ├──┼─────────┼───────┴─┴─┴─┴─┼────┤ │14│ポートA     │               │    │ ├──┼─────────┼───────────────┤ *4 │ │15│ポートB     │               │    │ └──┴─────────┴───────────────┴────┘  *1.ビット0〜2はトーンのオンオフ、ビット3〜5はノイズのオンオフ     (全て0でオン、1でオフ)。ビット6と7はポートの入出力選択  *2.M=MODE・・・0のとき、下位4ビットで音量調整。1のとき     エンベロープ使用、音量調整無効  *3.各ビットの意味(それぞれ1の時ON、0の時OFF)      C=CONT・・・下位2ビットと繰り返しの有効無効       (Continue)      T=ATT ・・・1回目の山が反転する=開始0終わり15になる       (Attack)      L=ALT ・・・2回目は1回目の状態を反転する       (Alternate)       H=HOLD・・・2回目を飛ばして2回目の終わりの音を保つ       (Hold)     これをビット3から順に見ていく。例えば1011の場合。     下位2ビット有効、1回目の立ち上がり15、終わり0     2回目の山は反転するが、飛ばして終わりの15を保つ、で        1 2       U山U山U       │\│ ̄ ̄ ̄ ̄ ̄ ̄     という形になる     全エンベロープ(ビット組み合わせ)パターン8種類           8 |\|\|\|\|\|\ 1000      0〜3、 9 |\           0000 0001 0010 0111 1001          10 |\/\/\/\/\/\ 1010          11 |\| ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 1011          12 /|/|/|/|/|/| 1100          13 / ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 1101          14 /\/\/\/\/\/\ 1110      4〜7、15 /|           0100 0101 0110 0111 1111  *4.汎用に使える8ビットパラレルポート。レジスタ7のビット6と7で     ポートAとBそれぞれの入力か出力かを選ぶ。これが無いチップも有る  参考:PSGレジスタに入れる値

PSGブロックダイアグラム  PSGには、前節の図『シンセサイザの基本構成』のうち、VCFとLFOに当たる部分が有りません。すなわち、ハード的に音色を変える機能は無いということです。内蔵の簡易エンベロープジェネレータはあるのですが、使用すると音量の調節が出来ない&チャンネル毎に違うパターンは使えない為、使い勝手が良くありません。
 結局、PSGで音楽やゲームのBGMに(ある程度の)音色をつけて演奏させるには、マシン語で割り込み毎に細かく音を変えて誤魔化すしかないのです注3
 現在、ソフト的にPSGに音色をつけて曲やゲームのBGMを演奏させるのに、欧米で一般的に使用されているフォーマットがPT3で、元はSPECTRUM(スペクトラム)という欧州の8ビットパソコン用に考えられたものです。
PSGは矩形波

そのPT3の実質標準の作曲用ソフトがWindows上で動く『Vortex Tracker IIです。残念ながら日本語Windowsではエディット部のフォントが等幅にならないので、少々使い辛い所があります。慣れれば最強のPSG作曲(トラッカー)ソフトらしいのですが。

注2.東芝のMSXでは音を左右に振り分けていたが、当時は大多数がモノラルテレビ     なので“ステレオ→モノラル変換”というコードを使わなければ片方の音が聞こ     えなかった

注3.『マジンナースB』では面倒くさいので、内蔵のエンベロープを使った。だから     BGMは、かなりヘロヘロかもしれない(と自分の作曲能力を棚に上げる)。ま、     BGM以外も全面的にヘロヘロだけど

ページのTOPへもどる

案外おしゃべりPSG

MSXでPCM音(Windowsで言うところのWAV)を再生する方法は、私の知る限りMSX-AUDIOの“ADPCM”やTurboR内蔵の“8bitPCM”というハード系の2通りと、1ビットサウンドポートを使う“DPCM”やPSGを使う“4bitPCM”とFM音源を使う“4bitPCM”というソフト系3通りの、計5通りが有ります他に欧州の「MOONSOUND」という音源カートリッジで16bitサンプリングが出来るらしいです(?)。エミールソフトの「とーくまん」というカートリッジでもPCMの録音再生が出来るそうです。コナミのSCCチップでも4bitPCMが出来ましたっけ??

PSGを使うPCMはとても簡単で、PSGレジスタ0と1を0にしてから、レジスタ8に4ビットPCMデータを(ウェイトを入れて速度を調整しつつ)送るだけです。2011年の今なら、そのPCMデータを作るのも、Windowsで8bitモノラル非圧縮WAVの素材を作り、ヘッダ部を取ってから4ビットPCMデータに変換(要するに1バイトずつ16分の1して、空いた上位4ビットにも空きが無いようにデータを詰めるように注4)すればいいだけです。再生プログラムをマシン語で素直に作れば、MSX1でも22050Hz辺りまで十分に再生できます。
 とはいうものの、CPUのZ80は1度に64KBのメモリしか扱えないので、もし128KB以上メモリを積んでいても、バンク切り替えしないと、(サンプリングレイトで変わりますが)8秒程度の再生時間が限度(しかも、メモリ内にはPCMデータと再生プログラム以外無しで)ですし、短い間隔で絶えずメモリからPSGにデータを送る(OUTする)必要が有るため、かなり重い処理となります。
 また、当時はソフトの媒体がパッケージROMかフロッピーディスクなので、PCMデータもあまり入りません。PCM再生自体は難しくないのに、そういう容量的な理由で音声(PCM)をメインにしたソフトは、ほとんどありませんでした。

MSX上でPSGのPCM音声を使った市販ソフト中、1番有名なのがコンパイルの『魔導物語1-2-3』で、中々良くしゃべる上にゲームも面白いです。ナムコの『ファミリースタジアム』も何だかんだしゃべります(2+以上だとスムーズにスクロールしますし)。天才Daniel Vik氏のMSX1メガデモ『WAVES』では、PSGのPCMで延々とBGMを鳴らしつつアニメします。

注4.PSGにデータを送る際は1バイトずつなので、詰めたデータを元の08Hとか     0AHとか上位4ビットが0の1バイトデータに戻してから送ること。面倒だけ     ど、こうしないとデータ容量が倍になって、ただでさえ少ないメモリが超無駄に     使われることになる

ページのTOPへもどる

このページは、1024×768画面に合わせて作りました。ちゃんと見えなかったらスミマセン