2012年3月3日土曜日

音程周波数のアルゴリズム化

音声プログラミング一般の理論は、前記事の書籍で大丈夫。
ただ、音程周波数のアルゴリズム化はその本では話題にしていないから自分で作る必要がありそう。

まず、音程というのは、波の周期(0→正方向の波→負方向の波→0)を単位時間(1秒)内に何回繰り返すかで決まります。そして、その単位のことを周波数(波の周期の回数)といい、ヘルツ(Hz)という単位で表記します。(音量は波の大きさで決まる)

で、ラ(A)の周波数は、

  • オクターブ5=880Hz
  • オクターブ4=440Hz
  • オクターブ3=220Hz
という具合に決まっています。

オクターブnのAの周波数がmHzであれば、オクターブn+1のAの周波数は2mHz

Aの音は全ての楽器の基準周波数になっているので、人間が一番聞き分け易い音です。
絶対音感が無い人でも、「Aの音だけは分かる」という人は結構居るものです。
ベースなど弦楽器のチューニングはAでやるし、オーケストラや室内楽なんかでも、演奏する前にA音の調整(チューニング)をしてます。ついでに、音楽大学の音の聞き分けテスト(そんなんあるんかい?)なんかでも、聞き分ける音の間にA音を鳴らしているようなことが漫画(のだめ)に描いてあったような気がします。

他の11個の音程(A#, B, C, C#, D, D#, E, F, F#, G, G#)の求め方は諸説色々あります。
一番シンプルなのは平均律。
半音=(55×オクターブ)÷12Hzの増加
という単純計算。
※55は12で割り切れない(4.583333333...になる)から、諸説乱立する訳です

で、コンピュータでアルゴリズム化する場合、55も1秒(1000ミリ秒)で割り切れないから更に厄介。
18.181818....回、波形の周期を繰り返せば、オクターブ1のラになる訳です・・・
18×55=990msなので、ラ音では1%の誤差が生じます。
平均律だと、ラ音以外にも強かに誤差が生じる筈。
この辺りの誤差は、実際に鳴らしてみて微調整するしか無いですねぇ....
まさか、ディジタル楽器を作るのに調律が必要になるとは。

とりあえず、
  • オクターブ1のA~G#の波形パターンをオンメモリでプリセットする
  • 配列サイズ(周期)は小数点以下は切り捨てて考える
という感じで、作ってみます。
性能優先なので、違和感があった場合、DDT又は配列サイズの調整で調律する感じ。
(浮動小数点数は重いので使わない)

とりあえず、三角波の波形パターンを作ってみてテストしてみようと思います。
あ・・・あと、サイン波は音が気に入らなかった(使いどころが少なそうだった)し、面倒くさいので、落とす方向で。(三角波、ノコギリ波、短形波+ノイズで実装する方向)

0 件のコメント:

コメントを投稿

注: コメントを投稿できるのは、このブログのメンバーだけです。

合理的ではないものを作りたい

ここ最近、実機版の東方VGSの開発が忙しくて、東方VGSの曲追加が滞っています。 東方VGS(実機版)のデザインを作りながら検討中。基本レトロUIベースですがシークバーはモダンに倣おうかな…とか pic.twitter.com/YOYprlDsYD — SUZUKI PLAN (...