음악 악기 쉴드(Musical Instrument Shield) 퀵 스타트 가이드

음악 악기 쉴드(Musical Instrument Shield) 퀵 스타트 가이드

음악 악기 쉴드에 있는 작은 칩은 수천가지의 다른 소리를 낼수 있는 능력을 가지고 있습니다. 혹시 씬데사이저를 연주하여 보신 적이 있으신죠? 음악 악기 쉴드상의 VS1053 칩은 씬데사이저와 같이 많은 소리를 낼수 있습니다. 이를 위해서는 VS1053칩을 어떻게 제어하는지 살펴보아야 합니다.

준비사항

셋업하기

조립

음악 악기 쉴드아두이노와 연결하기 위해서는 먼저 적재가능 헤더를 쉴드에 납땜하여야 합니다. 쉴드를 납땜한 후 아두이노와 연결합니다.

소프트웨어/펌웨어

예제 코드는 NewSoftSerial Library를 사용합니다. 만약 아두이노 IDE버전이 1.0 이상이라면 이 라이브러리는 자동으로 설치 됩니다. 만약 설치가 안된 버전을 사용하고 있다면 수동으로 설치하여 주어야 합니다.

예제 코드 사용하기

MIDI 스펙을 살펴보기 전에, 먼저 몇몇 소리를 쉴드를 이용하여 만들어 보겠습니다. 아래의 예제를 다운로드 하여 아두이노 IDE에 로드합니다.

본 예제는 57600 보오드레이트로 연결된 시리얼 터미널에 상태를 출력합니다. 실제 MIDI 는 New SoftSerial 라이브러리를 이용하여 그리고 핀 3번과 핀4번을 통하여 31250의 보오드 레이트로 통신합니다. 예제코드가 아두이노에 로드되면 헤드폰이나 스피커를 쉴드의 오디오 잭에 연결하여 보십시오. 여러가지 소리를 들으실 수 있습니다.

코드를 살펴보면 코드는 악기의 bank를 선택하고 bank안에 있는 모든 음계를 연주합니다. 예제의 경우 사운드 효과 bank를 선택하였고 여러가지 소리 효과에 대응하는 각각의 노트가 차례로 선택됩니다. 다른 악기 bank를 다루기 위해 MIDI프로토콜에 대해 조금 배워야 할 필요가 있습니다.

간단한 MIDI와 예제코드

아래의 두 문서는 MIDI 및 쉴드에서 사용하는 VS1053에 대한 포괄적인 내용을 담고 있습니다. 여기서 설명되는 대부분의 내용도 아래의 두 문서에서 언급이 되고 있습니다.

MIDI 프로토콜은 기본적으로 바이트 순서를 가진 시리얼 프로토콜입니다. MIDI 메세지는 한개, 두개 혹은 세개의 바이트로 구성이 되어 있고 몇몇 메세지가 다른 메시지들보다 주로 사용이 됩니다. 서로 다른 여러 정보가 MIDI 메세지에 의해 전달이 되는데 이런 것을을 음계를 on/off시키는 것에서부터 시스템 레벨 제조사 정보를 전송하는 것까지 포함됩니다. MIDI를 전혀 다루어 보신적이 없다면 바로 이해가 어려울지 모르지만, MIDI를 완전히 동작시키려면 MIDI specification 튜토리얼 문서를 읽어 보는 것이 좋습니다.

예제 스케치 코드를 살펴보겠습니다. 아두이노는 MIDI 리셋 라인을 토글 시켜 디바이스 사용을 시작합니다. 루프 함수내에 세개의 테스트 루프가 있는데, 두개는 코맨트가 달려있고 한개는 코맨트가 없습니다. 코맨트가 없는 루프를 살펴보면, 이 루프에서 음에 대한 첫번째 함수 호출은 아래 코드입니다.

talkMIDI(0xB0, 0, 0x78);

