PC-6001mkIISR/PC-6601SRのオーディオ出力 メモ

SR系機種はFM音源ICのYM2203を搭載しています。このICは、PC-6001初代やmkIIに搭載されているPSG音源にFM音源部を加えたような作りになっています。ICの端子も、FM音源部とPSG部が分離していて、 FM音源部はデジタルデータ出力、PSG部は各チャンネル(3ch)がアナログ出力になっています。スピーカーから音を出すには、FMとPSGをまとめる回路が必要なのですが、そのまとめ方によって、 FM音源部とPSG部のバランスが変わってきます。YM2203を搭載しているハードにはゲーム基板や他のパソコンがありますが、ハードによって回路がそれぞれ異なるので、バランスもまちまちなのです。

そこで、PC-6001mkIISR/6601SRでのFMとPSGのバランスはどうなのかを調べてみたのですが、その経過で判ったことをまとめておきます。

オーディオ出力端子のこと

PC-6001mkIISR/6601SR共に、本体背面にオーディオ出力端子があります。形状はRCAで、オーディオアンプなどに接続できるのですが、PC-6001本体のボリュームを回すと、 オーディオ出力端子からの出力も変化します。ボリュームを上げすぎると、オーディオ出力が大きくなりすぎ、受け側機器(アンプや録音機材)の保護回路が働いて音がひずみます(壊れる?)。 また、音を大きくするとPSGとFM音源のバランスがおかしくなるようです。

PC-6001mkIISRでオーディオ出力をアンプに接続する場合は、ボリュームを最小の状態から1/4くらい回すまでを上限にして、あとは 受け側の機材ボリュームを上げるようにした方がよいみたいです。6601SRではボリュームを1/2か1/3くらいまで回しても大丈夫みたいですが、やはり上げすぎない方がよいみたいです。

あと、RCAコネクタからアンプに接続すると、P6本体のスピーカーからは音が出なくなるという仕様になっています。ちなみ初代ではRF出力からは音が出ません。

スーパーインポーズ端子のオーディオ出力

PC-6001mkIISR/PC-6601SR共に、本体背面にはスーパーインポーズ端子があります。この端子からはオーディオが出力されていて、こちらは本体のボリュームの影響を受けませんから、 理想的なオーディオ出力を得ることができます。RCAオーディオ端子は捨てて、スーパーインポーズ端子を使いましょう。

4番ピンと、2か8番ピンを使います。

注意点としては、スーパーインポーズ端子とデジタルRGBコネクタは共に8PIN DINコネクタなのですが、形状が違います。左がデジタルRGB出力、右がスーパーインポーズ端子です。 間違えて差し込んでしまうことはないので安心ですね。カセットインタフェースもDINコネクタでデジタルRGB出力と同じ形状です。

ちなみに、PC-6001mkIIにも24ピンのスーパーインポーズ端子がありますが、こちらはオーディオが出ていません。

SR BASICでFM音源の音長のメモ

PLAY"t32@1v15c1",,,"t32v15c1"を再生すると、FM音源側が先に鳴り終わります。

PLAY"t32@1v15c1",,,"t32v15r1c1"を再生すると、音が繋がらずに間が空きます。

PLAY"t32@1v15c1d1",,,"t32v15c1d1"を再生すると、FM音源側の音の途切れは大きいですが、FMとPSGで発音のタイミングがずれる事はないです。

FM音源側の音色を変えても結果は同じで、途切れない音色を使ってもFM音源の発音時間はPSGよりも短くなります。

・・・仕様みたいです。

SR BASICの音色設定メモ

SR BASICでは予め12種類のFM音源の音色が定義されていて、それとは別にユーザが音色を3つまで定義できます。以下、マニュアルより抜粋。

YM2203のFM部のレジスタに送るデータ25バイトをRAMに書き込み、その先頭アドレスをワークエリア(音色番号253の場合&HEB4E,&HEB4F)に書き込むと、PLAY文の音色指定(@253)で、そのワークエリアのレジスタ値が使われるようです。25バイトのデータの内訳はREMに書いてある通りです。

