グラフィック表示に挑戦します。
ここでは「Temperament.java」のコードを再利用しています。
実行方法はこれまでと異なりアプレットビューアーを使用しています。
> appletviewer DispTemp.java
ここでは12のデータのみの表示ですが これから88でも100でものデータ表示に 対応させて行く事ができると思います。
import java.applet.*;
import java.awt.*;
/*
<applet code="DispTemp" width=400 height=300>
<applet>
*/
/* 上記の4行はアプレット(appletviewer)を実行する為に必要です */
public class DispTemp extends Applet {
final int Oct = 12;
final String[] Keys =
{"C","Cis","D","Es","E","F","Fis","G","Gis","A","B","H"};
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};
// 動作試験用 平均律の値です */
public void init() {
setBackground(Color.black); /* 背景色を設定します */
}
public void paint(Graphics g) {
Dimension d = getSize(); /* アプレットの画面サイズを得ます */
int W = d.width; /* 幅を得ます */
int H = d.height; /* 高さ " */
int h2 = H/2; /* 1/2で中央位置を得ます */
int dot = 6; /* セント値のドットの径を設定します */
int ds = dot/2; /* ドットの1/2を得ます */
int max = 30, ms = 5; /* 目盛の最大値と目盛表示位置を設定します */
double dx = W/(double)Oct; /* 1ドット表示する間隔を得ます */
double dy = h2/(double)max; /* 単位目盛の高さを得ます */
g.setColor(Color.blue);
g.drawLine(0, h2, W, h2); /* 目盛の中央線を引きます */
for (int i = 1; i <= max/10; i++) { /* 目盛の間隔を10とします */
int ii = i*10;
int mp = (int)(h2-ii*dy); /* プラス側の目盛の位置を得ます */
int mm = (int)(h2+ii*dy); /* マイナス " */
g.setColor(Color.blue);
g.drawLine(0, mp, W, mp); /* +-目盛線を引きます */
g.drawLine(0, mm, W, mm);
g.setColor(Color.red);
g.drawString(""+ii, ms, mp); /* +-目盛を表示します */
g.drawString("-"+ii, ms, mm);
}
for (int i = 0; i < Oct; i++) { /* セント値のドットを表示します */
int xx = (int)(i*dx); /* X方向のドットの位置を得ます */
g.setColor(Color.orange);
g.drawString(Keys[i], xx, 12); /* キー名を表示します */
double cent = temp[i]-i*100; /* セント差を求めます */
int yy = (int)(h2-dy*cent);
g.setColor(Color.green);
g.fillOval(xx-ds, yy-ds, dot, dot); /* セント値のドットを表示します */
}
}
}