FM音源の理屈

詳しいことはわからないが、概要など。


FM音源っつーのは、ある波形にたいして別の波形を入力して、元の波形の周波数を、入力した波形により修正する、つまり周波数変調の機能を持った音源だ。
えらい人が編み出した理論をYAMAHAが頑張って研究して製品化した。
後から入力した波形が+ならそのタイミングでは元の波形の周波数は上がるし、-なら下がる、そんな感じだ。
DXRubyで書くならサンプルにも入れてあるこれ。

f = 0
v = 250.0
s1 = SoundEffect.new(500, WAVE_SIN) do
  f = f + 1
  v = v - 0.4
  [880 + Math.sin(f) * 200, v]
end

FM音源では、元の波形を出すほうをキャリア、後から入力する波形を出すほうをモジュレータと呼ぶ。
YAMAHAFM音源では、発振器は周波数とベース波形と、各種レイト・レベルの指定で、単純な音を、時間の経過に伴い音量を変えながら出力することができる。
キャリアもモジュレータも、どっちもこの発振器を使うから、後から入力される波形は、時間により振幅を変えることができる。
上の例で言うと、vや、Math.sin(f) * 200の200がそれぞれ時間により変化するということだ。
vが変わればボリュームが、200が変われば音色が変化していくわけだ。
MSXのFMPAC(YM2413/OPLL)だと2オペレータだからここまでだが、NECやシャープのPCで採用されてたOPN/OPM系は4オペレータだったから、更にモジュレータを直列に接続することができた。
上の例で言えば、オペレータ3つ直列になると、f = f + 1の1がMath.sin(f2) * 2とかになっちゃうイメージで、しかも* 2は時間により変化する。
4つ直列だと更にf2の変化量がMath.sin(f3)*2みたいな式になる・・・のかな。
ややこしすぎてよくわからん。
あと、YAMAHAFM音源ではフィードバック機能というのがあって、キャリアの出力波形をキャリアに入力して、自分で自分を変調することができる。
これがYAMAHAFM音源の最大のポイントだったと思うが、実現するためにはブロックに現在の波形レベルを渡すように修正する必要がある。
あと、いまの時間も渡すようにすれば使いやすくなりそうだ。