ただ、上記例での140行目のTOTAL LEVEL(YM2203のTL)が、実際には反映されないような気がしています。 TLを色々と変えて実機で鳴らしてみても音量が変わりません。また、エミュレータのPC-6001VWではFM音源レジスタの値を確認することができるのですが、 これでみると、TLの値が反映されない(常に02h?)ようにみえます。

TL値は0から127(&H7F)までの値で、小さい方が大きな音になります。0が最大で127は最小(音がでない状態)です。 実機でもエミュレータでも、BASICの音色指定で127を指定しても音が出ますし、TL値を色々と変えても同じ大きさの音が出ます。

上記プログラムで音色設定して曲を流した直後に、SOUND命令を使ってTL値を書き換えると音量が変わります。 例えば、sound64,127:sound72,127:sound68,127,sound76,127で音が出なくなりますし、127を64くらいにすると音量が下がります。 このような方法でTL値が音の大きさに影響することを確認できるので、PLAY文での音色設定はうまくいかないようにみえます。

それから、TLを00hや02hくらいの大きめの音量とした場合、実機のオーディオ出力端子から出力される音の波形がFM音源の特徴であるサイン波にならず、台形になってしまいます。ほぼPSG音源です。これを、同じパラメータでエミュレータから出力するとサイン波になります。これがYM2203のハード仕様なのか、PC-6001mkIISR/6601SRの仕様(特徴)なのかわかりません。調べるには、YM2203を使った回路を組むか、他のYM2203を使ったマシンで確認するのがいいのですが、・・・面倒なので。

[追記]

PSGとFMで音の出る長さが違うのと、TL指定の件は、どちらも仕様(バグ)だと教えて頂きました。→ P6音楽事情③

音の長さの問題は、mkII用FM音源カートリッジPC-60m55では起きないし、PSGとFMで音が出ている時間が違うというのは困るので、SR搭載BASICのPLAY文のバグということで。

TLの件は、vコマンドを使うとOP1-4が全部書き換わるからです。YM2203のFM音源部分の音量はOP1-4それぞれのTL値で決まるので、vコマンドを使うと、OP1-4のTL値が一斉に(同じ値に)書き換えられるのですね。よくよく考えたら、確かにその通りです。ただ、それでいいかといったらFM音源の特徴を活かした音色を使うのであれば、OP1-4それぞれで違うTL値を設定したいわけですから、音色としてのTL値とvコマンドの音量は別であって欲しいなーと思いました。

TLが小さい(音が大きい)と台形になる

TL値が、PLAY文のvコマンドで書き換わるということがわかったので、じゃあ、vコマンドのパラメータを変えたら、どこのレベルで台形がサイン波形になるのかどうかを実機で調べてみました。

PC-6601SR/6001mkIISR実機で実行したプログラム。

録音したWAVデータ

ボリュームを最大から最小までの16段階に変化させて同じオクターブのドを出力しています。 本来の仕様であれば連続した音になるのですが、先のSR BASICのバグでFM音源側の音は短く発音されるのでスキマが出来ます。 結果、こんな形の波形になります。15段階(v0は音が出てないor小さくてみえないです)。

v15の箇所を拡大すると...

台形ですネ。今回はスーパーインポーズ端子から録音していますが、RCA端子を使ってボリュームを上げると台形じゃなくて矩形になります。

v14では...

上がちょっと丸くなってきましたが、下が台形です。上下で非対称に。

v13だと...

上は丸々してるのですが、下がヤバイです。

v12では...

下も丸くなってきました、よかった。

v11では...

こういう波形が欲しかったのですよ。

というわけで、v11以下は曲線波形になりました。v15と比べると音量は落ちていますから、綺麗なサイン波と音量のどちらかを選ぶことになります。

あと、他のパラメータによっても波形は変わるので、必ずしも、v15-v12で波形が崩れるというわけではないです。

オクターブ指定

PC-6001mkIISR/6601SRのPLAY文の文法をザックリと説明すると、play"c","d","e","f","g","a"です。最初の3つがFM、残り3つがPSGで合計6重和音になります。

オクターブ指定は1から8でOコマンドです。

play"o4a",,,"o4a"

