#include <Keypad.h>  // 키 매트릭스 사용을 위한 헤더파일
int Buzzer_Pin = 3;  // 2번핀에 부저 + 연결
int Tones[8] = {261, 294, 330, 349, 392, 440, 494, 515};
//               도   레    미   파   솔   라   시   도
int Tones_Number;  // Tones에 들어갈 변수
char key;  // 현재키값 변수
char key_h;  // 키값유지 변수
KeyState key_c;  // 키 상태값 변수
const byte ROWS = 4;  // 키좌표값
const byte COLS = 4;  // 키좌표값
char keys[ROWS][COLS] = {  // 스위치 설정 값
  {0, 1, 2, 3},
  {4, 5, 6, 7},
  {8, 9, 10, 11},
  {12, 13, 14, 15}
};
byte rowPins[ROWS] = {7, 6, 5, 4};  // 핀번호
byte colPins[COLS] = {8, 9, 10, 11};  // 핀번호
// 키보드 사용전 설정 및 준비
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );
void setup() {  // 초기화
  Serial.begin(9600);
}
/*
   키 매트릭스를 이용해 피아노 연주 하듯이 소리 낸다
*/
void loop() {

  key = keypad.getKey();        // 키보드값 읽어오기
  key_c =  keypad.getState();   // 키보드 상태 읽어오기
  // 0 : 입력없음
  // 1 : 입력됨
  // 2 : 입력중
  // 3 : 입력 종료
  if (key != NO_KEY) { // 만약 새로운 키값이 들어오면
    key_h = key; // 새로운 키값을 key_h에 입력
  }
  if (key_c == 0) { // 만약 입력이 없을 때
    noTone(Buzzer_Pin);  // 부저 종료
  }
  else {  // 입력이 없지 않을때
    if (key_h > 7) {
      key_h = 0;  // key_h의 값이 7보다 크면 key_h의 값을 0으로 만들어라
      Serial.println(key);
    }
    tone(Buzzer_Pin, Tones[key_h]); // 들어온 키 값에 대한 소리를 내라
  }
}
