FM音源プログラム (12) -- オペレータ (5)

F-NUMBER

「YMF715x (OPL3-SA3) -Register Description Document-」(以下「rege」と略記) では、 F-NUMBER について、

Frequency Information : These bits determine the frequency information for one octave.

と説明しています。
これだけでは何のことか良く分かりませんが、具体的な式

\qquad \displaystyle\text{{F\underline{ }Number}} =  \frac{(\text{Tone Pitch}) \times 2^{19}}{2^{{\rm BLOCK}-1} \times 49.518 {\rm kHz}}

と、BLOCK = 4 の時の具体的な数値の表

音名 周波数[Hz] F_Number (10進)
C   261.6   346
C#   277.2   367
D   293.7   389
D#   311.1   412
E   329.6   436
F   349.2   462
F#   370.0   490
G   392.0   519
G#   415.3   550
A   440.0   582
A#   466.2   617
B   493.9   654
C   523.3   693

も記載されています。
ここで、前回示した式
\qquad \text{phinc} = 2^{\small N} \cdot T \cdot f = {\rm F}\underline{\; }{\rm Number} \, \times \, 2^{\small\rm BLOCK}
から、フェーズアキュムレータに必要なビット数 N を求めてみます。
まず、周波数ですが、オペレータの最終的な周波数は基本のピッチ周波数に MULT で表現されている倍率をかけたものになります。
MULT > 0 の場合は整数倍なのに、MULT = 0 の場合だけ 1/2 倍で、処理が異なっているのは効率的ではありません。
そこで、あらかじめ基本ピッチ周波数を MULT = 0 の場合に相当する 1/2 倍にしておいて、MULT の倍率の方は 2 倍しておき、両者を掛け合わせた結果の周波数が目的の値になるようにします。
具体的には、MULT=0 で 1 倍、MULT=1 で 2 倍、MULT=2 で 4 倍、... MULT=15 で 30 倍にします。
したがって、 F_Number の計算には、目的の周波数の半分を代入します。
サンプリング周波数 f_s とサンプリング周期 T の関係 T = 1/f_s から、前の式は、
\qquad 2^{\small N} \cdot f / f_s = {\rm F}\underline{\; }{\rm Number} \, \times \, 2^{\small\rm BLOCK}
となります。 両辺の 2 の対数を取り、整理すると、
\qquad N + \log_2 ( f / f_s ) = \log_2 ({\rm F}\underline{\; }{\rm Number}) + {\rm BLOCK}
\qquad N = \log_2 ({\rm F}\underline{\; }{\rm Number}) + {\rm BLOCK} + \log_2 ( f_s / f)
となります。

  • fs = 49518
  • BLOCK = 4
  • F_Number = 582
  • f = 440.0 / 2

を代入すると、
\qquad \begin{eqnarray*}N &=& \log_2 (582) + 4 + \log_2 ( 49518 / 220.0) \\ & = &9.18 + 4 + 7.81 \\ &=& 20.99 \end{eqnarray*}
となり、OPL3 のフェーズアキュムレータの幅は 21 ビット以上であることが推測されます。