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; } }