入門編 Beats #1


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

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