OPNAのADPCMのDELTA-N

DELTA-NというのはOPNAのADPCM再生時の速さを指定するためのパラメータ。楽器音でいうと音高を決めるためのものですね。

OPNAのアプリケーションマニュアルには、\(\)

\[\mathrm{DELTA–N} = (f_\mathrm{sample} / 55.5 \mathrm{kHz}) \times 2^{16}\]

みたいな式が、「\(f_\mathrm{sample} = 8 \mathrm{kHz}\) のとき \(\mathrm{DELTA–N} = 9447\)」という例と共に掲載されている。

きっと、\(\frac{8000}{55500}\times 2^{16}=9446.63\cdots\) なので、四捨五入して 9447 ということでしょう。

しかし、普通に考えると 55.5 kHz みたいな(マスタークロックから考えると)半端な周波数を生成しているとは思えないので、おそらく実際にはマスタークロック 8 MHz を 144分周(4 MHzを72分周?)して得られる 55.555… kHz ではないかと。そうすると DELTA-N は 9437 になるのだけれど、まあ楽器屋さんが 9447 と言ってるのだし、2セントも違わないし、実用上はどっちでも問題ないかな。

あと、我らが PC-8801系(もう持ってないけど)は例によってマスタークロックが少し低い(4 MHz→3.9936 MHz 8 MHz→7.9872 MHz)【※2022-09-06 末尾に追記】ので、また違った値になる。基準が 55.466… KHz とかになるので、同じように計算すると DELTA-N は 9452 かな。

ここで mucom88 がどうなっているかを見ると、

https://github.com/onitama/mucom88/blob/master/pc8801src/ver1.2/music.asm#L3012

PCMNMB:		; C-B マデ ノ サイセイ サンプリング レート
	DW	49BAH+200,4E1CH+200,52C1H+200,57ADH+200
	DW	5CE4H+200,626AH+200,6844H+200,6E77H+200
	DW	7509H+200,7BFEH+120,835EH+200,8B2DH+200

何故かわからないけれど、16進+10進で書かれている。しかも +200 の中に1箇所だけ +120 がある。

最初の 49BAH (18874) の16進部分だけを 55.555……kHz 基準で計算すると 15999.688… Hz なので、16 kHzを出すために用意された値に見える。+200 の根拠は不明だけれど、PC-8801 に持ってきたときに補正しようとした感じですかね?

実際には +200 はやりすぎなんですが、楽器として使う分には味になってる感じかと。そもそも、時代を考えると、きっちり音程の合ったサンプルが簡単に入手できるわけでもなかったですし。


ただ、実は「8 kHzで再生すると丁度1小節の長さのはずのサンプル」を o2c1c1 で続けて再生すると途切れるので調べていたんですよね。(テンポの精度は考慮済み)

mucom88 だと o2c の DELTA-N は \(\frac{18874+200}{2} = 9537\) なのだけれど、前述の通り PC-8801 で 8 kHz(に近い値)を出す DELTA-N は \(9452\)(のはず)。その差は 9452 – 9537 = -85 なので、D-85o2c1c1 で再生したら良さそうな感じになりましたとさ。聞いた感じだけで、本当に 8 kHz になってるかどうかまでは調べてないけれど。

追記(2022-03-14)

オクターブのシフトをする前にデチューンの計算をしているようなので、 \(\frac{18874+200+D}{2} = 9452\) つまり \(D=-170\) なので、D-170o2c1c1 で再生するのが正しい(8kHzに最も近い)模様。

具体的には以下の (IX+9), (IX+10) がデチューンの値で、オクターブの処理はその後の ASUB7: で行っている。
https://github.com/onitama/mucom88/blob/master/pc8801src/ver1.2/music.asm#L584

追記(2022-09-06)

OPNAのマスタークロックは(OPNと同じ3.9936MHzではなく倍の)7.9872MHz。で、この8MHzより微妙に低いのはPC-8801(PC-9801も?)特有の話かと思ったらYM2608のデータシート(正式名称不明・アプリケーションマニュアルではない)の数箇所に「7.9872MHz」と書かれているので、これが正しい仕様なのかもしれない。アプリケーションマニュアルには「標準8MHz」と書かれているので、どっちやねんという感じですが。

それで、ADPCMの項の55.5kHzというのは55.555…ではなく55.466…の近似値のようです。何故55.6でないのか不思議ではあった。