←Previous | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | Next→
        //          |    | y=0,z=1   (E)|    |
        //          |    | y     x=1,y=0|    |
        //       (H)|    |/1            |    |
        //   x=0,y=0|    +--------------|----+
        //          |   /         (C)   |   /
        //          |  /(D)     y=1,z=0 |  /(B)
        //          | /x=0,z=0          | /x=1,z=0
        //          |/0                 |/
        //         0+-------------------+--x
        //          0        (A)        1
        //                 y=0,z=0
        //
        //(A) y=0,z=0
        //  p*x+q*0+r*0+s=0
        //  x=-s/p
      edge:
        if ((ay < -eps || az < -eps) &&
            eps < abs (p)) {
          //ph1の単位立方体の辺が見えているとき(ph1の辺を挟む面のどちらかの外側に視点aがあるとき)
          //視点aと、ph2の面f2の辺(b,c)を、通る平面と、ph1の単位立方体の辺の、交点dを求める
          let dx = -s / p;
          const dy = 0;
          const dz = 0;
          if (-eps < dx && dx < 1 + eps &&
              -eps < dy && dy < 1 + eps &&
              -eps < dz && dz < 1 + eps) {
            //交点dが(0,1)の範囲にあるとき
            //視点aと、ph1の辺の交点dを、通る直線と、ph2の面f2の辺(b,c)の、交点eを求める
            let adx = dx - ax;
            let ady = dy - ay;
            let adz = dz - az;
            let bcx = cx - bx;
            let bcy = cy - by;
            let bcz = cz - bz;
            //  ex=ax+adx*f=bx+bcx*g
            //  ey=ay+ady*f=by+bcy*g
            //  ez=az+adz*f=bz+bcz*g
            //  x,y
            //    f=((ay-by)*bcx-(ax-bx)*bcy)/(adx*bcy-ady*bcx)
            //    g=((ay-by)*adx-(ax-bx)*ady)/(adx*bcy-ady*bcx)
            //  y,z
            //    f=((az-bz)*bcy-(ay-by)*bcz)/(ady*bcz-adz*bcy)
            //    g=((az-bz)*ady-(ay-by)*adz)/(ady*bcz-adz*bcy)
            //  z,x
            //    f=((ax-bx)*bcz-(az-bz)*bcx)/(adz*bcx-adx*bcz)
            //    g=((ax-bx)*adz-(az-bz)*adx)/(adz*bcx-adx*bcz)
            let den;
            let g;
            if (eps < abs (den = adx * bcy - ady * bcx)) {
              g = ((ay - by) * adx - (ax - bx) * ady) / den;
            } else if (eps < abs (den = ady * bcz - adz * bcy)) {
              g = ((az - bz) * ady - (ay - by) * adz) / den;
            } else if (eps < abs (den = adz * bcx - adx * bcz)) {
              g = ((ax - bx) * adz - (az - bz) * adx) / den;
            } else {
              break edge;
            }
            if (-eps < g && g < 1 + eps) {
              //交点eが(b,c)の範囲にあるとき
              let ex = bx + bcx * g;
              let ey = by + bcy * g;
              let ez = bz + bcz * g;
              let dot = (ax - ex) * (dx - ex) + (ay - ey) * (dy - ey) + (az - ez) * (dz - ez);
              if (eps < dot) {
                //ph2の面f2の辺(b,c)の交点eから見て、視点aと、ph1の辺の交点dが、同じ側にあるとき(a-eとd-eのドット積が正のとき)
                //ph2の面f2の辺(b,c)の交点e → ph1の辺の交点d → 視点a の順なので、1を返す
                result = sign;
                break comparator;
              }
              if (dot < -eps) {
                //ph2の面f2の辺(b,c)の交点eから見て、視点aと、ph1の辺の交点dが、反対側にあるとき(a-eとd-eのドット積が負のとき)
                //ph1の辺の交点d → ph2の面f2の辺(b,c)の交点e → 視点a の順なので、-1を返す
                result = -sign;
                break comparator;
              }
            }
          }
        }
        //(B) x=1,z=0
        //  p*1+q*y+r*0+s=0
        //  y=-(p+s)/q
      edge:
        if ((1 + eps < ax || az < -eps) &&
            eps < abs (q)) {
          const dx = 1;
          let dy = -(p + s) / q;
          const dz = 0;
          if (-eps < dx && dx < 1 + eps &&
              -eps < dy && dy < 1 + eps &&
              -eps < dz && dz < 1 + eps) {
            let adx = dx - ax;
            let ady = dy - ay;
            let adz = dz - az;
            let bcx = cx - bx;
            let bcy = cy - by;
            let bcz = cz - bz;
            let den;
            let g;
            if (eps < abs (den = adx * bcy - ady * bcx)) {
              g = ((ay - by) * adx - (ax - bx) * ady) / den;
            } else if (eps < abs (den = ady * bcz - adz * bcy)) {
              g = ((az - bz) * ady - (ay - by) * adz) / den;
            } else if (eps < abs (den = adz * bcx - adx * bcz)) {
              g = ((ax - bx) * adz - (az - bz) * adx) / den;
            } else {
              break edge;
            }
            if (-eps < g && g < 1 + eps) {
              let ex = bx + bcx * g;
              let ey = by + bcy * g;
              let ez = bz + bcz * g;
              let dot = (ax - ex) * (dx - ex) + (ay - ey) * (dy - ey) + (az - ez) * (dz - ez);
              if (eps < dot) {
                result = sign;
                break comparator;
              }
              if (dot < -eps) {
                result = -sign;
                break comparator;
              }
            }
          }
        }
        //(C) y=1,z=0
        //  p*x+q*1+r*0+s=0
        //  x=-(q+s)/p
      edge:
        if ((1 + eps < ay || az < -eps) &&
            eps < abs (p)) {
          let dx = -(q + s) / p;
          const dy = 1;
          const dz = 0;
          if (-eps < dx && dx < 1 + eps &&
              -eps < dy && dy < 1 + eps &&
              -eps < dz && dz < 1 + eps) {
            let adx = dx - ax;
            let ady = dy - ay;
            let adz = dz - az;
            let bcx = cx - bx;
            let bcy = cy - by;
            let bcz = cz - bz;
            let den;
            let g;
            if (eps < abs (den = adx * bcy - ady * bcx)) {
              g = ((ay - by) * adx - (ax - bx) * ady) / den;
            } else if (eps < abs (den = ady * bcz - adz * bcy)) {
              g = ((az - bz) * ady - (ay - by) * adz) / den;
            } else if (eps < abs (den = adz * bcx - adx * bcz)) {
              g = ((ax - bx) * adz - (az - bz) * adx) / den;
            } else {
              break edge;
            }
            if (-eps < g && g < 1 + eps) {
              let ex = bx + bcx * g;
              let ey = by + bcy * g;
              let ez = bz + bcz * g;
              let dot = (ax - ex) * (dx - ex) + (ay - ey) * (dy - ey) + (az - ez) * (dz - ez);
              if (eps < dot) {
                result = sign;
                break comparator;
              }
              if (dot < -eps) {
                result = -sign;
                break comparator;
              }
            }
          }
        }
        //(D) x=0,z=0
        //  p*0+q*y+r*0+s=0
        //  y=-s/q
      edge:
        if ((ax < -eps || az < -eps) &&
            eps < abs (q)) {
          const dx = 0;
          let dy = -s / q;
          const dz = 0;
          if (-eps < dx && dx < 1 + eps &&
              -eps < dy && dy < 1 + eps &&
              -eps < dz && dz < 1 + eps) {
            let adx = dx - ax;
            let ady = dy - ay;
            let adz = dz - az;
            let bcx = cx - bx;
            let bcy = cy - by;
            let bcz = cz - bz;
            let den;
            let g;
            if (eps < abs (den = adx * bcy - ady * bcx)) {
              g = ((ay - by) * adx - (ax - bx) * ady) / den;
            } else if (eps < abs (den = ady * bcz - adz * bcy)) {
              g = ((az - bz) * ady - (ay - by) * adz) / den;
            } else if (eps < abs (den = adz * bcx - adx * bcz)) {
              g = ((ax - bx) * adz - (az - bz) * adx) / den;
            } else {
              break edge;
            }
            if (-eps < g && g < 1 + eps) {
              let ex = bx + bcx * g;
              let ey = by + bcy * g;
              let ez = bz + bcz * g;
              let dot = (ax - ex) * (dx - ex) + (ay - ey) * (dy - ey) + (az - ez) * (dz - ez);
              if (eps < dot) {
                result = sign;
                break comparator;
              }
              if (dot < -eps) {
                result = -sign;
                break comparator;
              }
            }
          }
        }
        //(E) x=1,y=0
        //  p*1+q*0+r*z+s=0
        //  z=-(p+s)/r
      edge:
        if ((1 + eps < ax || ay < -eps) &&
            eps < abs (r)) {
          const dx = 1;
          const dy = 0;
          let dz = -(p + s) / r;
          if (-eps < dx && dx < 1 + eps &&
              -eps < dy && dy < 1 + eps &&
              -eps < dz && dz < 1 + eps) {
            let adx = dx - ax;
            let ady = dy - ay;
            let adz = dz - az;
            let bcx = cx - bx;
            let bcy = cy - by;
            let bcz = cz - bz;
            let den;
            let g;
            if (eps < abs (den = adx * bcy - ady * bcx)) {
              g = ((ay - by) * adx - (ax - bx) * ady) / den;
            } else if (eps < abs (den = ady * bcz - adz * bcy)) {
              g = ((az - bz) * ady - (ay - by) * adz) / den;
            } else if (eps < abs (den = adz * bcx - adx * bcz)) {
              g = ((ax - bx) * adz - (az - bz) * adx) / den;
            } else {
              break edge;
            }
            if (-eps < g && g < 1 + eps) {
              let ex = bx + bcx * g;
              let ey = by + bcy * g;
              let ez = bz + bcz * g;
              let dot = (ax - ex) * (dx - ex) + (ay - ey) * (dy - ey) + (az - ez) * (dz - ez);
              if (eps < dot) {
                result = sign;
                break comparator;
              }
              if (dot < -eps) {
                result = -sign;
                break comparator;
              }
            }
          }
        }
        //(F) x=1,y=1
        //  p*1+q*1+r*z+s=0
        //  z=-(p+q+s)/r
      edge:
        if ((1 + eps < ax || 1 + eps < ay) &&
            eps < abs (r)) {
          const dx = 1;
          const dy = 1;
          let dz = -(p + q + s) / r;
          if (-eps < dx && dx < 1 + eps &&
              -eps < dy && dy < 1 + eps &&
              -eps < dz && dz < 1 + eps) {
            let adx = dx - ax;
            let ady = dy - ay;
            let adz = dz - az;
            let bcx = cx - bx;
            let bcy = cy - by;
            let bcz = cz - bz;
            let den;
            let g;
            if (eps < abs (den = adx * bcy - ady * bcx)) {
              g = ((ay - by) * adx - (ax - bx) * ady) / den;
            } else if (eps < abs (den = ady * bcz - adz * bcy)) {
              g = ((az - bz) * ady - (ay - by) * adz) / den;
            } else if (eps < abs (den = adz * bcx - adx * bcz)) {
              g = ((ax - bx) * adz - (az - bz) * adx) / den;
            } else {
              break edge;
            }
            if (-eps < g && g < 1 + eps) {
              let ex = bx + bcx * g;
              let ey = by + bcy * g;
              let ez = bz + bcz * g;
              let dot = (ax - ex) * (dx - ex) + (ay - ey) * (dy - ey) + (az - ez) * (dz - ez);
              if (eps < dot) {
                result = sign;
                break comparator;
              }
              if (dot < -eps) {
                result = -sign;
                break comparator;
              }
            }
          }
        }
        //(G) x=0,y=1
        //  p*0+q*1+r*z+s=0
        //  z=-(q+s)/r
      edge:
        if ((ax < -eps || 1 + eps < ay) &&
            eps < abs (r)) {
          const dx = 0;
          const dy = 1;
          let dz = -(q + s) / r;
          if (-eps < dx && dx < 1 + eps &&
              -eps < dy && dy < 1 + eps &&
              -eps < dz && dz < 1 + eps) {
            let adx = dx - ax;
            let ady = dy - ay;
            let adz = dz - az;
            let bcx = cx - bx;
            let bcy = cy - by;
            let bcz = cz - bz;
            let den;
            let g;
            if (eps < abs (den = adx * bcy - ady * bcx)) {
              g = ((ay - by) * adx - (ax - bx) * ady) / den;
            } else if (eps < abs (den = ady * bcz - adz * bcy)) {
              g = ((az - bz) * ady - (ay - by) * adz) / den;
            } else if (eps < abs (den = adz * bcx - adx * bcz)) {
              g = ((ax - bx) * adz - (az - bz) * adx) / den;
            } else {
              break edge;
            }
            if (-eps < g && g < 1 + eps) {
              let ex = bx + bcx * g;
              let ey = by + bcy * g;
              let ez = bz + bcz * g;
              let dot = (ax - ex) * (dx - ex) + (ay - ey) * (dy - ey) + (az - ez) * (dz - ez);
              if (eps < dot) {
                result = sign;
                break comparator;
              }
              if (dot < -eps) {
                result = -sign;
                break comparator;
              }
            }
          }
        }
        //(H) x=0,y=0
        //  p*0+q*0+r*z+s=0
        //  z=-s/r
      edge:
        if ((ax < -eps || ay < -eps) &&
            eps < abs (r)) {
          const dx = 0;
          const dy = 0;
          let dz = -s / r;
          if (-eps < dx && dx < 1 + eps &&
              -eps < dy && dy < 1 + eps &&
              -eps < dz && dz < 1 + eps) {
            let adx = dx - ax;
            let ady = dy - ay;
            let adz = dz - az;
            let bcx = cx - bx;
            let bcy = cy - by;
            let bcz = cz - bz;
            let den;
            let g;
            if (eps < abs (den = adx * bcy - ady * bcx)) {
              g = ((ay - by) * adx - (ax - bx) * ady) / den;
            } else if (eps < abs (den = ady * bcz - adz * bcy)) {
              g = ((az - bz) * ady - (ay - by) * adz) / den;
            } else if (eps < abs (den = adz * bcx - adx * bcz)) {
              g = ((ax - bx) * adz - (az - bz) * adx) / den;
            } else {
              break edge;
            }
            if (-eps < g && g < 1 + eps) {
              let ex = bx + bcx * g;
              let ey = by + bcy * g;
              let ez = bz + bcz * g;
              let dot = (ax - ex) * (dx - ex) + (ay - ey) * (dy - ey) + (az - ez) * (dz - ez);
              if (eps < dot) {
                result = sign;
                break comparator;
              }
              if (dot < -eps) {
                result = -sign;
                break comparator;
              }
            }
          }
        }
        //(I) y=0,z=1
        //  p*x+q*0+r*1+s=0
        //  x=-(r+s)/p
      edge:
        if ((ay < -eps || 1 + eps < az) &&
            eps < abs (p)) {
          let dx = -(r + s) / p;
          const dy = 0;
          const dz = 1;
          if (-eps < dx && dx < 1 + eps &&
              -eps < dy && dy < 1 + eps &&
              -eps < dz && dz < 1 + eps) {
            let adx = dx - ax;
            let ady = dy - ay;
            let adz = dz - az;
            let bcx = cx - bx;
            let bcy = cy - by;
            let bcz = cz - bz;
            let den;
            let g;
            if (eps < abs (den = adx * bcy - ady * bcx)) {
              g = ((ay - by) * adx - (ax - bx) * ady) / den;
            } else if (eps < abs (den = ady * bcz - adz * bcy)) {
              g = ((az - bz) * ady - (ay - by) * adz) / den;
            } else if (eps < abs (den = adz * bcx - adx * bcz)) {
              g = ((ax - bx) * adz - (az - bz) * adx) / den;
            } else {
              break edge;
            }
            if (-eps < g && g < 1 + eps) {
              let ex = bx + bcx * g;
              let ey = by + bcy * g;
              let ez = bz + bcz * g;
              let dot = (ax - ex) * (dx - ex) + (ay - ey) * (dy - ey) + (az - ez) * (dz - ez);
              if (eps < dot) {
                result = sign;
                break comparator;
              }
              if (dot < -eps) {
                result = -sign;
                break comparator;
              }
            }
          }
        }
        //(J) x=1,z=1
        //  p*1+q*y+r*1+s=0
        //  y=-(p+r+s)/q
      edge:
        if ((1 + eps < ax || 1 + eps < az) &&
            eps < abs (q)) {
          const dx = 1;
          let dy = -(p + r + s) / q;
          const dz = 1;
          if (-eps < dx && dx < 1 + eps &&
              -eps < dy && dy < 1 + eps &&
              -eps < dz && dz < 1 + eps) {
            let adx = dx - ax;
            let ady = dy - ay;
            let adz = dz - az;
            let bcx = cx - bx;
            let bcy = cy - by;
            let bcz = cz - bz;
            let den;
            let g;
            if (eps < abs (den = adx * bcy - ady * bcx)) {
              g = ((ay - by) * adx - (ax - bx) * ady) / den;
            } else if (eps < abs (den = ady * bcz - adz * bcy)) {
              g = ((az - bz) * ady - (ay - by) * adz) / den;
            } else if (eps < abs (den = adz * bcx - adx * bcz)) {
              g = ((ax - bx) * adz - (az - bz) * adx) / den;
            } else {
              break edge;
            }
            if (-eps < g && g < 1 + eps) {
              let ex = bx + bcx * g;
              let ey = by + bcy * g;
              let ez = bz + bcz * g;
              let dot = (ax - ex) * (dx - ex) + (ay - ey) * (dy - ey) + (az - ez) * (dz - ez);
              if (eps < dot) {
                result = sign;
                break comparator;
              }
              if (dot < -eps) {
                result = -sign;
                break comparator;
              }
            }
          }
        }
        //(K) y=1,z=1
        //  p*x+q*1+r*1+s=0
        //  x=-(q+r+s)/p
      edge:
        if ((1 + eps < ay || 1 + eps < az) &&
            eps < abs (p)) {
          let dx = -(q + r + s) / p;
          const dy = 1;
          const dz = 1;
          if (-eps < dx && dx < 1 + eps &&
              -eps < dy && dy < 1 + eps &&
              -eps < dz && dz < 1 + eps) {
            let adx = dx - ax;
            let ady = dy - ay;
            let adz = dz - az;
            let bcx = cx - bx;
            let bcy = cy - by;
            let bcz = cz - bz;
            let den;
            let g;
            if (eps < abs (den = adx * bcy - ady * bcx)) {
              g = ((ay - by) * adx - (ax - bx) * ady) / den;
            } else if (eps < abs (den = ady * bcz - adz * bcy)) {
              g = ((az - bz) * ady - (ay - by) * adz) / den;
            } else if (eps < abs (den = adz * bcx - adx * bcz)) {
              g = ((ax - bx) * adz - (az - bz) * adx) / den;
            } else {
              break edge;
            }
            if (-eps < g && g < 1 + eps) {
              let ex = bx + bcx * g;
              let ey = by + bcy * g;
              let ez = bz + bcz * g;
              let dot = (ax - ex) * (dx - ex) + (ay - ey) * (dy - ey) + (az - ez) * (dz - ez);
              if (eps < dot) {
                result = sign;
                break comparator;
              }
              if (dot < -eps) {
                result = -sign;
                break comparator;
              }
            }
          }
        }
        //(L) x=0,z=1
        //  p*0+q*y+r*1+s=0
        //  y=-(r+s)/q
      edge:
        if ((ax < -eps || 1 + eps < az) &&
            eps < abs (q)) {
          const dx = 0;
          let dy = -(r + s) / q;
          const dz = 1;
          if (-eps < dx && dx < 1 + eps &&
              -eps < dy && dy < 1 + eps &&
              -eps < dz && dz < 1 + eps) {
            let adx = dx - ax;
            let ady = dy - ay;
            let adz = dz - az;
            let bcx = cx - bx;
            let bcy = cy - by;
            let bcz = cz - bz;
            let den;
            let g;
            if (eps < abs (den = adx * bcy - ady * bcx)) {
              g = ((ay - by) * adx - (ax - bx) * ady) / den;
            } else if (eps < abs (den = ady * bcz - adz * bcy)) {
              g = ((az - bz) * ady - (ay - by) * adz) / den;
            } else if (eps < abs (den = adz * bcx - adx * bcz)) {
              g = ((ax - bx) * adz - (az - bz) * adx) / den;
            } else {
              break edge;
            }
            if (-eps < g && g < 1 + eps) {
              let ex = bx + bcx * g;
              let ey = by + bcy * g;
              let ez = bz + bcz * g;
              let dot = (ax - ex) * (dx - ex) + (ay - ey) * (dy - ey) + (az - ez) * (dz - ez);
              if (eps < dot) {
                result = sign;
                break comparator;
              }
              if (dot < -eps) {
                result = -sign;
                break comparator;
              }
            }
          }
        }
      }  //for j
    }  //for i
    //ph1とph2を入れ替える
    let t = ph1;
    ph1 = ph2;
    ph2 = t;
  }  //for k
  //シルエットが重なっていない
