第7回 Graphics #7


グラフィック表示に挑戦します。
ここでは「Temperament.java」のコードを再利用しています。 実行方法はこれまでと異なりアプレットビューアーを使用しています。

> appletviewer DispTemp.java
disptemp

ここでは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); /* セント値のドットを表示します */
        }
    }
}
-------ここまで-------

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