미디파일을 tone()으로 변환하기 [아두이노]
아두이노

미디파일을 tone()으로 변환하기 [아두이노]

반응형

 

 

 

아두이노를 이용해 음악을 재생하는 방법은 정말 다양하지만 가장 기본적인 방법은 tone()함수와 부저를 이용해 멜로디를 연주하는 것이다. 

 

다만 아두이노와 부저만 있으면 간단하게 연주를 할 수 있지만 멜로디를 직접 만들어야 한다는것이 가장 큰 단점이다. 물론 공개된 멜로디 코드들이 있지만 (슈퍼마리오 테마들이 대부분이다.) 본인이 원한는 곡은 찾기는 어려울 것이다. 그래서 이번에는 미디 파일을 이용해서 손쉽게 멜로디를 만들수있는 방법을 소개한다.

 

우선 연주하고 싶은 곡의 미디 파일을 준비한다. 미디 파일을 구하는 방법은 다양하지만 처음이라면 유튜브에 해당 곡의 이름 + midi로 검색하면 미디파일을 실행하는 영상과 게시자의 링크와 함께 미디 파일을 쉽게 구할 수 있다. 

 

 

영화 하울의 움직이는 성의 메인 테마인 Marry go round of life (인생의 회전목마) 를 예로 들어 보았다. 화살표를 친 부분에서 미디파일을 다운받을수 있다.

 

미디파일이 준비되었다면 아래 링크로 접속한다.

 

반응형

https://sparks.gogo.co.nz/midi_tone.html

 

 

 

 

위 사이트는 미디 파일을 아두이노가 인식할 수 있는 소스코드로 변환시켜주는 아주 유용한 사이트이다.  다만 변환하기 전에 몇가지 설정값을 입력해야 하는데, 아래의 사진을 참고하자.

 

필자가 사용하는 값들이다. (마지막 음악의 길이는 100이 아닌 넉넉히 10000을 입력하자, 아두이노의 메모리가 부족하지는 않다.) 이렇게 입력한뒤 하단의 Submit 버튼을 누르면 아래와 같이 상당히 긴 소스코드가 출력된다.

 

소스코드의 길이만 무려 1500줄 가까이 되므로 극히 일부만 올려보았다. 이 방대한 소스를 전부 아두이노에 업로드 하면 된는데 몇가지 수정과 확인해야 할 사항들이 있다.

void loop() 
{
  // Here is where you choose the melody and the tempo (speed) to play it at
  // The melody is numbered from 0 .. 3
  
  // The tempo is a value from 1 .. 255, where 1 is fast and 255 is extremely
  // slow.  The tempo a given melody sounds best at varies a lot, you just have
  // to experiment, some sound good at tempo 1, some might need tempo 50!
  
  uint8_t melodyToPlay = 0;
  uint8_t tempoToPlay  = 4;
  
  playMelody(melodyToPlay, tempoToPlay); 
    
  // Unless you have changed them, these were the melodies which we extracted
  // from Secret_-_Dou_Qin__Duet_.mid and are encoded below in 
  // the Melody Data section.
  
  // 0 - Pno 1 - Right Hand
  // 1 - Pno 1 - Left Hand
  // 2 - Pno 2 - Right Hand
  // 3 - Pno 2 - Left Hand

}

 

우선 조금만 내리면 찾을 수 있는 void loop 부분이다. The melody is numbered from 0 .. 4 이 부분은 멜로디를 선택할수있는 경우의 수를 알려주는데 필자가 선택한 미디 파일의 경우 2명의 듀엣 연주라서 이렇게 표시 되지만 양손연주의 경우 대부분 The melody is numbered from 0 .. 1 로 표시된다. 각각의 값은

 

// 0 - Pno 1 - Right Hand
// 1 - Pno 1 - Left Hand
// 2 - Pno 2 - Right Hand
// 3 - Pno 2 - Left Hand

 

를 의미한다.

 

그러면 uint8_t melodyToPlay = 0; 의 값을 0에서 4중 원하는 값으로 수정하면 된다.

 

uint8_t tempoToPlay  = 4;  는 음악의 템포인데,  적정 값은 2이다. (1은 원래 곡보다 조금더 빠르고 숫자가 커질수록 느려진다. 225까지 설정가능한데 40만 넘어가도 알 수 없는 음악이 된다.)

 

static const uint8_t tonePin = 4;

 

이제 마지막으로 코드에 설명되어있는 부저, 또는 스피커를 디지털 4번핀에 연결한 뒤, 코드를 업로드 해보면 바로 연주를 시작할 것이다.

 

다만 아두이노의 특성상 한번에 하나의 음계만 처리할 수 있으므로 미디파일에서의 화음은 단음으로 처리한다. (사이트에서의 이 알고리즘의 원리는 정확히는 알지못한다.) 그래서 일부 음악은 다소 어색하게 들릴 수 있으므로 복잡한 곡보다는 간단한 곡을 추천한다.

 

관련글

2018/02/16 - [아두이노/프로젝트] - 아두이노 3채널 미디 오케스트라

2018/08/27 - [아두이노/프로젝트] - 아두이노 다채널 미디 플레이어 제작 #1 - I2C 통신 테스트

2018/08/31 - [아두이노/프로젝트] - 에어드럼 제작하기 (OpenCV+아두이노 Air Drum)

2018/10/10 - [아두이노/프로젝트] - 아두이노 다채널 미디 플레이어 제작 #2 - 중간점검

2018/10/28 - [분류 전체보기] - 아두이노 다채널 미디 플레이어 제작 #3 - 5채널 테스트

2018/11/03 - [아두이노/프로젝트] - 아두이노 다채널 미디 플레이어 제작 #4 - Attiny85 ver

 

 

반응형
    # 테스트용