//if(result<0)cprint(ph1.ph$name+"→"+ph2.ph$name);else if(result>0)cprint(ph2.ph$name+"→"+ph1.ph$name);
  return result;
}



//========================================================================
//キーイベント

const KEN_MAP = {
  //--------------------------------------------------------
KeyA:         35,  //  O3G#  A ち    Chrome        Firefox
65:           35,  //  O3G#  A ち    Chrome  Edge  Firefox
KeyZ:         36,  //  O3A   Z つっ  Chrome        Firefox
90:           36,  //  O3A   Z つっ  Chrome  Edge  Firefox
KeyS:         37,  //  O3A#  S と    Chrome        Firefox
83:           37,  //  O3A#  S と    Chrome  Edge  Firefox
KeyX:         38,  //  O3B   X さ    Chrome        Firefox
88:           38,  //  O3B   X さ    Chrome  Edge  Firefox
  //KeyD:                    D し    Chrome        Firefox
  //68:                      D し    Chrome  Edge  Firefox
KeyC:         39,  //  O4C   C そ    Chrome        Firefox
67:           39,  //  O4C   C そ    Chrome  Edge  Firefox
KeyF:         40,  //  O4C#  F は    Chrome        Firefox
70:           40,  //  O4C#  F は    Chrome  Edge  Firefox
KeyV:         41,  //  O4D   V ひ    Chrome        Firefox
86:           41,  //  O4D   V ひ    Chrome  Edge  Firefox
KeyG:         42,  //  O4D#  G き    Chrome        Firefox
71:           42,  //  O4D#  G き    Chrome  Edge  Firefox
KeyB:         43,  //  O4E   B こ    Chrome        Firefox
66:           43,  //  O4E   B こ    Chrome  Edge  Firefox
  //KeyH:                    H く    Chrome        Firefox
  //72:                      H く    Chrome  Edge  Firefox
KeyN:         44,  //  O4F   N み    Chrome        Firefox
78:           44,  //  O4F   N み    Chrome  Edge  Firefox
KeyJ:         45,  //  O4F#  J ま    Chrome        Firefox
74:           45,  //  O4F#  J ま    Chrome  Edge  Firefox
KeyM:         46,  //  O4G   M も    Chrome        Firefox
77:           46,  //  O4G   M も    Chrome  Edge  Firefox
KeyK:         47,  //  O4G#  K の    Chrome        Firefox
75:           47,  //  O4G#  K の    Chrome  Edge  Firefox
Comma:        48,  //  O4A   ,<ね、  Chrome        Firefox
188:          48,  //  O4A   ,<ね、  Chrome  Edge  Firefox
KeyL:         49,  //  O4A#  L り    Chrome        Firefox
76:           49,  //  O4A#  L り    Chrome  Edge  Firefox
Period:       50,  //  O4B   .>る。  Chrome        Firefox
190:          50,  //  O4B   .>る。  Chrome  Edge  Firefox
  //Semicolon:               ;+れ    Chrome        Firefox
  //59:                      ;+れ                  Firefox
  //187:                     ;+れ    Chrome  Edge
Slash:        51,  //  O5C   /?め・  Chrome        Firefox
191:          51,  //  O5C   /?め・  Chrome  Edge  Firefox
Quote:        52,  //  O5C#  :*け    Chrome        Firefox
186:          52,  //  O5C#  :*け    Chrome  Edge
58:           52,  //  O5C#  :*け                  Firefox
IntlRo:       53,  //  O5D   \_ろ    Chrome        Firefox
226:          53,  //  O5D   \_ろ    Chrome  Edge
  //220:      53,  //  O5D   \_ろ                  Firefox
Backslash:    54,  //  O5D#  ]}む」  Chrome        Firefox
221:          54,  //  O5D#  ]}む」  Chrome  Edge  Firefox
  //--------------------------------------------------------
  //Digit1:                  1!ぬ    Chrome        Firefox
  //49:                      1!ぬ    Chrome  Edge  Firefox
KeyQ:         51,  //  O5C   Q た    Chrome        Firefox
81:           51,  //  O5C   Q た    Chrome  Edge  Firefox
Digit2:       52,  //  O5C#  2"ふ    Chrome        Firefox
50:           52,  //  O5C#  2"ふ    Chrome  Edge  Firefox
KeyW:         53,  //  O5D   W て    Chrome        Firefox
87:           53,  //  O5D   W て    Chrome  Edge  Firefox
Digit3:       54,  //  O5D#  3#あぁ  Chrome        Firefox
51:           54,  //  O5D#  3#あぁ  Chrome  Edge  Firefox
KeyE:         55,  //  O5E   E いぃ  Chrome        Firefox
69:           55,  //  O5E   E いぃ  Chrome  Edge  Firefox
  //Digit4:                  4$うぅ  Chrome        Firefox
  //52:                      4$うぅ  Chrome  Edge  Firefox
KeyR:         56,  //  O5F   R す    Chrome        Firefox
82:           56,  //  O5F   R す    Chrome  Edge  Firefox
Digit5:       57,  //  O5F#  5%えぇ  Chrome        Firefox
53:           57,  //  O5F#  5%えぇ  Chrome  Edge  Firefox
KeyT:         58,  //  O5G   T か    Chrome        Firefox
84:           58,  //  O5G   T か    Chrome  Edge  Firefox
Digit6:       59,  //  O5G#  6&おぉ  Chrome        Firefox
54:           59,  //  O5G#  6&おぉ  Chrome  Edge  Firefox
KeyY:         60,  //  O5A   Y ん    Chrome        Firefox
89:           60,  //  O5A   Y ん    Chrome  Edge  Firefox
Digit7:       61,  //  O5A#  7'やゃ  Chrome        Firefox
55:           61,  //  O5A#  7'やゃ  Chrome  Edge  Firefox
KeyU:         62,  //  O5B   U な    Chrome        Firefox
85:           62,  //  O5B   U な    Chrome  Edge  Firefox
  //Digit8:                  8(ゆゅ  Chrome        Firefox
  //56:                      8(ゆゅ  Chrome  Edge  Firefox
KeyI:         63,  //  O6C   I に    Chrome        Firefox
73:           63,  //  O6C   I に    Chrome  Edge  Firefox
Digit9:       64,  //  O6C#  9)よょ  Chrome        Firefox
57:           64,  //  O6C#  9)よょ  Chrome  Edge  Firefox
KeyO:         65,  //  O6D   O ら    Chrome        Firefox
79:           65,  //  O6D   O ら    Chrome  Edge  Firefox
Digit0:       66,  //  O6D#  0 わを  Chrome        Firefox
48:           66,  //  O6D#  0 わを  Chrome  Edge  Firefox
KeyP:         67,  //  O6E   P せ    Chrome        Firefox
80:           67,  //  O6E   P せ    Chrome  Edge  Firefox
  //Minus:                   -=ほ    Chrome        Firefox
  //173:                     -=ほ                  Firefox
  //189:                     -=ほ    Chrome  Edge
BracketLeft:  68,  //  O6F   @`゛    Chrome        Firefox
64:           68,  //  O6F   @`゛                  Firefox
192:          68,  //  O6F   @`゛    Chrome  Edge
Equal:        69,  //  O6F#  ^~へ    Chrome        Firefox
160:          69,  //  O6F#  ^~へ                  Firefox
222:          69,  //  O6F#  ^~へ    Chrome  Edge
BracketRight: 70,  //  O6G   [{゜「  Chrome        Firefox
219:          70,  //  O6G   [{゜「  Chrome  Edge  Firefox
IntlYen:      71   //  O6G#  \|ー    Chrome        Firefox
  //220:      71   //  O6G#  \|ー    Chrome  Edge  Firefox  keyCode=220では[\_ろ]と[\|ー]を見分けられない
  //--------------------------------------------------------
};
//Backspace         8  BackSpace        Chrome
//Tab               9  Tab              Chrome
//Numpad5          12  テンキー5        Chrome  NumLock=OFF
//Enter            13  Enter            Chrome
//NumpadEnter      13  テンキーEnter    Chrome
//ShiftLeft        16  左Shift          Chrome
//ShiftRight       16  右Shift          Chrome
//ControlLeft      17  左Ctrl           Chrome
//ControlRight     17  右Ctrl           Chrome
//AltLeft          18  左Alt            Chrome
//AltRight         18  右Alt            Chrome
//Pause            19  Pause            Chrome
//Escape           27  Esc              Chrome
//Convert          28  変換             Chrome
//NonConvert       29  無変換           Chrome
//Space            32  スペース         Chrome
//Numpad9          33  テンキー9PgUp    Chrome  NumLock=OFF
//PageUp           33  PageUp           Chrome
//PageDown         34  PageDown         Chrome
//Numpad3          34  テンキー2PageDn  Chrome  NumLock=OFF
//End              35  End              Chrome
//Numpad1          35  テンキー1End     Chrome  NumLock=OFF
//Numpad7          36  テンキー7Home    Chrome  NumLock=OFF
//Home             36  Home             Chrome
//Numpad4          37  テンキー4←      Chrome  NumLock=OFF
//ArrowLeft        37  ←               Chrome
//Numpad8          38  テンキー8↑      Chrome  NumLock=OFF
//ArrowUp          38  ↑               Chrome
//Numpad6          39  テンキー6→      Chrome  NumLock=OFF
//ArrowRight       39  →               Chrome
//Numpad2          40  テンキー2↓      Chrome  NumLock=OFF
//ArrowDown        40  ↓               Chrome
//Insert           45  Insert           Chrome
//Numpad0          45  テンキー0Insert  Chrome  NumLock=OFF
//NumpadDecimal    46  テンキー.Delete  Chrome  NumLock=OFF
//Delete           46  Delete           Chrome
//MetaLeft         91  窓キー           Chrome
//ContextMenu      93  メニュー         Chrome
//Numpad0          96  テンキー0Insert  Chrome  NumLock=ON
//Numpad1          97  テンキー1End     Chrome  NumLock=ON
//Numpad2          98  テンキー2↓      Chrome  NumLock=ON
//Numpad3          99  テンキー2PageDn  Chrome  NumLock=ON
//Numpad4         100  テンキー4←      Chrome  NumLock=ON
//Numpad5         101  テンキー5        Chrome  NumLock=ON
//Numpad6         102  テンキー6→      Chrome  NumLock=ON
//Numpad7         103  テンキー7Home    Chrome  NumLock=ON
//Numpad8         104  テンキー8↑      Chrome  NumLock=ON
//Numpad9         105  テンキー9PgUp    Chrome  NumLock=ON
//NumpadMultiply  106  テンキー*        Chrome
//NumpadAdd       107  テンキー+        Chrome
//NumpadSubtract  109  テンキー-        Chrome
//NumpadDecimal   110  テンキー.Delete  Chrome  NumLock=ON
//NumpadDivide    111  テンキー/        Chrome
//F1              112  F1               Chrome
//F2              113  F2               Chrome
//F3              114  F3               Chrome
//F4              115  F4               Chrome
//F5              116  F5               Chrome
//F6              117  F6               Chrome
//F7              118  F7               Chrome
//F8              119  F8               Chrome
//F9              120  F9               Chrome
//F10             121  F10              Chrome
//F11             122  F11              Chrome
//F12             123  F12              Chrome
//NumLock         144  NumLock          Chrome
//ScrollLock      145  ScrollLock       Chrome
//                173  Mute             Chrome
//                174  小さく           Chrome
//KanaMode        242  カタカナひらがな Chrome
//Backquote       244  半角全角         Chrome