で、FM Aチャンネルでオクターブ4のラ、PSG Aチャンネルでオクターブ4のラを同時に鳴らします。

ただし、FMとPSGでは、同じオクターブ指定をしても、発音される周波数が異なるようです。

  O4
FM 約220Hz
PSG 約440Hz

FMの方が1オクターブ低い周波数になります。

BASICではなく、ハードウェアレベルでは、YM2203のFM音源部は、オクターブと音程パラメータを指定して発音します。音程を同じ数値にしたままオクターブを変えると、音程はそのままで発生する音の周波数が倍(もしくは1/2)に変化した音が鳴ります(オクターブが上がると周波数が2倍なります)。YM2203のオクターブ指定は0から7なのですが、BASICのPLAY文では、初代PC-6001の頃からオクターブ指定は1から8でしたから、-1だけずらす必要があります。このため、BASICのO4は、YM2203のオクターブ3となるのですが、YM2203のオクターブ3「ラ」の周波数が220Hzみたいです。

一方、YM2203のPSG部は初代PC-6001に搭載されていたAY-3-8910と同じく、数値で発生させたい周波数を指定します(周波数と設定値は一致していません)。オクターブや音程といった考え方をしない方式で、FM部とは異なるのです。

この辺の、FM音源部とPSG部の違いから、同じオクターブ値を指定しても、発生する周波数が違うという状態になってしまったのだと思います(推測)。

同じオクターブ指定で同じ周波数が出るように、BASICのPLAY文の"O4 "をYM2203のオクターブ4に合わせると、YM2203のオクターブ0が使えなくなってしまいます。PLAY "O0"という様な指定をFM部だけ認めるのも手ですが、今度はPSG部との仕様の違いが混乱しそうですね。

FMとPSGの音量の違い

やっと当初の目的である、FMとPSGの音量の比較に辿り着けました。

FM側の音色によって音量が変化してしまうので、以下の条件としています。これは、別方面から音量調査の話がきた際に頂いた条件です。

アルゴリズム7はこんな感じです。

BASICのPLAY文は、先に調べたとおり、TL値がVコマンドの影響を受けてしまうのでOP1-3のみをOFFにすることができません。AT値を0にすることで無音を作り出せるのですが、Vコマンドで音量最大に指定しても、TL値が02となってしまって00にはならない問題もあるので、PLAY文とはお別れしました。ただし、PSGを鳴らす場合には問題ないのでPLAY文を使っています。

10 CONSOLE,,,0
20 FORI=1TO25
30 READ A$:A=VAL("&H"+RIGHT$(A$,2))
40 READ D$:D=VAL("&H"+RIGHT$(D$,2))
50 SOUND A,D
60 NEXT
100 SOUND&HA4,&H22 'OCT/FNUM
110 SOUND&HA0,&H69
120 SOUND&H28,&HF0 'CH-A ON
130 FORI=0TO2000:NEXT
140 SOUND&H28,&H00 'CH-A OFF
150 FORI=0TO500:NEXT
160 PLAY ,,,"t52o4v15c1"
1100 END
1110 DATA 30,01,38,01,34,01,3C,01:'DT/ML
1120 DATA 40,7F,48,7F,44,7F,4C,00:'TL
1130 DATA 50,00,58,00,54,00,5C,1F:'KS/AT
1140 DATA 60,00,68,00,64,00,6C,00:'DR
1150 DATA 70,00,78,00,74,00,7C,00:'SR
1160 DATA 80,0F,88,0F,84,0F,8C,0F:'SL/RR
1170 DATA B0,07:'FB

同一周波数の「ド」を、FM、PSGの順に鳴らしています。鳴らしている時間はfor文でてきとーに調整しているので違います。

PC-6601SR実機からの出力です。FM音源側の方が、若干、小さいですね。

FM音源の音量を勝たせよう

FM側のOP1-3を無音にしてOP4のみ出力した場合、FMの方が音量が少しだけ小さいという結果になりました。ということは、OP1-4全てを使って戦ったら、PSGに勝てるのではないでしょうか?

