아두이노 > 코디랩 - 아두이노 레오나르도 활용 - 6 : USB-MIDI 구현 하기

TODAY978 TOTAL613,833
사이트 이용안내
Login▼/회원가입
최신글보기 질문게시판 기술자료 동영상강좌

아두이노 센서 ATMEGA128 PWM LED 초음파 AVR 블루투스 LCD UART 모터 적외선


BASIC4MCU | 아두이노 | 아두이노 | 코디랩 - 아두이노 레오나르도 활용 - 6 : USB-MIDI 구현 하기

페이지 정보

작성자 키트 작성일2017-09-11 16:34 조회1,018회 댓글0건

본문

 

2093095301_AZcbnhvi_650b1ffd3526316117784fb7c1d6a13a.png

아두이노 레오나르도 활용 - 6 USB-MIDI 구현 하기

by BigBoss posted Oct 08, 2013 Replies 6

1. 아두이노 레오나르도 특징

2. 아두이노 보드의 차이점 정리 

3. USB-Keyboard, Mouse 에뮬레이션 하기 

4. 레오나르도 부트로더를 이용하여 Atmel Studio에서 만든 펌웨어를 올리기 

5. LUFA를 이용한 USB-Joystick 에뮬레이션 하기 

6. USB-MIDI 사용하기 

7. C#과 통신하여 LED 깜빡이고 스위치값 읽어오기 

8. RN42를 이용하여 무선 블루투스아이패드와 안드로이드 게임 콘트롤러 만들기 

 

midi-logo  

 

미디(MIDI)라고 하면 일반인들은 생소한 단어일 것 입니다. 

미디는 전자악기간에 연주정보를 서로 전달하기 위해 1982년에 유수한 악기회사들이 모여 만든 일종의 약속(프로토콜) 입니다.

이를 테면 A라는 악기에서 ‘도레미’ 라고 연주했을 때, B라는 악기에서도 동일한 연주가 되도록 하는 일종의 메시지의 집합 입니다. 자세한 것은 아래의 링크를 보시면 전체적인 미디의 개념을 아실 수 있습니다. 

http://www.instructables.com/id/What-is-MIDI/ 

 

아두이노와 미디

 


 

 

많은 메이커들이 아두이노를 가지고 다양한 프로젝트를 하고 있습니다. 몇가지를 소개해 본다면.. 

 

아두이노 미디 키보드

 

아두이노 DJ 콘트롤러 

 

 

아두이노 미디 콘트롤러 


 

아두이노 신디 

 

아두이노 실로폰 

 

 

몇 가지를 소개해 드렸는데요.. 그 밖에도 해 아릴 수 없을 정도로 많은 미디 프로젝트들이 아두이노를 가지고 시도하고 있습니다. 

 

아두이노 미디 프로젝트의 문제점 USB-MIDI가 안된다?

 


 

 

그런데 막상 아두이노로 미디 프로젝트를 수행하다 보면 한가지 걸리는 것이 있습니다. 바로 컴퓨터와 미디통신인데, 생각 같아서는 아두이노의 USB 단자로 간단하게 미디신호를 컴퓨터와 주고 받을 수 있을 것 같은데, 실제로는 그렇게 간단하지가 않습니다. 

 

컴퓨터와 아두이노 간에 미디로 연결하려면 반드시 별도의 미디 인터페이스가 있어야 하고, 아울러 미디신호를 주고 받을 수 있는 회로를 구성 해야 하는 번거로움이 있다는 것 입니다. 

 

 

USBMIDIIF

ArduinoMIDI 

 

그래서 별도의 인터페이스와 회로 없이 USB로 바로 미디신호를 주고 받기 위해 몇몇 대안을 내놓게 됩니다. 