let audioAvailable = false;  //true=出力可能
let kenGeta = 0;

let shiftLeftOn = false;  //true=左Shiftが押されている
let shiftRightOn = false;  //true=右Shiftが押されている

//  ソフトペダルを動かす
function moveSoftPedal () {
  if (pedalPhaK[0] == 0) {  //ソフトペダルが踏まれていない
    //ソフトペダルが踏まれた
    movePedal (0, 1);
  } else {  //ソフトペダルが踏まれている
    //ソフトペダルが離された
    movePedal (0, 0);
  }
}

//  ソステヌートペダルを動かす
function moveSostenutoPedal () {
  if (pedalPhaK[1] == 0) {  //ソステヌートペダルが踏まれていない
    //ソステヌートペダルが踏まれた
    for (let kn = 0; kn < KEN_COUNT; kn++) {
      let ki = kenInfoArray[kn];
      if (ki && ki.ki$keyOn && ki.ki$pressed) {  //キーオンしていて押されている
        ki.ki$sostenuto = true;  //離したときキーオフしない
      }
    }
    movePedal (1, 1);
  } else {  //ソステヌートペダルが踏まれている
    //ソステヌートペダルが離された
    for (let kn = 0; kn < KEN_COUNT; kn++) {
      let ki = kenInfoArray[kn];
      if (ki && ki.ki$keyOn && !ki.ki$pressed && ki.ki$sostenuto) {  //キーオンしていて押されていなくてソステヌートで伸ばされている
        ki.ki$sostenuto = false;  //ソステヌートを解除する
        kenKeyOff (ki);  //キーオフする
      }
    }
    movePedal (1, 0);
  }
}