先の音量比較のパラメータを加工して、FM→PSGの順に、OPを1個ずつ追加して再生してみました。FM OP1個→PSG、FM OP2個→PSG...FM OP4個→PSGの順ですね。PSGのパラメータは固定なので、常に同じ音(音量)が出ています。

結果は...

OP2個の時点でPSG音量を上回りました、FM大勝利!

・・・ではないのです。

先のテストで、PLAYの音量指定(Vコマンド)が大きい場合、サイン波が崩れる事がわかりました。OPを追加した場合でも、同じことが起きています。

OP1個の時

OP2個の時

OP3個の時

OP4個の時

徐々に台形っぽい波になってしまうのですね。ちなみにPSGはこんな感じの波形で、台形FM音と聞き比べるとちょっと違います。

今回は、FM1音とPSG1音での比較でしたが、FM3和音とPSG3和音で戦ったら、出力MAXでFMとPSGが揃うのではないかと思えるのですが、PSG3音を重ねた場合、単純な矩形波の合計にはならないようで、インベーダーの自機のような凸ような波形に なるようです。音が大きくなると波形が面白い事になるのはFM音源に限らずPSGでも起こりますし、音源ICの特性だけではなく、アナログ回路部分の影響もありますから、予想通りにはなりませんね。そこが面白いところでもあります。

音出力をオシロで見てみる

大きな音を出すとサイン波が台形になってしまう原因はどこにあるのか調べてみました。 調べる際に、P6つくろうブログPC-6001mkIISR回路図を参考にさせて頂きました。

FM音源側のみの出力でPSG(SSG)は止めておきます。FM音源のパラメータは、先ほどと同じです。

30,01,38,01,34,01,3C,01:'DT/ML
40,00,48,00,44,00,4C,00:'TL
50,00,58,00,54,00,5C,1F:'KS/AT
60,00,68,00,64,00,6C,00:'DR
70,00,78,00,74,00,7C,00:'SR
80,0F,88,0F,84,0F,8C,0F:'SL/RR
B0,07:'FB

最初のデータがYM2203のレジスタ番号で、続くデータが書き込む値です。それが25個分あります。 OP1から4のTLは全て最大(00h)で指定していますが、ATが00の場合は、音が出ません。OP4のみ最大値(1F)にしているので、OP4からのみ音が出ます。アルゴリズムは7番です。 音色パラメータ設定後に、オクターブとキー番号を指定して、キーオンをレジスタに書き込むと音が出始めます。ここでは262Hzのドの音を出すように指定しています。

SOUND&HA4,&H22 'OCT/FNUM
SOUND&HA0,&H69
SOUND&H28,&HF0 'CH-A ON

まずは、本体背面スーパーインポーズ端子から出ている信号を見てみます。

音として出力したものをWAVファイル化したものがこちら。

同じ信号をオシロでみたものがこちら。

資料をまとめてて気がついたのですが、ここだけACで読み取ってますね・・・まぁいっか。+1.1V~-1.1Vくらいの範囲で変化しています。

続いて、OPを2個出力ONにした状態の波形をみてみます。

やはり、音をWAVとして録音した時と同じで、波形の下側が平らになっています。

OP3個をONにした波形と4個をONにしたものを続けて。

OP3個でも4個も同じです。上は+2.1Vくらいまでしか上がりません。あと、途中の波形も曲線ではなく直線になってしまっています。下は-1.8Vくらいまでが限界。

FM音源3音で、とにかく色々な音を出し続けてみたのですが、上下の限界は同じ位置でした。

PSG3音最大音量でもやってみたのですが、これも同じ。

PSG3音とFM音源3音の両方を同時に出してみたのですが(6和音最大出力)、同じでした。

YM3014の出力をオシロで見てみる

音源ICのYM2203Bは、FM音源出力をデジタル(シリアル)データで出力しています。PSG(SSG)は3つのチャンネルをバラバラにアナログ信号で出力しています。 これらを音として聞くには、YM2203BのFM音源デジタル信号をYM3014で受け取り、アナログ信号に変換してから、YM2203BのPSG信号と混ぜます。

YM2203Bのデジタルデータを調べるのは一苦労なので、YM3014のアナログ信号化をオシロで見てみました。

