電子工作
FM音源
More than 1 year has passed since last update.

Makeで新しいFM音源チップが出ていたようですが、元祖FM音源チップのYM2203(OPN)を久しぶりに復活させてプログラムを作るためにF-Numberをrubyで計算してみました。

fnum.rb
# 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)などに近いのではないかと思っています。なにか情報お持ちの方いましたら教えてください。