( 変更履歴:
v0.2 [11/10/30] ctofの計算式を変更しました。)
サンダーソン氏の式から"うなり"を計算するプログラムです。
class Beats { から }までの37行を打ち込んで Beats.java と言うテキスト ファイルを作成して下さい。(/* から */は注釈文ですので省略可能です) そして
> javac Beats.java
を実行して Beats.class ファイルが作成されれば成功です。
> java Beats
と実行すると 「キー#:周波数:インハーモニシティ値:2オクターブのうなり数」が
Key#: [Hz]: [cent]: beats -------------------------------- 1: 27.5: -24.3825: 0.9921544 2: 29.135235: -23.18483: 0.99261904 3: 30.867706: -22.05223: 0.9930628 ... 48: 415.3047: -0.3587035: 1.0094283 49: 440.0: 0.0: 1.0101115 50: 466.16376: 0.3710085: 1.0108324 ...
の様に表示されます。 以上の様に基本的な計算が出来れば それから様々な応用が出来ると思います。
class Beats {
static final int Pitch = 440; /* A49キーのピッチ周波数です */
static final int Keymax = 88; /* 鍵盤数です */
static final double Oct = 12;
public static void main(String argv[]) {
int inter = 24; /* 2オクターブのキーの数です */
int high = 1; /* 2オクターブの音程比 1:4 です */
int low = 4;
/* 以上の3つの数値を変える事で他のうなりが計算出来ます */
System.out.println("Key#: [Hz]: [cent]: beats");
System.out.println("--------------------------------");
for (int i = 1; i <= Keymax; i++) {
if (i+inter > Keymax)
break;
System.out.println(i+": "+
(float)getFreq(i)+": "+
(float)sanderson(i, 1)+": "+
(float)getBeats(i, inter, high, low));
}
}
public static double getBeats(int key, int inter, int high, int low) {
return getIfreq(key+inter, high)-getIfreq(key, low);
} /* 音程間の周波数の差(うなり)を計算します */
public static double getIfreq(int key, int part) {
return ctof(getFreq(key)*part, sanderson(key, part));
} /* 倍音をサンダーソン式のインハーモニシティー値から計算します */
public static double sanderson(int key, int part) {
return (4+part*part)*Math.pow(2,(key-49)/Oct)-5+
1.313*(1-Math.pow(2,(49-key)/Oct));
} /* サンダーソン式でキーと倍音から計算します */
public static double getFreq(int key) {
return Pitch*Math.pow(2, (key-49)/Oct);
} /* キーの周波数をピッチから計算します */
public static double ctof(double freq, double cent) {
return freq*Math.pow(2, cent/1200);
} /* セント値から周波数に変換します */
}