nano_ardule_midi_controller:ardule_usb_midi_host_keyboard_numeric_control_design
Table of Contents
Ardule USB MIDI Host – 키보드 기반 Numeric Control 설계 문서
Last updated: 2026-02-05
본 문서는 Ardule USB MIDI Host에서 MIDI 키보드와 노브(CC 입력)를 결합하여
- CC 번호 / CC 값
- Bank Select (MSB / LSB)
- Program Change (PC) 를 숫자 입력 방식으로 제어하는 설계 아이디어를 정리한 것이다.
오늘 대화에서 논의된 내용을 기준으로 한 설계 스냅샷이며, 구현 언어는 C++ (Arduino + USB Host Shield)를 전제로 한다.
1. 설계 목표
- MIDI 키보드의 건반 입력을 숫자 입력 장치로 사용한다
- 숫자로 입력한 값을 이용해 다음을 제어한다
- 임의의 CC 번호와 Value
- Bank Select MSB / LSB
- Program Change
- AKAI MPK Mini처럼 노브가 고정 CC#로만 나가는 컨트롤러도 유연하게 활용한다
- 모든 변환/재배치는 Ardule USB MIDI Host 내부에서만 수행한다
2. 기본 개념 정리
2.1 MIDI 현실
- 건반: Note On / Note Off
- 노브: Control Change (CC#, value)
- Bank Select:
- CC#0 (MSB)
- CC#32 (LSB)
- Program Change
>노브 번호(1~8)는 MIDI로 나오지 않으며, 항상 CC# + value 형태로만 수신된다.
3. 전체 구조 개요
[ MIDI Keyboard / MPK Mini ]
├─ Keys (Note) ──▶ 숫자 입력 / 명령 입력
└─ Knob (CC#XX) ─▶ Focus Knob
↓
[ Ardule USB MIDI Host ]
- Numeric Mode
- Target 선택
- 값 누적 / 수정
↓
DIN MIDI OUT
4. Numeric Mode 개념
4.1 모드 정의
- Normal Mode: 키보드/노브 입력을 그대로 패스스루
- Numeric Mode: 키보드와 특정 노브를 UI 입력 장치로 사용
Numeric Mode에서는 원본 Note / CC 메시지를 외부로 보내지 않는다(먹기).
5. Target(대상) 개념
Numeric Mode에서는 숫자 입력의 대상(Target)을 명확히 구분한다.
5.1 Target 목록
- CC_NUM : 제어할 CC 번호
- CC_VAL : CC 값
- MSB : Bank Select MSB (CC#0)
- LSB : Bank Select LSB (CC#32)
- PC : Program Change
- (옵션) CH : MIDI Channel
5.2 Target 전환
- TAB 키(특정 건반 또는 조합)로 Target을 순환
예:
CC_NUM → CC_VAL → MSB → LSB → PC → (반복)
6. 숫자 입력 구조
6.1 내부 버퍼
각 Target은 독립적인 입력 버퍼를 가진다.
int cc_num; int cc_val; int bank_msb; int bank_lsb; int program;
6.2 숫자 입력 규칙
- 건반을 0~9 숫자로 매핑
- 숫자는 현재 Target의 버퍼에만 누적
- 범위 초과 시:
- 입력 무시 또는 127로 클램프
7. Focus Knob 개념 (핵심)
7.1 문제 상황
- MPK Mini의 노브는 고정 CC#로만 송신됨
- 노브 자체의 CC# 변경은 어렵거나 불가능
7.2 해결 아이디어
특정 CC# 하나를 “Focus Knob”로 지정하여, 현재 Target의 값을 조절하는 다이얼로 사용한다
예:
- Focus Knob CC# = 21
7.3 동작 규칙
- Numeric Mode일 때만 활성
- 해당 CC# 입력은 외부로 패스스루하지 않음
if (msg.type == CC && msg.cc == FOCUS_KNOB_CC) { switch (current_target) { case CC_VAL: cc_val = msg.value; break; case MSB: bank_msb = msg.value; break; case LSB: bank_lsb = msg.value; break; case PC: program = msg.value; break; } swallow(); }
8. SEND / COMMIT 동작
8.1 CC 전송
Target이 CC 관련일 경우:
sendCC(channel, cc_num, cc_val);
8.2 Bank + Program 전송 (권장 순서)
sendCC(channel, 0, bank_msb); sendCC(channel, 32, bank_lsb); sendPC(channel, program);
안정성을 위해 MSB/LSB 변경 시에도 PC를 함께 재전송하는 방식을 권장
9. UI / LCD 표시 (권장)
포커스를 명확히 보여주는 것이 중요하다.
예:
>MSB:087 LSB:001 PC:040 MSB:087 >LSB:001 PC:040 MSB:087 LSB:001 >PC:040 >CC:074 VAL:100
10. 안전 장치 및 UX 보완
- Numeric Mode 진입/종료 키 분리
- 입력 타임아웃 (예: 5초 무입력 시 Normal 복귀)
- ENTER 시 입력 미완성 상태면 무시
- Focus Knob은 Numeric Mode에서만 활성
11. 설계 요약 (한 줄)
Ardule USB MIDI Host는 키보드를 숫자 패널로, 노브(CC#)를 동적 다이얼로 재해석하여 CC / Bank / Program Change를 통합 제어하는 Meta MIDI 컨트롤러가 된다.
이 문서는 오늘 대화 내용을 기준으로 한 설계 정리본이며, 이후 APS 설정 파일 연계 또는 EEPROM 기반 구현으로 확장 가능하다.
nano_ardule_midi_controller/ardule_usb_midi_host_keyboard_numeric_control_design.txt · Last modified: by hyjeong

