第4回 Temperament #4


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

Last modified: 1月 03日 火 12:50:31 2023 JST