아두이노/프로젝트

[아두이노 프로젝트] 노래방 기기 만들기 - 1

다락공방 2024. 8. 8. 01:28

 

최종 목표는 위와 같은 시스템이다. 

시나리오:

사용자는 ESP32 보드에서 출력되는 멜로디를 따라 마이크 센서에 노래를 부른다.

노래가 끝난후, ESP32보드의 LED Matrix에 점수가 출력된다. 

 

추가적으로, PC에서 NODE-RED의 UI를 통해 노래시작, 템포, 음정 조정을 할 수 있다.

리모컨은 또 다른 하나의 ESP보드로 멜로디의 정지/ 시작을 버튼으로 조정할 수 있다.

 

사실 리모컨에 더 많은 기능을 넣고자 하였지만 사정상 못하게 되었다. 

 

1. 멜로디 구성

멜로디는 ESP32보드의 BUZZER를 이용해 멜로디를 출력하였다. 특정 음정을 출력하는 방법은 주파수(음정) + 길이를 통해 만들 수 있다. 멜로디는 5개를 넣었고, 악보를 직접보고 박자 및 음정을 입력해서 넣었다.

박자 array의 경우, 보이는 것처럼 숫자배열로 구성하였다. 4, 8, 16 등의 몇분음표인지를 기준으로 설정하였으며, 소수점으로 구성된 음표는 점 4분음표, 8분음표 등의 점을 포함한 음표이다.

음정 array의 경우, 모든 음정이 순서대로 입력되어 있는 배열을 선언하여, 매개변수로 원하는 음정과 몇 반음정 올릴지를 입력하면, tuner함수를 통해 해당 음계를 반환하도록 설계했다.

 

 

 

2. 연주시간 구성

한음정의 길이 지속시간을 보통은 delay함수를 통해 할 것인데, 우리는 연주 중간에 노래의 음정 변경이나 템포조절 명령을 줄 것이기 때문에, 조금 특이하게, 한 음정의 시작 시간을 getNow()함수를 통해 기록후, while문을 돌때마다 현재시간을 체크해, 만약 해당 음정 길이에 도달한것이 확인되면 while문을 빠져나가도록하였다.

따라서, 한음정의 delay가 아니라 한번의 while문마다 (엄밀히 말해 while문 도는 시간 + 10ms) 중간 입력을 확인할 수 있게된다.

 

 

또한 마이크 입력에서는 voice_loud 에 음성크기를 담아 평가한다. m_print로 노래가 끝나면, led matrix에 최종 점수를 출력한다. 

 

위의 설계를 통해 일단 노래 입력으로 점수를 출력하는 것을 설계하였다. 

2편에는 부가기능: PC UI + 리모컨을 만들어 본다.