mucom88のDetune

周波数をずらして重ねると音が厚くなる、というのはよく使うテクニック。それ以外でもたまたま同じ音程の音が重なったときに、まったく同じ周波数だと不自然になることがあって、Detune はとても重要。

mucom88 MML の場合 D コマンドなのだけれど、MMLリファレンスには

ディチューン (-32768~32767) 後ろに+を指定した場合、絶対指定でなく現在値からの相対指定になる

と書かれているだけで、どんな数値を指定するとどれくらいずれるかは書いてない。「考えるな、感じろ。」ということか。

配布されている古代先生の作品 (mucom88win_yk2mml191012) だとFMパートは D4~D6、PSGパートは D16 が多いように見える。

・・・\(\)

で、調べてみると、(FMパートの場合)FM音源チップに指定するF-Numberに、指定した値が直接加算される模様。

F-Number は周波数を決めるための値で、出てくる周波数はこの数値に比例する。mucom88の場合以下の値になっている。(ソースの FNUMB: )

音階F-Number(10進)
c26AH(618)
c+28FH(655)
d2B6H(694)
d+2DFH(735)
e30BH(779)
f339H(825)
f+36AH(874)
g39EH(926)
g+3D5H(981)
a410H(1,040)
a+44EH(1,102)
b48FH(1,167)

オクターブはF-Numberとは別のBlockで指定するので、音階とF-Numberの関係はどのオクターブでも同じ。

それで、c+とcの差は \(655-618=37\)、dとc+の差は \(694-655=39\)、(中略)、bとa+の差は \(1167-1102=65\)、なので、同じ半音でもそれぞれ数値が異なる。

一番極端なのはオクターブを跨ぐbとcの関係で、cから半音下げるのに必要なのは \(\frac{1167}{2}-618=-34.5\)(\(-34\) か \(-35\))、bから半音上げるのに必要なのは \(618 \times 2-1167=69\)。要するに同じ音程なのに向きが違うだけで最大2倍違うことになる。

なので、厳密な周波数比(音程)を指定したければ音階ごとにデチューンの値を変更するしかないけれど、そこまで求められることは少ないので、間をとって \((\sqrt{34.5 \times 69}\approx)\) 49 くらいが半音と考えるのが良さそう。

PSGは(大小関係が逆だったり)計算方法が違うけれど。音階によって値が違うのは同じで、これも同じように間をとると 160 くらいが半音

前述の古代先生の作品の例は、FMもPSGも(厳密ではないけれど)半音の1/10くらい上げているのが多い、ということになる。