読者です 読者をやめる 読者になる 読者になる

Lost Technology

レトロPC、レトロゲーム、チップチューン等の主に技術的な雑記

OPM系のマスタークロックと発音周波数

OPM系チップ*1では、発音する周波数を直接指定せずに、内蔵の周波数テーブルのインデックスをoct(0~7), kc(C+~C), kf(0~63)の3パラメータで指定することになっています。
しかし、この内蔵テーブルはマスタークロックが3.579545MHz*2である前提で作られているので、3.579545MHz以外のマスタークロックを使用する場合は、データシートどおりに設定しても本来発音したい周波数では発音されません。
たとえば、マスタークロックとして4MHzを使用する機種では、A4(440Hz)を出したい場合はG4を指定するといった制御がされています*3
では4MHz以外の場合はどうしたらいいか、というのを解説します。
まず前提として。
平均律では1オクターブの中を均等に12音に区切っています。1オクターブ上がると周波数は2倍になるので、半音だと2(1/12)=1.059463094...倍ということになります。
さらにOPMでは半音の間をkf*4というパラメータで64段階にわけていますので、kfが1上がると2(1/768)=1.000902943...倍ということになります。

OPMの内蔵テーブルは3.579545MHzが基準なので、それ以外の周波数をマスターとすると、マスタークロックMと3.579545の比が、「kc/kfレジスタの指定と実際に発音される周波数」の比になります。
たとえばM=4MHzの場合は、4.0/3.579545=1.117460459...倍の周波数が発音されることになります。

というわけで、2(x/768)=(M/3.579545)となるようなxを求めれば、マスタークロックの差分を補正するkfのオフセット量になります*5

以上を踏まえて、指数方程式をたてると、
x=768*log2(M/3.579545)
というわけで、4MHzの場合はx=123.0518657...となるので、kc/kfの指定上は「kcを全音下げてkfを+5する」あたりで近似されることになります*6

上記の指数方程式は、OPMで平均律以外の音律を使いたいときにも使えます。
ノートごとに「目的の音律における周波数と平均律の周波数」の比からkfのオフセット量を求めてテーブル化すればいいことになります。

*1:YM2151, YM2164, YM2414

*2:NTSCサブキャリア周波数

*3:実は全音下げると下げすぎなんだけど、ほとんどのドライバでは固定で全音下げてるようだ

*4:Key fractal

*5:たぶん高校数学の範囲だと思う。

*6:kc/kfの繰り上がり/繰り下がり計算が地味にめんどくさいけど。kcは不連続だし…