Making MIDI Controller #5

구종회 (JongHoe Koo)
Making MIDI Controller
5 min readJun 18, 2015

드디어 미디 신호를 쏜다!!

이번에는 MIDI 단자를 연결하고 실제 MIDI 데이터를 출력하는 단계입니다. 미디 커넥터는 사진에서 보는 것 처럼 연결합니다. 나중에 나올 회로도에 표시된 미디 커넥터도 사진 처럼 뒷면, 납땜하는 쪽을 표시한 그림입니다.

드디어 미디 신호를 전송하는 순서에 왔습니다. 영상에서 보는 것 처럼 QLab을 동작 시키는 단계가 된 것입니다.

QLab과 MIDI Controller를 연결하는 방법은 영상에 소개되어 있습니다. 여기서 만든 미디 컨트롤러가 아니어도, 일반적으로 구할 수 있는 미디 키보드도 영상에서 소개하는 방법 처럼 연결해 쓸 수 있습니다. 아두이노를 가지고 만들기가 부담스러운 분들은 일반 미디 키보드를 가지고 시도해 보시기 바랍니다.

이제부터는 아두이노에서 하는 작업들입니다.

브레드 보드 세팅을 좀 바꿨습니다. MIDI 출력을 12번 핀에서 1번 핀으로 바꾼 것입니다. 미디 단자와 연결하는 케이블 위치만 바뀐 것입니다.

아두이노의 1번 핀은 아두이노 자체의 통신출력 포트입니다. 아두이노의 통신 포트를 사용하기 때문에 간편하게 시리얼 통신 프로그램을 만들 수 있습니다. 처음부터 이 방법을 소개하지 않은 것은 최종 결과물에서는 이것을 사용하지 않기 때문입니다.

이렇게 간단하게 미디 컨트롤러를 만들 수 있다! 하는 차원이지만, 이 정도 품질로도 실사용에 무리는 없습니다. ^^

#4 까지 진행되었던 소스코드에서 얼마나 추가 되었는지 이제 소스코드를 볼까요.

별로 추가된 것이 없습니다. 대단한 코드가 추가될 줄 알았는데 별로 그렇지도 않지요? ^^;

아두이노의 시리얼 통신 기능을 이용하기 때문에 간단하게 프로그래밍을 할 수 있습니다. 우선 17번 줄에 있는 Serial.begin(31250); 이 명령어를 한번 써 주면 아두이노에서 시리얼 통신이 시작됩니다. 단 한 번만 실행하기 때문에 Setup() 함수 안에 넣습니다.

실제로 미디 데이터가 출력되는 곳은 46번 줄에 있는 Serial.write(midi_data); 입니다.

그리고 추가로 수정된 곳은 9번 줄에 있는 delayVal 입니다. 1000을 쓰다가 200으로 줄였지요. GO 명령을 1초에 1번만 줄 수는 없으니까요. 200으로 하면 0.2 초마다 1번씩 GO 명령을 날릴 수 있습니다. 그리고 0.2초 정도면 투터치로 GO가 중복으로 잘못 들어가는 것을 막을 수 있는 적당한 시간인듯 합니다. 더 빠르게 하고 싶은 분들은 숫자를 수정해 자신에게 맞도록 합니다.

아, 그리고 프로그램 코드에 잘 못된 부분이 있습니다.

39번 줄에 있는 sendMIDI(0x90); 부분입니다. 지난번 까지는 sendMIDI(0x91); 로 표시되어 있었습니다. 0x91로 했더니 채널 2로 전송이 되더군요. 그렇지요. 미디 채널 1~16이 미디 데이터로 표시될 때는 0~15로 기록되어 전송되니 채널 1은 숫자 0으로 전송해야 맞게 나타납니다. 제가 미처 확인하지 못했던 부분이었습니다.

만드는 동안 미디 출력이 제대로 나오고 있는지 확인해야 하는 경우가 있습니다. 저는 MIDI Monitor라는 프로그램을 사용하고 있습니다.

MIDI Monitor는 오픈 소스 프로그램으로, 미디 신호를 관찰하는데 많은 도움이 되는 프로그램입니다.

여기까지 정도 만들어도 QLab이나 조명콘솔용 GO 신호 트리거 정도 만들 수 있습니다. 무대장치에 넣어서 효과음을 재생하는데 쓸 수도 있겠구요. MIDI Note 신호가 Talkback 용 스위치에도 사용된다고 하니, 하나 만들어 놓으면 여기저기 활용할 곳이 많을 것 같습니다.

앞으로 진행될 내용들은 다음 리스트에 나와 있는 것들입니다. 다음 리스트에 있는 내용들은 차차, 요구가 있을 때 하도록 하지요. ^^

제작하신 분들의 피드백을 기대하겠습니다.

보완하거나 추가로 생각해 보아야 할 문제들

  • 버튼의 중복입력을 처리하기 위한 보호장치 — 스위치가 민감하게 반응하여 투터치가 되지 않도록 하는 부분이 필요합니다.
  • 대기시간 동안 소비전력을 최소화 하는 방법 — 인터럽트와 CPU 슬립 기능을 사용하는 방법
  • Note On 이외에 Control Change는 어떻게 작성하는가
  • QLab이나 조명 콘솔을 컨트롤 하기 좋은 MIDI Show Control 신호(특히 GO 명령)는 어떻게 작성하는가
  • 2개의 컴퓨터를 동기화 하기 위해 똑같은 MIDI 신호를 2개 보내려고 할 때는 어떻게 해야 하는가 (참고로 여기 사용된 UNO 보드는 통신포트가 1개 입니다)

* 만들다가 막히는 부분 있으면 언제든 메일 보내주세요~

--

--