Flash Player 10の機能「Dynamic Sound Generate」を使って、ポリフォニックシンセサイザーを作ってみました。画面をクリックすると、FlashPlayerがアクティブになり、キーボードで演奏できるようになります。
こちらから演奏できます。
VCAのADSRエンヴェロープと、オシレーター(波形)選択ぐらいしか機能はないですが、これでも十分アナログシンセサイザー?
音程→周波数に変換するところは、すべての音程を定数で持っておいてもいいのだけど、A4(=440Hz、オーケストラ、クラシックとかだと442Hzですが)の音を基準に考えてオクターブ番号と、一番近いAの音からの音階をパラメータで持てば、どの音でも計算で出せるのでそのようにしてみました。
具体的には以下のような式になります。
frequency = A4 * 2 ^ (オクターブ番号-4) * 2 ^ (Aの音からの差 / 12)
※ただし、Aの音からの差が+3以上の時は、表記上番号が増えるので、「オクターブ番号 - 1」をする必要がある。
ActionScriptにするとこんな感じ。
function getFrequency(octave:Number, note:Number):Number
{
var basisNote:Number = 440.000; //A4
if(note>2)
octave--;
var frequency:Number = basisNote * Math.pow(2, octave - 4) * Math.pow(2, note / 12);
return frequency;
}
例えば、C5(A4から3度上の音)の周波数を求めるのならば、
440 * 2 ^ (5-1-4) * 2 ^ (3 / 12) = 523.2511306011972 (Hz)
になります。
ちなみに、A4 = 440Hz というのは1939年に国際的に決められた周波数の表記ですが、YAMAHAの電子機器の分野では(MIDIとか)、A3 = 440Hz としているようです。
電子楽器用語集 : ヤマハ マニュアルライブラリー
以上の説明の補足として、このあたりのページが参考になります。
音名・階名表記 - Wikipedia
音程について


