鍵盤を描く

何も考えずにやったら歯に海苔が付いたみたいになった。

  public void paint(Graphics g) {
    super.paint(g);
    int w = getWidth() / 7;
    for(int i=0; i<7; i++) {
      g.drawLine(w * i, 0, w * i, getHeight());
      if(BLACK_KEY[i])
        g.fillRect(w * i + w / 2, 0, w, getHeight() / 2);
    }
  }

  private final boolean[] BLACK_KEY = {true, true, false, true, true, true, false};

これはよくない。


実際のを測る

場所 長さ(cm)
白鍵 2.2
黒鍵 1.5
隙間 0.1
ミとファの隙間 0.2
ドとド#,レ#とミの間 1.3
ファ#とソ,ソ#とラの間 1.1
それ以外の間 1.2

わりと数字がそろっていないものの、白鍵を7分割、黒鍵を12分割で近似できそう。

  public void paint(Graphics g) {
    super.paint(g);
    int w = getWidth() / 7;
    for(int i=0; i<7; i++)
      g.drawLine(w * i, 0, w * i, getHeight());
    w = getWidth() / 12;
    for(int i=0; i<12; i++) {
      if(BLACK_KEY[i])
        g.fillRect(w * i, 0, w, getHeight() / 2);
    }
  }

  private final boolean[] BLACK_KEY = {false, true, false, true, false, false, true, false, true, false, true, false};

微妙。ミまでとファからで分けて考えるのがよさそうだけどあんまりルール増やしすぎると押したとこ光らすとかが大変。