Dr.Lee's Blog..

노래하는 캔투스 본문

Engineer's world/EISC

노래하는 캔투스

파파 존스 2011. 5. 10. 03:26
반응형
어제도 우리 4살짜리 가온이가 2천원짜리 장난감에 노래를 듣는다.

그것도 아이들의 명곡, 뽀로로~

그런데 노래 소리의 수준은 이미 이 글을 보는 사람이라면 다 알만한 수준의 소리.

나름 수입품인 이 장난감.. (made in China~)

버튼 누르면 "삐 삐삐 삐삐삐삐~~ (= 눈 덮인 숲속나라~~)"

"아빠가 다른 노래 소리 난거 만들어줄까?"라는 질문에 좋단다~

사실, 지금 8살인 조은이때도 이런거 소리 좋은걸 만들어 준다고 뻥은 쳤지만 실제로 만들어줄 시간적인 여유가 없었다.



서랍을 뒤지니까 나름 집에 굴러다니는 부저가 몇개 있다.

데스크탑 PC 뚜껑을 열어도 있고, 아이들 부셔진 한때 소리 나던 장난감을 뜯어봐도 있다.

지난번 LED 예제에서 GPIO에 시간 지연을 주어가면서 0, 1을 번갈아 써 주어서 깜빡깜빡 거린 기억이 있을 것이다.

그 예제를 하나 복사해서 SND라는 프로젝트를 만들었다.

우선 인터넷에서 소리의 주파수를 찾아봤다.

미디표현으로 C5에 해당하는 도 음이 523.25Hz였다.

이것은 1초에 523.25번 파형의 고저(高低)를, 디지털로 표현하면 1과 0을 반복한다는 의미이다. 1개의 고저에 해당하는 길이로 달리 표현하면 1/523.25=0.00191초. (=1.91 msec=1910 usec)

이것을 이렇게 표현했다.

int note = 1910;


*R_P5oHIGH = (1<<2);   //PIO5.2 high , SND wave high
delayus(note>>1);
*R_P5oLOW = (1<<2);   //PIO5.2 low , SND wave low
delayus(note>>1);


GPIO는 번호를 바꾸었다. 가지고 있는 부저의 다리 간격이 대충 Cantus trip 보드의 커넥터 핀 3개정도 된다.

J1에 GND로 나와 있는 핀이 가운데 4개 있으니까 이 GND중에 하나를 쓰고, 그 아래로 3핀 더 내려오니까 P5.2라고 되어 있는 26번 핀이 있다. 0,1의 제어는 이 GPIO의 5번째 그룹의 두번째 핀을 사용하기로 했다.

1910 usec 마다 한번씩 1과 0을 반복해서 부저에 연결된 GPIO를 제어하면 도~~~~라는 소리가 난다는 이야기다. delayus()라는 함수는 지금 CANTUS가 90MHz로 동작하니까 대충 클럭 하나에 동작하는게 11 nsec 정도가 된다. 그러면 대충 9클럭동안 CANTUS가 쉬어 주면 거의 100 nsec = 0.1 usec가 되니까 이것의 10배를 쉬어 주면 대~~충 1 usec가 된다.  이렇게 동작하는 함수를 delayus()라고 만들어 사용했다.

노래를 만들어 보려면 도~ 만 있어야 할게 아니라 도래미파~ 다 있어야 한다.

그냥 불러 쓰기 편하게 #define이라는 것을 이용해서 프로그램 앞 부분에 포진했다.

#define C5 1910 // 도
#define D5 1703 // 레
#define E5 1517 // 미
#define F5 1432 // 파
#define G5 1276 // 솔
#define A5 1136 // 라
#define B5 1012 // 시
#define C6  956 // 도


그러면, 명곡 감상을 해보자.



뽀로로를 만들어 올리려고 했는데, 나름 저작권이 있는 노래라 집에서 아이들을 위해서만 들려주기로 하고 여러분께 각자의 숙제~

대신 저 동영상에 사용한 소스를 올려 놓는다.

마음껏 바꿔가며 태어나는 명곡을 기대하며~~

02.SND_TRIP_20110510



Cantus는 소프트웨어로 MP3 파일도 재생할 수 있는 계산 능력을 가진 마이크로컨트롤러이다.

제 능력을 십분 발휘해야 마땅하지만, 그건 이미 Cantus를 잘 쓰고 있는, 소프트웨어를 좀 아는 사람들에게 맡겨 놓자.

이미 설치되어 있는 Cantus의 SDK에 몇가지 MP3 재생 예제가 들어 있으니까 참고로 하면 될 것이다.

내장된 보이스코덱을 사용해도 되고, 좀더 좋은 음질의 음악을 듣고 싶으면

Cantus에 내장된 I2S라는 사운드칩 사이의 프로토콜을 사용해서 외부 음원 코덱 칩을 거치면 된다.

이건 나중에 기회가 되면, 고급 사용자를 위한 부분을 다룰 때 한번 다시 생각해보기로 하고, 여기서는 접어둔다.

시중에서 만나볼 수 있는 일부 하이패스 단말기에 "하이패스가 정상결제 되었습니다~" 라는 경쾌한 목소리 역시 CANTUS를 이용해서 재생하고 있는 것이기에 여기 이 예제에서 GPIO 한개만을 이용해서 대충~~ 주파수 맞추어서 부저로 재생하는 소리에 실망하기 없기다.





반응형