//  ラウドペダルを動かす
function moveLoudPedal () {
  if (pedalPhaK[2] == 0) {  //ラウドペダルが踏まれていない
    //ラウドペダルが踏まれた
    movePedal (2, 1);
  } else {  //ラウドペダルが踏まれている
    //ラウドペダルが離された
    for (let kn = 0; kn < KEN_COUNT; kn++) {
      let ki = kenInfoArray[kn];
      if (ki && ki.ki$keyOn && !ki.ki$pressed) {  //キーオンしていて押されていない
        kenKeyOff (ki);  //キーオフする
      }
    }
    movePedal (2, 0);
  }
}

//  キーが押された
function windowOnkeydown (e) {
  e = e || window.event;
  //console.log ("code=" + e.code + ",keyCode=" + e.keyCode);
  if (focusedElement != null ||  //フォーカスがテキストエリアにある
      e.ctrlKey) {  //Ctrlキーが押されている
    return;  //何もしない
  }
  let keyCode = e.keyCode || e.which || 0;
  let code = e.code || "";
  switch (code) {
  case "Escape":
    if (docWindow.pw$isOpen ()) {  //説明ウインドウが開いている
      docWindow.pw$close ();  //説明ウインドウを閉じる
    } else if (docWindow.pw$isClosed ()) {  //説明ウインドウが閉じている
      opmWindow.pw$close ();  //FM音源ウインドウを閉じる
      pcmWindow.pw$close ();  //ADPCM音源ウインドウを閉じる
      docWindow.pw$open ();  //説明ウインドウを開く
    }
    break;
  case "Insert":
  case "Numpad0":
    if (opmWindow.pw$isOpen ()) {  //FM音源ウインドウが開いている
      opmWindow.pw$close ();  //FM音源ウインドウを閉じる
    } else if (opmWindow.pw$isClosed ()) {  //FM音源ウインドウが閉じている
      docWindow.pw$close ();  //説明ウインドウを閉じる
      pcmWindow.pw$close ();  //ADPCM音源ウインドウを閉じる
      opmWindow.pw$open ();  //FM音源ウインドウを開く
    }
    break;
  case "Delete":
  case "NumpadDecimal":
    if (pcmWindow.pw$isOpen ()) {  //ADPCM音源ウインドウが開いている
      pcmWindow.pw$close ();  //ADPCM音源ウインドウを閉じる
    } else if (pcmWindow.pw$isClosed ()) {  //ADPCM音源ウインドウが閉じている
      docWindow.pw$close ();  //説明ウインドウを閉じる
      opmWindow.pw$close ();  //FM音源ウインドウを閉じる
      pcmWindow.pw$open ();  //ADPCM音源ウインドウを開く
    }
    break;
  case "Enter":
  case "NumpadEnter":
    kenbanfutaOpenClose ();  //鍵盤蓋を開閉する
    break;
  case "Backspace":
    yaneOpenClose ();  //屋根を開閉する
    break;
  case "Tab":
    fumendaiOpenClose ();  //譜面台を開閉する
    break;
  case "ShiftLeft":
    if (shiftRightOn) {  //右シフトが押されている
      shiftLeftOn = false;
      shiftRightOn = false;
      kenGeta = 0;  //中央に戻す
    } else if (!shiftLeftOn) {  //左シフトが押されていない。長押ししてもリピートしないようにする
      shiftLeftOn = true;
      if (-36 < kenGeta) {
        kenGeta -= 12;  //1オクターブ低くする
      }
    }
    break;
  case "ShiftRight":
    if (shiftLeftOn) {  //左シフトが押されている
      shiftLeftOn = false;
      shiftRightOn = false;
      kenGeta = 0;  //中央に戻す
    } else if (!shiftRightOn) {  //右シフトが押されていない。長押ししてもリピートしないようにする
      shiftRightOn = true;
      if (kenGeta < 36) {
        kenGeta += 12;  //1オクターブ高くする
      }
    }
    break;
  case "AltLeft":
    if (pedalPhaK[0] == 0) {  //ソフトペダルが踏まれていない
      moveSoftPedal ();  //ソフトペダルを動かす
    }
    break;
  case "Space":
    if (pedalPhaK[1] == 0) {  //ソステヌートペダルが踏まれていない
      moveSostenutoPedal ();  //ソステヌートペダルを動かす
    }
    break;
  case "AltRight":
    if (pedalPhaK[2] == 0) {  //ラウドペダルが踏まれていない
      moveLoudPedal ();  //ラウドペダルを動かす
    }
    break;
  case "ArrowUp":
  case "Numpad8":
    mouseDy += 0.02;
    break;
  case "ArrowDown":
  case "Numpad2":
    mouseDy -= 0.02;
    break;
  case "ArrowLeft":
  case "Numpad4":
    mouseDx += 0.02;
    break;
  case "ArrowRight":
  case "Numpad6":
    mouseDx -= 0.02;
    break;
  case "PageUp":
  case "Numpad9":
    mouseDw--;
    break;
  case "PageDown":
  case "Numpad3":
    mouseDw++;
    break;
  case "NumpadSubtract":
    toggleFloorFixedMode ();
    break;
  case "NumpadDivide":
    setScreenMode (screenMode < 2 ? screenMode + 1 : 0);
    break;
  default:
    if (kenbanfutaPhaK == kenbanfutaPhaN) {  //鍵盤蓋が開いている
      let kn = KEN_MAP[code] || KEN_MAP[keyCode] || -1;
      if (0 <= kn) {  //鍵が押された
        kn += kenGeta;
        if (0 <= kn && kn < KEN_COUNT) {
          let ki = kenInfoArray[kn];
          if (!ki.ki$pressed) {  //押されていない
            kenKeyOn (ki);  //キーオンする
            kenDown (ki);  //押す
          }
        }
      }
    }
  }
  consumeEvent (e);
}

