よもやもダンプ

音楽、サッカー、プログラムなどをだらだらと。

YM2608のPSGでAtari STの曲みたいなのをしたい

Atari STのPSG(YM2149)とYM2608(OPNA)のPSG部分がほぼ同じなら、同じこともできるはずでしょ、ということでテクニックを1カ月ほど調べてみたのでメモ。
実チップで再現するには知識が足らなすぎるので、作ったVGMファイルをVGMPlayで再生する方法で試した。
未確認情報あり。

Buzzer Effect

矩形波しか出せないPSGで三角波やノコギリ波に近い波形を出す。

YM2149などのPSGはduty比0.5の矩形波を出力する。これはトーンジェネレータで1と0を等間隔で繰り返したものにボリュームレジスタの値を掛け合わせたもの。
更に調べるとWikipediaのPSGの項目にも書いている通り(PSGPCMの原理)、$07ミキサーでトーン発声をoff(1)にすると消音してるように聞こえるけど、実際にはトーンジェネレータで常に1を出力した状態になる。

さらにここでハードウェアエンベロープをかけると($08~0Aの第4ビットを1、$0Dでエンベロープ波形指定)、出力波形がエンベロープ波形そのまま(これもWikipediaエンベロープより)。あとは鳴らす音の周期に合わせて$0B,0Cでエンベロープ周期を設定。

PSGの音量値は対数的に変化するので綺麗な三角形にはならず若干とがった形になる。
エンベロープ周期は細かく設定できないので、低音だけで使うのが多いかんじ?例えばベースとか。
ミキサーをoffにせずエンベロープを実行させて、歯抜けみたいな波形を作ることもできるみたい。

Sync-Buzzer

エンベローブ実行中に$0Dのエンベロープ波形を再設定すると、ハードウェアエンベロープがリセットされて新たに実行開始した。
ということは、別チャンネルで鳴らした音の周期と同じタイミングでリセットをかけるとsync効果ができる、のかな?未確認。
でもTaoさんの曲を聴いてると、他のチャンネルに関係なくリセットがかかってる気がする...

SID voice

PSGのduty比を0.5以外に無理やり変化させる。パルス幅変調(PWM)させてSIDのパルス波っぽい音を鳴らす。

$07ミキサーでは普通にトーン発音(0)させる。普通の矩形波の上から音量を0-maxに切り替える音量マスクをかぶせる。
音量マスクは矩形波と同じ周期にする。周期/2で音量を切り替える。初期音量マスク値は0。
矩形波をキーオンしてからduty比分だけ経ってから音量マスクを開始させる。

f:id:RerrahKR:20171213200620p:plain

実際の音量マスクの動きは図の赤丸のみたいに変化する地点で$08~0Aで音量指定をするだけでok。
音量マスクの切り替え時間を変化させるとマスクがずれていってPWMができる。

これは自分が考えた方法なので実際は別のやり方で実現してるのかも。
たぶんSID voiceが一番実装し辛そう。でも一番やってみたいのはこれだったりする。
これができるようになったらFM+SIDみたいな曲が作れそうで面白そうなんだけどなぁ。

レゾナンスフィルタ効果

キーオン直後にBuzzer Effectを一瞬だけ入れて、そのあとパルス波を発生する?
JessさんのMy First Resonant Burpにこの音があるけど、よくわからない。

フィルタ効果?

まだ試してない。
Buzzer Effectで三角波の波形を出力するときに、波形の山の高さが最大になるあたりだけ発音するようにし、それ以外の部分は音量を0にする。
発音する幅を変化させることでフィルタ効果(?)がでる。
TaoさんのAliveのBirth-part2で使っているのを確認。


VGMファイルを一つずつ作って確認するのはつらい。
やっぱり編集ソフトみたいなのが欲しい。

Taoさんが色んなテクニックを編み出したみたいなことを見たので、本人が作った色々エフェクトが掛けれるトラッカーMagic Synthを試しに使ってみようと思ったけれど、マニュアルがなくて使い方が分からず挫折した。
まあ、いきなりなんでもかんでも突っ込まない方がいいのかもしれないけど...

参考