> java Inharmo 49 390 16.5
上記の様に キー番号と弦長と番手(又は弦径)から
> Inharmonicity = 0.6649628292778043
インハーモニシティ値を計算します。
配列(二重)の使用と入力のチェックを行っています。
以下の55行を打ち込んで下さい。
class Inharmo {
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 Oct = 12;
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("Inharmonicity = "+
getInharmo(keyno, length, dia));
}
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 getInharmo(int key, double len, double dia) {
return 3.3*Math.pow(10, 13)*Math.pow(dia/10, 2)/
Math.pow(len/10, 4)/Math.pow(getFreq(key), 2);
} /* インハーモニシティ値を計算します */
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 Inharmo 49 390 16.5");
System.out.println(" java Inharmo key# length bante(or diameter)");
System.exit(0);
} /* エラーメッセージを表示して終了します */
}