( 変更履歴:
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); } /* セント値から周波数に変換します */ }