サンプリング周波数が20bit欲しかった理由
DevkitProのndslib1.4.0のサウンドライブラリのサンプリング周波数設定を16ビットから20ビットに拡張したのですが、20ビットというと1048575Hzまで設定可能です。何で16ビット65535Hz以上のサンプリング周波数が欲しかったかというと、プログラムで使っているからなんです。
実はInnocenceのプログラムのキーボードの音はPSGとかを使っておらず、生波形を使って出しています。そして、Innocenceの音階は130.81HzのCから4オクターブ上の2217.46HzのC#まで、半音ずつ58音の音を鳴らしています。
これら全部を生波形で用意しておくのは、大変だしメモリも使うので、用意している生波形は440HzのAの生波形のみです。後は音源デバイスに設定するサンプリング周波数の値を変更することにより、音程を変える方法を取っています。サンプリング周波数を変えることにより、一音が鳴る時間が変わりますが、ループ再生させることにより音を連続的に鳴らしているため、一音の鳴る時間を考慮する必要を無くしています。
音階の設定
音階は一般的に440Hz(ラの音)を基準として半音下がると-1、半音上がると+1、とすると、
(440Hzから半音×nだけ移動した音の周波数)P = 440×2の(n/12)乗 と表されます。例えば、1オクターブ低いラの音は、440*pow(2,-12/12)となり、=220Hzとなります。丁度半分の周期ですね。では、1オクターブ高いラの音は、440*pow(2,12/12)なので、=880Hzとなります。2倍の周期です。表2すると下記のような感じです。
音階 n Hz C -9 261.63 計算式:440*pow(2,-9/12) C# -8 277.18 計算式:440*pow(2,-8/12) D -7 293.66 計算式:440*pow(2,-7/12) D# -6 311.13 計算式:440*pow(2,-6/12) E -5 329.63 計算式:440*pow(2,-5/12) F -4 349.23 計算式:440*pow(2,-4/12) F# -3 369.99 計算式:440*pow(2,-3/12) G -2 392.00 計算式:440*pow(2,-2/12) G# -1 415.30 計算式:440*pow(2,-1/12) A 0 440.00 計算式:440*pow(2,0/12) A# 1 466.16 計算式:440*pow(2,1/12) B 2 493.88 計算式:440*pow(2,2/12) C 3 523.25 計算式:440*pow(2,3/12)
音階とサンプリング周波数の関係
サンプリング周波数は波形を形成する数値データの時間間隔に関連する値です(逆数が時間間隔になります)。例えば、440Hzの生波形をサンプリング周波数22050Hzで取得したデータがあるとすると、これを2倍のサンプリング周波数44100Hzで取得したデータと仮定して再生すると、取り込んだ波形数値の時間間隔が半分の長さであると処理されるため、丁度2倍の880Hzの波形として再生されます。すなわち、サンプリング周波数にも上の周波数の計算式と同様の計算式が成り立ちます。下記に440Hzの生波形を22050Hzでサンプリングした場合の音階とサンプリング周波数の関係を示します。
音階 n Hz サンプリング周波数(11025Hz) C -9 261.63 13111.01 計算式:22050*pow(2,-9/12) C# -8 277.18 13890.63 計算式:22050*pow(2,-8/12) D -7 293.66 14716.61 計算式:22050*pow(2,-7/12) D# -6 311.13 15591.70 計算式:22050*pow(2,-6/12) E -5 329.63 16518.84 計算式:22050*pow(2,-5/12) F -4 349.23 17501.10 計算式:22050*pow(2,-4/12) F# -3 369.99 18541.77 計算式:22050*pow(2,-3/12) G -2 392.00 19644.32 計算式:22050*pow(2,-2/12) G# -1 415.30 20812.43 計算式:22050*pow(2,-1/12) A 0 440.00 22050.00 計算式:22050*pow(2,0/12) A# 1 466.16 23361.16 計算式:22050*pow(2,1/12) B 2 493.88 24750.29 計算式:22050*pow(2,2/12) C 3 523.25 26222.02 計算式:22050*pow(2,3/12)
実際のプログラムでは、C(-21)6556Hz〜C#(28)111125Hzの範囲でサンプリング周波数を設定する必要があり、16ビットだとE(19)以上の音を鳴らすことができなかったのです。これが、サンプリング周波数が20ビット必要になった理由です。
ということで寝ます。
本当にやりたいことリスト
(ブログの終わりにやりたいことを書いておきたいと思います)
- 求職活動・・・このブログで興味を持った人一声かけてください。m(_ _)m
- Androidプログラム
- Web系のプログラム