2014年1月18日土曜日

純正律のピッチ計算

少しだけ技術者のブログっぽく、ソースコードを貼ってみようと思い立ちました。

まず最初は純正律を計算するプログラムです。iOSアプリのために作りましたが、アプリの方は現在iOS7で動かなくなって放置状態・・・

簡単にコードの説明をしておきます。
justIntoCentsは2次元の配列ですが、1次元目は、0:変化音無し、1:シャープ、2:フラットです。
2次元目は、0:Do, 1:Re, 2:Mi, 3:Fa, 4:So, 5:La, 6:Ti です。合計3×7=21音のピッチ計算をします。

純正律は、完全五度が3/2の周波数比、長三度が5/4の周波数比になるので、この周波数比を元に各音程をひたすらセントの値に変換しています。

//--------------------------------------------------------
//  
//  純正律のピッチ計算
//
//--------------------------------------------------------
void calcEachKeyFreqJustInto( void )
{
 double ratio, mj3ratio;
 
 ratio = ((double)3)/2;
 mj3ratio = ((double)5)/4;
 
 // fa-do-so-re
 justIntoCents[0][3]  = 1200*log(pow(ratio,-1))/log(2) + 1200;
 justIntoCents[0][0]  = 1200*log(pow(ratio,0))/log(2);
 justIntoCents[0][4]  = 1200*log(pow(ratio,1))/log(2);
 justIntoCents[0][1]  = 1200*log(pow(ratio,2))/log(2) - 1200;
 
 // la-mi-ti-fi
 justIntoCents[0][5]  = 1200*log(pow(ratio,-1)*pow(mj3ratio,1))/log(2) + 1200;
 justIntoCents[0][2]  = 1200*log(pow(ratio,0)*pow(mj3ratio,1))/log(2);
 justIntoCents[0][6]  = 1200*log(pow(ratio,1)*pow(mj3ratio,1))/log(2);
 justIntoCents[2][3]  = 1200*log(pow(ratio,2)*pow(mj3ratio,1))/log(2) - 1200;
 
 // di-si-ri-li
 justIntoCents[2][0]  = 1200*log(pow(ratio,-1)*pow(mj3ratio,2))/log(2);
 justIntoCents[2][4]  = 1200*log(pow(ratio,0)*pow(mj3ratio,2))/log(2);
 justIntoCents[2][1]  = 1200*log(pow(ratio,1)*pow(mj3ratio,2))/log(2) - 1200;
 justIntoCents[2][5]  = 1200*log(pow(ratio,2)*pow(mj3ratio,2))/log(2) - 1200;
 
 // mi#-ti#
 justIntoCents[2][2]  = 1200*log(pow(ratio,-1)*pow(mj3ratio,3))/log(2);
 justIntoCents[2][6]  = 1200*log(pow(ratio,0)*pow(mj3ratio,3))/log(2);
 
 // ra-lo-ma-ta
 justIntoCents[1][1]  = 1200*log(pow(ratio,-1)*pow(mj3ratio,-1))/log(2) + 1200;
 justIntoCents[1][5]  = 1200*log(pow(ratio,0)*pow(mj3ratio,-1))/log(2) + 1200;
 justIntoCents[1][2]  = 1200*log(pow(ratio,1)*pow(mj3ratio,-1))/log(2);
 justIntoCents[1][6]  = 1200*log(pow(ratio,2)*pow(mj3ratio,-1))/log(2);
 
 // fab-da-sa
 justIntoCents[1][3]  = 1200*log(pow(ratio,0)*pow(mj3ratio,-2))/log(2) + 1200;
 justIntoCents[1][0]  = 1200*log(pow(ratio,1)*pow(mj3ratio,-2))/log(2);
 justIntoCents[1][4]  = 1200*log(pow(ratio,2)*pow(mj3ratio,-2))/log(2);
}

0 件のコメント:

コメントを投稿