( 変更履歴:
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); } /* 数値を成形して表示します */ }