지난 1월에 만들었던 USB MIDI host to DIN MIDI converter(일명 'UNO-2')의 기능을 확장해 나가기 시작하였다. 화려한(?) 2004 LCD 모듈이 달려 있지만 반응이 즉각적이지 않기 때문이다. 아두이노 우노의 A0 핀에 LED를 달고, 민웰 SMPS(5V 10A급)로부터 5V를 공급받을 수 있는 USB-C 커넥터를 달아 주었다. 처음에는 A3 핀에 LED를 달았으나 무슨 이유인지 HIGH를 출력하지 못하였다. 바로 아래에 스태킹한 USB MIDI host shield에서 이 핀을 사용하는 것도 아닌데 왜 그럴까? 아두이노 우노에서 직접 선을 딴 것이 아니라 stacking pin header를 거치는 바람에 접촉에 문제가 생겼는지도 모른다. 하지만 같은 계층의 보드에서 따낸 A4/A5에 연결된 I2C 2004 LCD 모듈도 정상 작동하고, A0에서도 HIGH 전압이 잘 나오며, 전원 공급도 원활하다. 결국 A3 사용은 포기하고 A0에 LED를 연결하기로 하였다.
이 장치를 만든 처음의 목적은 USB MIDI keyboard controller의 출력 신호를 DIN MIDI 단자만 있는 구형 사운드 모듈에 전달하기 위함이었다. 이미 기본 기능 펌웨어는 개발을 하였기 때문에 어제의 작업에서는 약간의 납땜을 한 뒤 LED가 MIDI 신호 입력에 따라서 깜빡거리게 만든 것이 전부이다.
다음으로는 구형 키보드의 DIN MIDI 출력을 받아서 아두이노 우노의 USB-serial interface로 출력하게 만들고자 한다. 사실 케이블 형태의 MIDI USB interface로 충분한 일이지만, 기왕 만든 DIY 기기에 새로운 기능을 부여하고 싶었다.
아두이노 우노는 RX(D0)와 TX(D1) 핀을 USB-serial 통신에 사용한다. 그런데 이 두 개의 핀은 MIDI shied에서도 MIDI 신호 입출력에 사용한다. 만약 RX 핀이 MIDI IN에 영구적으로 연결되어 있다면, 펌웨어 업로드를 할 수가 없다. 따라서 MIDI shield에는 이를 끊어주는 슬라이드 스위치가 존재한다. 이를 정확히 알고 사용해야 한다.
구상하고 있는 Fluid Ardule 곁가지 프로젝트의 모습은 다음과 같다. 이름은 확장된 기능을 포용할 수 있는 새로운 MIDI Bridge 또는 MIDI Router 정도가 될 것이다. 그저 간단하게 UNO-2라고 불러도 좋다.
DIN MIDI IN으로 들어오는 신호를 처리하는 기능은 아직 구현하기 전이다. TX 핀이 하나 뿐이므로 출력은 항상 MIDI OUT과 USB-serial interface로 동시에 나간다. 굳이 이벤트를 필터링하거 재매핑하는 등 아두이노를 힘들게 할 작업을 덧붙일 생각은 없다.
그러나 라즈베리파이가 시리얼 스트림 형태로 들어오는 MIDI 데이터를 처리하려면 약간의 추가 작업을 해야 한다. 이는 ALSA 입장에서는 MIDI 장치가 전혀 아니다. 따라서 다음과 같은 방법 중 하나를 택해야 한다.
- Python을 이용한 브리지(pyserial로 읽고, mido + python-rtmidi로 ALSA에 전달)
- C 기반 브리지(구현 난이도 높음)
아두이노 우노가 아니라 Leonardo/Micro/Pro Micro, 또는 Teensy를 사용한다면 아두이노 자체가 USB MIDi device가 되므로 이런 일을 할 필요가 없다.
USB host shield는 아두이노 우노를 USB device로 만들어 주지는 못한다. 우노는 USB device로 동작할 수는 있지만, 기본적으로는 USB-serial(CDC) 인터페이스만 제공할 뿐 USB MIDI class를 지원하지 않는다.
전통 기술(MIDI)을 이 시대에도 즐기기 위해 새로운 시도를 아끼지 않고 있다. 이 과정에서 ChatGPT가 정말 크게 기여하고 있음을 오늘도 실감한다.
2026년 4월 17일 업데이트
DIN MIDI IN으로 연결한 건반의 연주 신호를 그대로 출력하도록 펌웨어를 수정하였다. 해당 신호는 Arduino UNO의 USB-serial을 통해 라즈베리파이로 전달되며, 이를 ALSA sequencer 기반의 MIDI 스트림으로 변환하여 가상 MIDI 포트로 출력하는 브리지 프로그램을 구현하였다. 이후 aconnect 명령을 통해 FluidSynth와 연결하여 사용할 수 있다.
파이썬과 C 두 가지를 만들었는데, C로 짜여진 것이 매우 안정적으로 잘 실행되었다. UNO-2의 리셋이나 케이블 재연결 시에도 연결 상태가 유지됨을 확인하였다. 결과물은 GitHub에 새로운 리포지토리(uno-midi-bridge)로 등록하였다. Fluid Ardule도 아주 간단한 소개의 글과 함께 리포지토리를 새로 만들었다.
댓글 없음:
댓글 쓰기