그래서 나온 것 들이 HIDUINO (http://dimitridiakopoulos.com/hiduino), Moco for LUFA (http://morecatlab.akiba.coocan.jp/morecat_lab/MocoLUFA.html이런 프로젝트 인데요.. 

 

이것들은 아두이노 UNO의 다운로드 전용 마이컴인 Atmega8U2의 펌웨어를 변경해 아두이노 UNO에서 USB-MIDI를 구현해 주는 프로젝트 입니다. 

 

그러나 문제는 USB-MIDI 펌웨어를 올리려고 하면 펌웨어를 업로드 하기 위한 별도의 ISP장비가 있어야 하고, USB-MIDI 펌웨어가 올라가있는 동안은 UNO에 아두이노 스케치를 업로드 할 수 없다는 치명적인 단점이 있습니다. 

즉 스케치를 업로드 할 때는 ISP로 USB-SERIAL 펌웨어를 Atmega8U2 올려야 하고, 스케치 업로드가 완료되면 ISP로 USB-MIDI 펌웨어를 Atmega8U2에 올려 미디를 구현하는 방식 인데.. 

 

이거 원.. 설명하기도 복잡하고 사용하기도 복잡 합니다. 

 

또 한가지 방법은 롤랜드에서 제공하는 미디 시리얼 드라이버를 사용하는 방법이 있는데, (http://www.roland.com/support/article/?q=downloads&p=SC-8820&id=1812543시리얼 포트로 들어오는 신호를 디바이스 드라이버 차원에서 미디신호로 변경하여 미디 프로그램에서 인식해 주는 고마운 프로그램 입니다.

 

그러나  맥에서는 사용할 수 없고, 더군다나 윈도우7 버전에서는 설치도 쉽지 않고, 더 이상 업데이트 하고 있지 않아서 윈도우 7 이상의 환경에서는 사용하는게 거의 불가능 합니다.

 

그리고 MIDI-YOKE 유틸리티와 Serial to MIDI(https://code.google.com/p/s2midi/) 유틸리티를 이용한 구현 방법도 있는데..

 

아무튼 이 방법 저 방법 편법들이 난무하고 있는 상황이다 보니, 많은 메이커들이 미디 프로젝트를 수행 할 때는 아두이노를 USB-MIDI로 연결하는 것은 아주 어렵거나 거의 불가능 하다고 생각 합니다. 

 

아두이노 레오나르도가 유일한 대안?

 


 

 

결국 아두이노 UNO에서 USB-MIDI를 구현하려면 현실적으로 많은 어려움이 있다 보니 많은 메이커들이 네이티브 USB를 가지고 있는 레오나르도에 관심을 가지게 됩니다. 

 

사실 아두이노 레오나르도에서 아두이노 팀에서 USB-MIDI 기능을 키보드나 마우스처럼 표준화 되어 기본 제공 할 꺼라 예상했었습니다. 

충분히 실현 가능한 이야기 이고, 시간 문제라 생각했는데.. 의외로 레오나르도를 발표한지 2년이 되어 가는 시점인데도 USB-MIDI 기능은 기본 제공해 주지를 않네요.. 

 

아무튼 많은 사람들이 방법을 찾고 있었지만 몇 가지 대안만 나올 뿐 시원하게 해결한 사람은 그 동안 없었습니다. 

 

그러던 중 올해 남아프리카 공화국의 프로그래머 Ralf Kistner라는 사람이 재미 있는 프로젝트를 발표 하게 됩니다. 

그것은 바로 아두이노 코어 라이브러리를 수정하여 레오나르도를 아두이노 개발환경 상에서 USB-MIDI가 구현 되는 프로젝트 입니다. 

 

https://github.com/rkistner/arcore 

 

이 방식은 말 그대 아두이노의 코어 라이브러리를 수정/추가하여 기존의 USB-SERIAL, KEYBOARD, MOUSE를 더해 MIDI 기능까지 확장해주는 근본적인 해결점을 제시해 주었다는 점에서 높은 평가를 받을 만 합니다. 

 

아두이노를 확장하여 USB-MIDI를 구현

 


 

 

Arcore를 테스트해 보니 많은 가능성을 보게 되었습니다. 

기존 아두이노 레오나르도 기능 외에 USB-MIDI 장치가 생성되는 것이 확인이 되고 MAC에서도 역시 인식하는 것을 확인 했습니다.

그래서 좀더 시간을 가지고 미디프로그램과 좀 더 자세히 테스트를 해 보았습니다.

 

테스트 해보니 몇 가지 문제점이 발견 되었습니다. 

우선 arcore에서 제시 한대로 그대로 사용시 아두이노 1.05 환경 에서는 컴파일은 되나 업로드 동작이 되질 않습니다. 

그래서 몇 가지 파일을 수정 해야만 했습니다. 

 

그리고 디바이스 디스크립터의 버그로 장치 관리자에서 USB MIDI 장치가 중복해서 잡히고 게다가 장치가 노란색으로 떠서 뭔가 불안한 모습을 보이는 문제가 있습니다. 

 

마지막으로 아두이노 스케치에서 USB-미디 입력에 대한 이벤트 처리가 없으면 미디 프로그램에서 미디 메세지를 출력시 미디 프로그램이 죽는 문제가 있더군요. 

 

결국 문제가 된 부분을 면밀히 분석하여, 수정을 하고, 아울러 미디 입출력 기능을 보강하여 새로운 코어 라이브러리를 제작 하였습니다. 

 

USB-MIDI가 동작되는 LeoMIDI Core의 설치

 


 

 

Ralf Kistner가 공개한 arcore를 기반으로 하여, 아두이노 1.05에서 USB-MIDI와 추가적인 라이브러리를 사용 할 수 있게 수정한 버전 입니다.  

 

 

LeoMIDICore.zip <- 클릭 하세요 

 

기존의 코어 라이브러리를 변경하지 않고, 추가적으로 설치 하는 방식으로 구현 되어 있습니다. 

설치는 약 3단계 방식으로 이루어 집니다. 어렵지 않습니다.

 

우선 아래 LeoMIDICore를  다운로드 하여 적당한 곳에 압축을 풀어 주시기 바랍니다.

그러면 아래와 같은 파일 목록이 나옵니다.

 

LeoMIDIcore 폴더: 아두이노 미디가 확장된 코어 라이브러리 입니다.

이 폴더를 아두이노가 설치된 폴더로 이동해 서브 폴더인 \hardware\arduino\cores 로 이동 또는 복사 합니다. 

아두이노가 설치된 곳이 C:\Program Files\Arduino라면 복사할 경로는 아래와 같습니다.

C:\Program Files\Arduino\hardware\arduino\cores\ 복사하면 아래와 같게 되겠죠..

C:\Program Files\Arduino\hardware\arduino\cores\LeoMIDIcore

 

boards.txt 파일 : 아두이노에서 새로운 코어 라이브러리를 인식하기 위해 필요한 파일 입니다.

Arduino 설치된 폴더 아래 hardware\arduino 폴더로 이동해 보시면 boards.txt 파일이 보일 것 입니다. 이 파일을 백업해 놓으시고 새로운 boards.txt로 덮어쓰기 하시기 바랍니다.

아두이노 IDE에서 새로운 코어 라이브러리를 사용하기 위한 작업 입니다.

 

마지막으로 예제 스케치 파일을 복사 해 봅시다.

 

LeoMIDIexam 폴더 : USB-MIDI 기능을 활용한 예제 입니다.

Arduino 설치된 폴더 하위에 examples 폴더로 이동시켜 주시기 바랍니다.

 

자 그러면 올바르게 설치 되었는지 확인해 보도록 하겠습니다.

 

LeoMIDI Core 설치확인

 


 

그러면 아두이노 IDE를 실행시켜 봅시다.

확장된 코어 라이브러리가 올바르게 설치 되었는지를 확인 하려면 몇가지를 확인 해야 합니다.

 

첫번째로 아두이노 도구 메뉴의 보드 항목에 Arduino Leonardo (USB-MIDI) 가 보이는지 확인 합니다.

 

ArduMIDI-1  

만약 보이지 않는다면 boards.txt 파일이 제대로 복사가 안된 것 입니다.

 

두번째로 아두이노 파일메뉴에서 예제 항목에 LeoMIDIexam 이 보이는지 확인 합니다.

 

ArduMIDI-2  

만약 보이지 않는다면 예제 파일인 LeoMIDI 폴더가 제대로 복사가 안된 것 입니다.

 

예제 파일을 불러서 컴파일을 해 보겠습니다.

 

우선 아두이노 도구메뉴에서 보드항목중 Arduino Leonardo (USB-MIDI)로 보드설정을 합니다.

그리고 아두이노의 파일메뉴->예제-> LeoMIDIexam->MidiEcho 를 불러와 봅시다.

 

불러온 후 아두이노의 스케치메뉴에서 확인/컴파일을 선택해 컴파일이 되는지 확인해 봅시다.

 

만약 컴파일이 제대로 되지 않는다면 보드 설정을 잘 못했거나, 코어 라이브러리의 복사가 제대로 이루어 지지 않은 것 이므로, 다시 한번 확인을 해 봅니다.

 

그러면 LeiMIDI Core에 대해 좀더 깊이 알아보도록 하겠습니다.

 

USB-MIDI 이벤트 패킷 설명


 

컴퓨터와 USB로 미디 메세지를 주고 받기 위해서 먼저 USB-MIDI 메시지 구조를 알 필요가 있습니다.

USB-MIDI에 대한 자료는 아래 링크에 소상히 설명 되어 있습니다.

 

http://www.usb.org/developers/devclass_docs/midi10.pdf

 

위의 문서를 다 읽을 필요는 없고요.. 위의 문서를 요약해 간단하게 한번 알아 보도록 해 보겠습니다.

 

32bit USB MIDI Event Packet


 

컴퓨터와 USB-MIDI 통신은 기본적으로 32비트 구조의 패킷으로 주고 받게 설계 되어 있습니다. 그 구조는 다음과 같습니다.

 

USB-MIDIPacket 

 

32비트, 즉 4바이트 형태로 데이터를 만들어 컴퓨터에 전달해 주거나 컴퓨터로부터 미디 메시지 받을 수 있습니다. 

케이블 번호는 미디 포트가 여러 포트로 구성 되어 있을 때, 어떤 포트로 메시지를 주고 받을 건지 결정 하는 값 입니다.

제공되는 라이브러리에서는 하나의 포트만 사용 하므로 0값으로 고정 입니다.

 

코드 인덱스 번호는 전송하거나 전송 받을 미디 메시지의 타입을 나타내는 값 입니다. 상세한 값은 다음과 같습니다.

 

MIDICodeIndex 

 

그리고 MIDI_0 ~ MIDI_2는 코드 인덱스의 데이터 값 입니다. 코드 인덱스의 값에 따라, 1바이트만 사용하는 경우도 있고, 2~3바이트를 모두 사용하는 경우도 있습니다.

 

만약 컴퓨터에 노트 온 메시지를 보낸다면 아래와 같은 구조로 보내야 합니다.

 

 코드 인덱스

 0x09

 노트온 메시지의 코드 인덱스 번호 입니다. 

 첫번째 바이트

 0x9n

 n은 채널 번호 입니다. 0x00~0x0F (1~16 채널)

 두번째 바이트

 0xkk

 kk는 노트 번호 입니다. 0x00~0x7f (0~127번)

 세번째 바이트

 0xvv

 vv는 노트의 세기(벨로시티) 입니다. 0x00~0x7f (0~12)

 

이렇게 4바이트 구조로 USB-MIDI 이벤트 패킷이 구성되어 있습니다.

 

LeoMIDI Core 라이브러리 설명

 


 

본격적으로 라이브러리를 사용법을 설명 하도록 하겠습니다.

레오 미디 라이브러리는 기본적으로 MIDIEvent 구조체를 인자로 보내거나 받도록 설계 되어 있습니다.  따라서 먼저 이 구조체의 구조를 파악 해야 합니다.

 

MIDIEvent 구조체

MIDIEvent 구조체는 아래와 같이 정의 되어 있습니다.

MIDIEvent
1
2
3
4
5
6
typedef struct {
    uint8_t type;
    uint8_t m1;

댓글 0

조회수 1,018

등록된 댓글이 없습니다.

아두이노HOME > 아두이노 > 전체 목록

게시물 검색

2019년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
2018년 1월 2월 3월 4월 5월 6월 7월 8월 9월 10월 11월 12월
Privacy Policy
MCU BASIC ⓒ 2017
모바일버전으로보기