第3回 Tension #3


> java Tension 49 390 16.5

インハーモニシティと同じく キー番号と弦長と番手(又は弦径)から

> Tension(G) = 66.83139720484513[Kg]

弦の張力を計算します。

------ここから------
class Tension {
    static final double[][] Gauge = {       /* 番手と直径の配列です */
        {12, 0.725},{12.5, 0.750},{13, 0.775},{13.5, 0.800},
        {14, 0.825},{14.5, 0.850},{15, 0.875},{15.5, 0.900},
        {16, 0.925},{16.5, 0.950},{17, 0.975},{17.5, 1.000},
        {18, 1.025},{18.5, 1.050},{19, 1.075},{19.5, 1.100},
        {20, 1.125},{20.5, 1.150},{21, 1.175},{21.5, 1.200},
        {22, 1.225},{22.5, 1.250},{23, 1.300},{23.5, 1.350},
        {24, 1.400},{24.5, 1.450},{25, 1.500}};
    static final double SM = 7.85;                /* 芯線密度 g/cm^3 */
    static final double NG = 9.80665204821;        /* 重力加速度 kgw */
    static final double Oct = 12;
    static final int Meter = 1000;              /* [m]への変換値です */
    static int Pitch = 440;                   /* A49キーのピッチです */

    public static void main(String[] argv) {
        if (argv.length != 3)               /* 入力数をチェックします */
            errorExit("Input error.");

        int keyno = 0;
        double length = 0, gauge = 0;
        try {
            keyno  = Integer.parseInt(argv[0]);
            length = Double.parseDouble(argv[1]);
            gauge  = Double.parseDouble(argv[2]);
        } catch(NumberFormatException e) {
            errorExit("Data error.");
        }                                     /* 入力文字を数値に変換します */

        double dia = getDiameter(gauge);
        if (dia < 0)
            errorExit("Gauge error.");

        System.out.println("Tension(G) = "+
                           getTension(keyno, length, dia)/NG+
                           "[Kg]");                /* Kgに計算して表示します */
    }
    public static double getDiameter(double gau) {
        if (gau > 0.725 && gau < 0.1) {
            Pitch = 415;
            return gau;                         /* フォルテピアノ弦の場合... */
        } else
            Pitch = 440;                      /* ...ピッチを変えて計算します */

        for (int i = 0; i < Gauge.length; i++) {
            if (Gauge[i][0] == gau || Gauge[i][1] == gau)
                return Gauge[i][1];
        }                              /* 番手 or 直径が合えば直径を返します */

        return -1;                           /* なければエラー(-1)を返します */
    }                                            /* 番手 or 直径を確認します */

    public static double getTension(int key, double len, double dia) {
        return Math.PI*SM*Meter*Math.pow(getFreq(key), 2)*
            Math.pow(len/Meter, 2)*Math.pow(dia/Meter, 2);
    }                                                   /* 張力[N]を計算します */

    public static double getFreq(int key) {
        return Pitch*Math.pow(2, (key-49)/Oct);
    }                                    /* キーの周波数をピッチから計算します */

    public static void errorExit(String str) {
        System.out.println(str);
        System.out.println("Usage: java Tension 49 390 16.5");
        System.out.println("       java Tension key# length bante(or diameter)");
        System.exit(0);
    }                                  /* エラーメッセージを表示して終了します */
}
------ここまで------

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