YMF825のFNUM, BLOCK値の計算方法について
FNUMと発音周波数の算出
YMF825Boardのリポジトリ にエクセルファイルがあり、そこに式が埋め込まれている。式を変形していくと、かつてのYMシリーズによく似た形になる。
以下の式において、$ FはFNUM値、$ BはBLOCK値、$ fは発音周波数 (Hz) である。
$ F = \frac{2^{19}f}{48000 \cdot 2^{B - 1}} (1)
(1) を$ fについて変形すると、
$ f = \frac{48000 \cdot 2^{B - 1} F}{2^{19}} (2)
また、(1) (2) を変形して計算量のより少ない形にすると、それぞれ、
$ F = \frac{2^{13-B} f}{375} (3)
$ f = 375 \cdot 2^{B - 13} F (4)
FNUMの実際
上記で得られるFNUM値は実数だが、レジスタに書き込む際は 0 以上 1023 以下の整数にクランプする必要がある。1024 以上になった場合はBLOCK値を加算し、FNUM値を2で除算する。
原理的にFNUM値が低い値の場合に整数キャストを行うと理想とする発音周波数との差が大きくなるため、注意を要する。
実際にはFNUM値、BLOCK値、整数キャストを行った結果発生する誤差は基準周波数 (440Hz) が変化しない限り不変であるため、定数化するかLUT化できる。誤差値はピッチベンドと乗算して、YMF825のINT, FRACレジスタに結果を書き込むと精度が上がる。