Makeで新しいFM音源チップが出ていたようですが、元祖FM音源チップのYM2203(OPN)を久しぶりに復活させてプログラムを作るためにF-Numberをrubyで計算してみました。
# Calculation YM2203 F-Number value
oct = 4
div = 6
if ARGV.count == 1 then
clk = ARGV[0].to_f
# C#, D, D#, E ,F, F#, G, G#, A, A#, B, C
note = [277.2, 293.7, 311.1, 329.6, 349.2, 370.0, 392.0, 415.3, 440.0, 466.2, 493.9, 523.3]
for var in note do
fnum = (var * (2 ** 20) / (clk * 1000 * 1000 / (12 * div))) / (2 ** (oct - 1))
print fnum.floor.to_s + ", "
end
print "¥n"
else
print "% ruby fnum.rb [clock MHz]¥n"
end
入力クロックを引数に4オクターブの6分周(デフォルト)を計算します。
3.6 MHzで計算してみます。
% ruby fnum.rb 3.6
726, 769, 815, 864, 915, 969, 1027, 1088, 1153, 1222, 1294, 1371,
昔亜土電子で購入した時にチップに付いてきた日本語のデータシートはコピーの 字がつぶれて解読するのが骨でした。そもそもYM2203のデータシートはちょっと分かりにくい気がします。
C#始まりなのはデータシートに合わせています。
まるめはfloorではなくてround(0)の方が良さそうですがデータシートのビットデータはfloorされているようです。
ちなみにYM3528(OPL)の計算式は以下になります。
fnum = (var * (2 ** 19) / (clk * 1000 * 1000 / 72)) / (2 ** (oct - 1))
OPLのデータシートはround(0)な値が記載されているようです。
ジャンクとして入手したYM3935というチップが手元にあるのですが、ネットで検索しても情報が見つかりません。製造は1997年の31週でSDIP/64ピンという特徴からYM2608(OPNA)やYM2610(OPNB)に近いのではないかと思っています。なにか情報お持ちの方いましたら教えてください。(ここにYAMAHAのチップの一覧がありますが、載ってません。)