> 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); } /* エラーメッセージを表示して終了します */ }