User Tools

Site Tools


nano_ardule_midi_controller:ardule_usb_midi_host_keyboard_numeric_control_design

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:
    1. CC#0 (MSB)
    2. CC#32 (LSB)
    3. 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