2014年1月29日水曜日

ミーントーンのピッチ計算

今回はミーントーンの音律計算のプログラムです。

1/4シントニックコンマがいわゆるミーントーンですが、ここでは、引数に任意の数値を入れることで、1/4以外の音律も計算可能にしてあります。

バロック音楽では1/6シントニックコンマなどもよく使われます。分母が大きいほど、ミーントーンより平均律に近くなっていきます。

下記のプログラムでは、noteCents[]の配列に各音(12音分)のセント値が格納され、最後のfor文で noteFreq[] に鍵盤分(6octave分)の周波数が格納されます。

//--------------------------------------------------------
//  
//  1/nシントニックコンマのピッチ計算
//
//--------------------------------------------------------
void calcEachKeyFreqMeantone( int div )
{
 double tmpPitch, ratio, comma;
 int  i, j;
 
 ratio = ((double)3)/2;
 comma = 1200*log(pow(ratio,4)/5)/(log(2)*((double)div));
 
 noteCents[0]  = 0;
 noteCents[7]  = 1200*log(pow(ratio,1))/log(2) - comma;
 noteCents[2]  = 1200*log(pow(ratio,2))/log(2) - 1200 - comma*2;
 noteCents[9]  = 1200*log(pow(ratio,3))/log(2) - 1200 - comma*3;
 noteCents[4]  = 1200*log(pow(ratio,4))/log(2) - 2400 - comma*4;
 noteCents[11] = 1200*log(pow(ratio,5))/log(2) - 2400 - comma*5;
 noteCents[6]  = 1200*log(pow(ratio,6))/log(2) - 3600 - comma*6;
 noteCents[1]  = 1200*log(pow(ratio,7))/log(2) - 4800 - comma*7;
 noteCents[8]  = 1200*log(pow(ratio,8))/log(2) - 4800 - comma*8;
 
 ratio = ((double)2)/3;
 noteCents[3]  = 1200*log(pow(ratio,3))/log(2) + 2400 + comma*3;
 noteCents[10] = 1200*log(pow(ratio,2))/log(2) + 2400 + comma*2;
 noteCents[5]  = 1200*log(pow(ratio,1))/log(2) + 1200 + comma;
 
 tmpPitch = ((double)basePitch)/16; // A-1 のピッチ
 double sabun = (noteCents[9] - 1200)*log(2)/1200;
 double indexC = log(tmpPitch) - sabun;
 tmpPitch = exp(indexC);
 
 for ( i=0; i<6; i++ ){
  for ( j=0; j<12; j++ ){
   double c = (noteCents[j]*log(2))/1200 + log(tmpPitch);
   noteFreq[i*12+j] = exp(c);
  }
  tmpPitch *= 2;
 }
}

0 件のコメント:

コメントを投稿