Unopad: 아두이노 우노로 만드는 에이블턴 라이브용 MIDI 컨트롤러
부품 및 소모품
| 아두이노 우노 | 1개 |
| APEM A01 시리즈 조명 푸시버튼 스위치 | 9개 |
| 점퍼 와이어 (일반) | 1세트 |
필요한 도구 및 기계
앱 및 온라인 서비스
- loopMIDI
- Hairless MIDI-Serial Bridge
- 에이블턴 라이브 10 체험판
프로젝트 소개
요약
대부분의 MIDI 컨트롤러 튜토리얼은 아두이노 작동 원리만 설명할 뿐, DAW에서 실제로 사용하는 방법은 다루지 않습니다. 이 프로젝트는 컨트롤러 제작과 사용에 필요한 모든 것을 한 곳에 모아 초보자가 더 잘 이해할 수 있도록 돕고자 합니다.
오랫동안 MIDI 컨트롤러를 만들고 싶었고, 마침내 완성해 공유합니다. 아두이노 우노는 USB로 MIDI 메시지를 직접 보낼 수 없어 특별한 프로그램이 필요합니다(후술).
다음 섹션에서는 전기 회로, 아두이노 코드, 컴퓨터 및 DAW(에이블턴) 연결 방법을 설명합니다.
회로
매우 간단한 회로입니다. 9개 푸시버튼을 매트릭스가 아닌 개별 핀으로 연결했습니다. 다중 버튼 동시 입력을 원했고, 디지털 핀이 여유 있어(매트릭스면 6개, 개별 연결이면 9개) 이렇게 했습니다.
버튼 3 → D2 버튼 2 → D3 버튼 1 → D4
버튼 6 → D5 버튼 5 → D6 버튼 4 → D7
버튼 9 → D8 버튼 8 → D9 버튼 7 → D10
MIDI 매핑
MIDI 노트 36~45를 정의하고, NOTE_ON과 NOTE_OFF를 사용합니다.
#define NOTE_ONE 36
#define NOTE_TWO 37
// 모든 노트 정의...
#define NOTE_ON_CMD 0x90
#define NOTE_OFF_CMD 0x80
#define MAX_MIDI_VELOCITY 127
USB를 통한 MIDI
아두이노 우노가 단독으로 DAW에 MIDI 노트를 보낼 수 없어, LoopMIDI와 Hairless MIDI-Serial Bridge 두 프로그램을 사용합니다.
LoopMIDI로 가상 MIDI 포트를 생성하고, Hairless MIDI에서 아두이노 시리얼 포트와 이 가상 포트를 연결합니다.
코드 설명
Button 클래스를 만들어 사용합니다:
int NUMBER_BUTTONS = 9;
Button Button1(4, NOTE_ONE);
Button Button2(3, NOTE_TWO);
// ... Button9까지
Button *Buttons[] {&Button1,&Button2,...,&Button9};
저항 없이 버튼을 디지털 핀과 그라운드에만 연결하므로 INPUT_PULLUP을 사용합니다. 버튼을 누르면 LOW(0)가 나옵니다(일반적인 HIGH가 아님). 초기 상태는 1입니다.
모든 NOTE_ON에는 대응하는 NOTE_OFF가 필요합니다. 버튼 누름 시 NOTE_ON, 떼면 NOTE_OFF를 보냅니다. 현재 상태와 이전 상태가 다를 때만 MIDI 메시지를 전송합니다.
void midiNoteOn(byte note, byte midiVelocity) {
Serial.write(NOTE_ON_CMD);
Serial.write(note);
Serial.write(midiVelocity);
}
void midiNoteOff(byte note, byte midiVelocity) {
Serial.write(NOTE_OFF_CMD);
Serial.write(note);
Serial.write(midiVelocity);
}
updateButtons() 함수에서 모든 버튼 상태를 확인하고 MIDI 메시지를 보냅니다. loop()에서 이 함수를 호출합니다.
DAW(에이블턴 라이브)에서 컨트롤러 사용하기
DAW 초보자로서 아두이노 컨트롤러 연결 방법을 몰랐습니다. Korg NanoKey는 자동 인식됐지만, 아두이노는 HID 장치가 아니어서 PC가 여전히 아두이노로 인식합니다. 에이블턴 라이브 10에서 연결하는 방법을 설명합니다.
에이블턴과 연결
- loopMIDI를 열고 새 가상 MIDI 포트 생성
- Hairless MIDI-Serial을 열고 시리얼 포트(아두이노 우노), MIDI In/Out(앞서 만든 가상 포트) 할당. 보드레이트를 아두이노 스케치와 동일하게 설정(File > Preferences)
- 버튼을 눌러 Hairless MIDI에서 들어오는 MIDI 메시지 확인
- Hairless MIDI를 닫지 말고 유지
- 에이블턴 라이브 실행 → Options > Preferences > Link MIDI 탭 설정
- 우측 상단 MIDI 표시등이 버튼 누를 때 깜빡이면 연결 성공
드럼 랙 또는 키보드로 사용
MIDI 트랙 선택 → Monitor를 Auto에서 In으로 변경 → MIDI To에서 스피커 출력 선택. 드럼 랙도 동일하게 설정.
완성된 프로젝트
오래된 스피커 박스와 집에서 찾은 플라스틱을 사용해 케이스를 만들었습니다. 버튼 구멍과 나중에 추가할 LED 구멍을 뚫었습니다. 같은 케이스의 다른 스피커로 노브와 조이스틱이 있는 또 다른 MIDI 컨트롤러를 만들 예정입니다.
할 일
코드
- MidiDrumPad.ino (아두이노)
- Buttons.cpp
- Buttons.h
깃허브에서 다운로드: https://github.com/sadreactonly/MidiDrumpad
회로도