ちなみにPC-6001mkIISRに搭載されているのは、よくあるYM2203CではなくてBなのですよね。YM3014はY3014です。

先ほどと同じパラメータを使って、OP1個、2個、3個、4個と出力を増やした時の信号をみてみます。

YM3014の出力はサイン波形でした。これで、YM2203Bのデジタルデータもサイン波を出していることになります。

となると、YM3014の出力後の回路が原因で、サイン波形が台形になっているということになります。

YM3014の出力と、本体背面の音声出力を同時に見比べてみます。まずは無音状態の時。

青い線がYM3014で、赤い線が本体背面の音声出力です。無音状態でYM3014が2.5Vになっています。 詳しいことはよく知りませんが、YM3014のMP端子に供給されている信号の分だけ上がってるみたいです。→ YM2203・YMZ294・SP0256を使ったハードウエアMIDI音源の製作

RB端子の電圧を測ってみたところ、確かに2.5V(IC電圧の1/2)が出ていました。

一応、確認の為に、この状態でOP1個だけで音を出してみます。ここからはACで測定しています。

YM3014の出力(青)と本体背面の出力では、位相が反転してるんですね。

続けてOP4個で音をだしてみます。結果は今までの測定同様、YM3014の出力はサイン波形だけど背面から出る時は矩形になってしまうというものです。

もう一歩踏み込んでみます。

PC-6001mkIISRの回路図によると、YM3014の出力はアンプ(IC32/I93403)を通して2203BのPSG出力と混ぜてから、別のアンプ(IC19)へと繋がっています。 IC19の前後でどうなっているか波形を見比べてみます。アンプ周りの測定方法をよくわかってないので怪しいのですが、原理的にはあってるはずです。

青線が入力、赤線が出力です。入力側の縦軸表示はMAX2V、出力側はMAX 10Vとしていることに注意です。入力波形が妙な形になっているのも気になるのですが(YM3014の出力をPSGと混ぜた時に歪む?)、 そんなことよりOPアンプからの出力波形が矩形になっています。値の範囲は、-7V~+9Vくらいの範囲で、この電圧がどこからきているのかというと、IC19(I93403)に供給されている電圧が+12Vだからです。

→ 追記:色々と助言を頂き、回路の読み方を理解しました。SRの回路では、音源ICからの出力を約39倍くらいまで引き上げるようです。元の波形を上方向に39倍伸ばすイメージです。 ただし、SR内蔵アンプには、そこまで伸ばす性能はありません。結果的に、サイン波形を39倍引き延ばそうとすると、一定の高さ以上にはならず、上限部分が平らになってしまいます。 また、サイン波は、頂上部分はマルッとしてますが、足下部分は比較的直線です。足下部分は39倍伸びてより直線に、その途中からは頭打ちで平らになってしまい、矩形波になってしまうようです。

PC-6001mkIISRの回路では、このアンプからの出力が分岐して、本体背面のスーパインポーズ端子側回路と、音声出力回路(スピーカ出力回路)へとつながっていますから、 スーパインポーズ端子側の最終のアンプの入出力を見てみます。

赤線が入力、青線が出力です。-7V~+9Vの入力信号が-1.8V~2.1Vくらいの範囲に収まるようになって、これが本体背面のスーパインポーズ端子から出ているわけですね。 前のアンプの波形が小さくなるだけですから、矩形波は(小さな)矩形波に、サイン波は(小さな)サイン波になります。

ちなみに、背面出力端子からの信号を別のアンプにつないでスピーカ出力した状態(負荷をかけた状態)でも同じ結果でした。

以下、オマケ。

YM3014の出力(2番ピン)と、その直後にあるアンプIC32(I93403)の出力(7番ピン)は変わらないです。2.5Vを中心に上下。

その後にある、タンタルコンデンサ(C54)のマイナス側をみてみると、0Vを中心に-1.2Vから1.2Vくらいの間で上してます。この直後にPSGと混ざります。

まとめ

結論&要点をまとめると...

なんだか救いの無い結論なのですが、普通に使っていれば(他のYM2203搭載機と聞き比べたりしなければ)、そんなに気にならないと思います...