//  キーが離された
function windowOnkeyup (e) {
  e = e || window.event;
  let keyCode = e.keyCode || e.which || 0;
  let code = e.code || "";
  switch (code) {
  case "ShiftLeft":
    shiftLeftOn = false;
    break;
  case "ShiftRight":
    shiftRightOn = false;
    break;
  case "AltLeft":
    if (pedalPhaK[0] == 1) {  //ソフトペダルが踏まれている
      moveSoftPedal ();  //ソフトペダルを動かす
    }
    break;
  case "Space":
    if (pedalPhaK[1] == 1) {  //ソステヌートペダルが踏まれている
      moveSostenutoPedal ();  //ソステヌートペダルを動かす
    }
    break;
  case "AltRight":
    if (pedalPhaK[2] == 1) {  //ラウドペダルが踏まれている
      moveLoudPedal ();  //ラウドペダルを動かす
    }
    break;
  default:
    if (kenbanfutaPhaK == kenbanfutaPhaN) {  //鍵盤蓋が開いている
      let kn = KEN_MAP[code] || KEN_MAP[keyCode] || -1;
      if (0 <= kn) {  //鍵が離された
        kn += kenGeta;
        if (0 <= kn && kn < KEN_COUNT) {
          let ki = kenInfoArray[kn];
          if (ki.ki$pressed) {  //押されている
            if (pedalPhaK[2] == 0 && !ki.ki$sostenuto) {  //ラウドペダルが踏まれていなくてソステヌートがかかっていない
←Previous | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | Next→