( 変更履歴:
v0.2 [11/10/30] c2fの計算式を変更しました。)
> java Temperament
上記を実行すると「キー:セント値:差のセント値:周波数[Hz]:うなり」が 以下の様に表示されます。
Key: [cent]: diff: [Hz]: beats ------------------------------------- C : 0.0: 0.0: 261.626: 0.0 Cis: 90.225: -9.775: 275.622: 1.245 D : 203.91: 3.91: 294.329: 0.027 Es : 294.135: -5.865: 310.075: 0.0 E : 396.314: -3.686: 328.926: 0.572 F : 498.045: -1.955: 348.834: 0.0 Fis: 590.224: -9.776: 367.911: 0.0 G : 701.995: 1.995: 392.447: -0.036 Gis: 792.18: -7.82: 413.433: 0.0 A : 895.112: -4.888: 438.759: 10.935 B : 996.09: -3.91: 465.112: 0.0 H : 1088.269: -11.731: 490.548: 11.367
音律や音程・周波数を変更する事が出来ます。
(キー入力に改造する事に挑戦してみて下さい)
import java.text.DecimalFormat; /* 数値の成形に利用します */
class Temperament {
static final int Oct = 12; /* 今回は double ではなく int です */
static final int Pitch = 440; /* A49キーのピッチ周波数です */
static final int Funda = 40; /* 基準のキー番号(C40)です */
static final int Cent = 1200; /* オクターブ分のセント値です */
static final String[] Keys =
{"C ","Cis","D ","Es ","E ","F ","Fis","G ","Gis","A ","B ","H "};
static final double[] temp = /* 音律の C〜のセント値です */
{0, 90.225, 203.91, 294.135, 396.314, 498.045, 590.224, 701.995, 792.18,
895.112, 996.09, 1088.269}; /* キルンベルガー No.2 */
/* {0, 100, 200, 300, 400, 500, 600, 700, 800, 900, 1000, 1100};
// 動作試験用 平均律の値です */
static DecimalFormat df1 = new DecimalFormat("#0.0##");
public static void main(String[] argv) {
int inter = 5; /* 純正4度のキーの数です */
int high = 3; /* " 音程比 3:4 です */
int low = 4;
/* 以上の3つの数値を変える事で他のうなりが計算出来ます */
System.out.println("Key: [cent]: diff: [Hz]: beats");
System.out.println("-------------------------------------");
for (int i = 0; i < Oct; i++) {
System.out.println(Keys[i]+": "+temp[i]+": "+
dform(temp[i]-i*100)+": "+
dform(c2f(temp[i]))+": "+
dform(getTbeats(i, inter, high, low)));
}
}
public static double getTbeats(int key, int inter, int high, int low) {
return c2f(getTcent(key+inter))*high-c2f(getTcent(key))*low;
} /* Temperament用 音程間の周波数の差を計算します */
public static double getTcent(int key) {
return (key < Oct) ? temp[key] : temp[key-Oct]+Cent;
} /* オクターブ以上のセント値まで求めます */
public static double c2f(double cent) {
return getFreq(Funda)*Math.pow(2, cent/1200);
} /* セント値から周波数に変換します */
public static double getFreq(int key) {
return Pitch*Math.pow(2, (key-49)/(double)Oct);
} /* キーの周波数をピッチから計算します */
public static String dform(double val) {
return df1.format((float)val);
} /* 数値を成形して表示します */
}