위의 코드는 세 바이트의 MIDI메세지의 일반적인 예입니다. 첫번째 바이트 0xB0는 이 메세지가 "control change" 메세지입을 의미합니다. 두번째 바이트 0 은 "controller"를 0의 값으로 변경하고 싶다는 것을 의미합니다. 총 127개의 controller가 있는데 이 컨트롤러들의 값이 0인 것은 "Bank Select"를 의미합니다. 세번째 바이트 0x78은 선택하고자 하는 bank를 의미합니다. 0x78은 percussion bank를 말합니다.

다음으로 살펴볼 MIDI메세지는 아래의 코드인데

talkMIDI(0xC0, instrument, 0);

첫번째 바이트 0xC0는 MIDI 채널 0상의 Program Change 명령을 의미합니다. Program Change란 선택된 bank내에서 특정 악기 샘플 세트를 지정하라는 것을 의미합니다. instrument변수는 우리가 로드하기 원하는 특정 악기 샘플입니다. bank내에서 다른 악기를 선택하기 위해서는 이 instrument변수를 변경해야 합니다. 예제코드의 경우에는 instrument 변수값이 30입니다. 근데 예제에서 선택한 bank는 단 한개의 악기만 가지고 있어서 사실 instrument변수가 무엇이던지 상관이 없습니다. 이 함수는 연주하고자 하는 MIDI채널을 셋팅하는데 필요합니다. VS1053의 데이터쉬트 30페이지에 관련 내용이 나와 있습니다.

아래는 예제에서 선택한 bank에 포함되어 있는 음들이 나와 있는 표입니다.

bank내에 연주 할 수 있는 음들이 총 60개(27~87) 있는 것을 확인 할 수 있습니다. 음을 연주하기 위해서는 noteOn 명령을 연주하고자 하는 음의 값과 같이 보내주어야 합니다. 예제 코드에서는 아래와 같이 명령을 보내주었습니다.

noteOn(0, note, 60);

noteOn() 함수는 MIDI 명령을 보내 음을 만들어 내게 합니다. 첫번째 파라메터 0은 어떤 MIDI채널을 연주할 것인지를 의미합니다. 우리는 채널0을 악기로 초기화 하였기 때문에, 0으로 설정합니다. 다음 파라메터는 실제 연주할 음입니다. 이 변수는 위의 테이블에 나와 있는 값 중에 하나가 됩니다. 예제에서는 27에서 87까지 루프를 돌면서 모든 음을 한번씩 연주하게 합니다. 마지막 변수는 속도입니다. 이 값은 음이 얼마나 힘차게 연주되는가를 설정해 주는 변수입니다. 숫자가 낮으면 가볍게 여주되고 숫자가 높으면 크고 힘차게 연주가 됩니다. 이 속도는 피아노를 칠때 피아노를 얼마나 세게 치는지 정도를 나타내는 변수 값으로 보면 됩니다.

noteOn() 함수 호출 이후에는 50ms 동안의 딜레이가 있습니다. 이말은 어떤 음을 선택하든지 최소 50ms동안 연주가 된다는 것을 의미합니다. 이 딜레이 후에는 칩에게 음을 끄라고 이야기를 해주어야 합니다. 그래서 아래와 같이 noteOff() 함수를 호출합니다.

noteOff(0, note, 60);

이 함수는 noteOn()함수와 정확히 하는일이 반대되는 함수입니다. 마지막 파라메터 60은 release velocity라고 하는데 이에 대한 좀더 자세한 정보는 MIDI specification 튜토리얼을 참고 하십시오.

루프는 계속적으로 돌면서 percussion bank의 음을 한번에 하나씩 연주합니다. 다른 뱅크와 악기를 선택하여 좀더 많은 소리를 연주하여 보십시오.

VS1053 datasheet 를 보면 모든 bank와 악기에 대한 값이 나와 있습니다.

제품정보: http://www.vctec.co.kr/front/php/product.php?product_no=804&main_cate_no=161&display_group=1

가치창조기술

Comments