User Tools

Site Tools


nano_ardule_midi_controller:start

Nano Ardule MIDI Controller: 설계 요약 문서

  • 작성자: 정해영
  • 최초 작성일: 2025년 8월 5일
  • 최종 수정일:Haeyoung Jeong 2025/08/26 08:37

2025년 8월 28일 제작 상태

네임스페이스가 포함하는 하위 정보

목표

별도의 조절 장치를 갖고 있지 않은 GM sound module의 활용도를 높이기 위한 Arduino Nano 기반의 MIDI Controller(Nano Ardule)를 제작한다. Ardule은 Arduino + Module의 합성어이며, 프랑스어로 ‘어려운’(arduous)이라는 뜻도 갖고 있다. 2개 프로그램의 layer/split이 가능하며, 음색 설정을 user program/combi 형태로 microSD 카드에 저장하고 로드할 수 있다. 또한 카드에 저장된 type 0 MIDI 파일을 재생하는 기능도 갖고 있다. 이 프로젝트는 GM 명령어를 공부하고 아두이노의 활용법을 익히기 위한 목적도 있다.

시스템 구성

  • 주 제어부: Arduino Nano 호환 보드 (CH341 드라이버 필요)
  • 출력 대상: SAM9703 도터보드 장착 사운드 모듈 (GM 사운드 모듈이라면 제한 없음)
  • 저장장치: microSD 카드 (user program, combi, global settings, Type 0 MIDI 파일 저장)
  • 디스플레이: 1602 I2C LCD (백라이트 포함, 파일럿 LED 불필요)
  • 입력 장치:
    • MIDI IN (외부 키보드 컨트롤러에서 입력)
    • Rotary Encoder 1개 (푸시 버튼 내장)
    • 기타 푸시버튼 6개:
      • PART SELECT
      • SPLIT
      • LOAD (+)
      • SAVE (-)
      • PLAY/PAUSE
      • STOP/EXIT
  • 출력 장치:
    • MIDI Activity LED 1개
    • 활성화 파트 표시 LED 3개 (A, B, Drums)
    • MIDI OUT (TX → DIN connector)

기본 작동법

  • 키보드(CH1 출력) 또는 MIDI 인터페이스의 MIDI OUT → Ardule의 MIDI IN 연결
  • Ardule의 MIDI OUT → GM 사운드 모듈의 MIDI IN 연결
  • 전원 On 시 PART A LED 점등. 기본 악기는 Part A: GM #0(어쿠스틱 그랜드 피아노), Part B: 스트링 앙상블이고 Part A로만 MIDI IN 신호가 흘러나감
  • 로터리 인코더를 돌려서 볼륨 조절
  • 인코더 버튼을 누르면 'Program Change' 진입. 인코더를 돌려서 원하는 프로그램을 선택 후 STOP/EXIT 버튼을 눌러 복귀.
    • 변경값은 회전 멈춘 후 0.2초 뒤 전송됨 (LCD에 전송 완료 표시)
    • Program Select 상태에서 PART SELECT 버튼을 울러 A → B → CH10 → A로 순환 가능
  • LOAD 버튼 → 저장된 프로그램 로드. 인코더로 선택, STOP/EXIT으로 복귀
  • PART A 또는 B만 선택된 상태에서 LOAD → UsrPrg## 목록에서만 선택 가능
  • (Single mode) PART SELECT 버튼을 눌러 순환: A → B → D → A… (A+B 시 LED 동시 점등)
    • A = CH 1, B = CH 2, D(Drums) = CH 10
  • (Multi mode) Split 버튼을 누르면 순환: A+B(layering) → A/B (splitting) → A+B…
  • PLAY/PAUSE + STOP/EXIT 동시 누름 → Transpose 설정 진입

프로그램 편집 및 저장

  • PART A, B, DRUMS 중 하나만 선택된 상태에서 편집 가능
  • 인코더 버튼을 짧게 누르면 편집 모드로 들어감. 반복하여 누르면 다음 파라미터 순환(볼드체는 우선적으로 구현할 것):
    • Program Change
    • Bank Select LSB (CC#32)
    • Reverb (CC#91)
    • Chorus (CC#93)
    • Pan (CC#10)
    • Cutoff Frequency or brightness (CC#74)
    • Resonance (CC#71)
    • Modulation (CC#1)
    • Attack (CC#73) / Release (CC#72)
  • 인코더 회전으로 값 변경, STOP/EXIT으로 복귀
  • 볼륨은 편집 모드에서는 조정 대상 아님, 그러나 저장 시 함께 기록됨
  • 편집 모드에서는 인코더, LOAD(+), SAVE(-), STOP/EXIT 버튼만 작동하는 것이 원칙이며, PART SELECT 버튼을 눌러서 A ↔ B ↔ Cha 10의 동일한 조정 레벨로 이동하는 것은 가능함
  • SAVE → UsrPrg00~99 저장. 인코더로 번호 선택, 덮어쓰기 시 확인 메시지 표시
  • PART A와 B 설정 후 A+B 활성화 → UsrCmb00~99로 저장 가능
  • PART SELECT 버튼 길게 누르기: 모든 노트를 끄고(기본적으로 그렇게 함) 현재 Ardule의 모든 설정을 MIDI OUT으로 일시에 보내고 PART A 선택 상태로 만듦

사운드 브라우저

GM/GS/XG 모듈의 음색(Program Change, Drum Kit 등)을 탐색하고 선택하기 위한 사용자 인터페이스임. 최초 계획 단계에서는 없었으나, ChatGPT와 대화하면서 이를 구체화하기 시작함. 설계 개념은 여기를 참조할 것.

  • 모드 진입: A 또는 B part가 선택된 상태에서 엔코더 버튼을 길게 누름
  • Family를 먼저 선택(예: Piano)
  • Program 선택(GM 기본 PC 번호 0~7)
  • Extension 선택(GS variation; Bank LSB 값)

이런 방식으로 하는 것이 단지 3 가지의 숫자를 설정하여 전송하는 것보다는 더 음악적이다. 실제로는 MSB=0, LSB=Variation 값, PC=Program 번호로 변환되어 전송된다.

GS Variation Table: Piano 계열의 사례

Program (PC) 기본 음색 (GM) Extension (Bank Select LSB) 설명
0 Acoustic Grand 0 (GM 기본) 표준 그랜드 피아노
1 (Bright) 밝은 톤의 그랜드
2 (Mellow) 부드럽고 따뜻한 톤
3 (Rock) 강한 어택, 밴드용
4 (Concert) 콘서트 홀용
16 (Honky-tonk) 삐걱이는 바 피아노 톤
1 Bright Piano 0 (GM 기본) 밝은 피아노
1 (Euro Piano) 팝/댄스용 톤
2 Electric Grand 0 전기 그랜드 피아노
1 (DX Grand) FM 스타일, DX 톤
3 Honky-tonk 0 GM 기본 Honky-tonk
1 (Old Upright) 낡은 업라이트 피아노
4 Electric Piano 1 0 GM Rhodes 스타일 EP
1 (Dyno EP) 다이나믹 톤 EP
2 (Phaser EP) 페이저 EP
5 Electric Piano 2 0 FM 스타일 EP
1 (DX EP Soft) 부드러운 FM EP
2 (DX EP Hard) 강한 어택 FM EP
6 Harpsichord 0 기본 하프시코드
1 (Coupled) 2단 음색 하프시코드
2 (w/ KeyOff) 키 릴리즈 음 추가
7 Clav 0 기본 클라비넷
1 (Phased) 페이저 클라비넷
2 (Wah) Wah 필터 클라비넷

SPLIT 설정

  • SPLIT 버튼 → 중앙 C 기준으로 A/B 영역 나눔. 중앙 C는 B(upper zone)의 시작 위치가 됨.
  • 인코더 조작 순서:
    • Split point 선택
    • Lower octave 조절
    • Upper octave 조절
    • Lower volume
    • Upper volume
  • SAVE 버튼 → 현재 SPLIT 상태를 UsrCmb로 저장
  • STOP/EXIT → 복귀

MIDI 파일 재생

  • PLAY/PAUSE 버튼 → microSD 카드 /SONGS/INDEX.TXT를 읽어서 Type 0 MIDI 파일의 이름을 하나씩 확인
  • 파일명: 8.3 (최대 100곡?)
  • 인코더로 곡 선택, PLAY/PAUSE로 재생 시작
  • 재생 중 PLAY/PAUSE → 일시 정지/재개, STOP → 처음으로 되돌림
  • 다음 곡 자동 재생 여부는 Global Settings에서 설정
  • 재생 중 키보드 입력은 CH14 (PART A), CH15 (PART B), CH10 (DRUMS)로 리매핑
  • STOP 후 다른 버튼 누르면 원래 상태로 복귀. 파트 설정은 복원됨

드럼 패턴 자동 분할·병합 및 8.3 리네이밍

Global Settings

  • 저장 위치: EEPROM
  • 진입 방법: SPLIT 버튼 누른 상태로 전원 On
  • 설정 방법:
    • 인코더 버튼 → 카테고리 전환
    • 인코더 회전 → 값 조절
  • 설정 항목 (기본값):
    1. Part A default instrument: [0]
    2. Part B default instrument: [48]
    3. Part A channel: [1] (1~9, 11~16)
    4. Part B channel: [2] (1~9, 11~16)
    5. Alternative Part A channel: [14]
    6. Alternative Part B channel: [15]
    7. 인코더 대기 시간(초): [0.2] (0.1~1.0)
    8. MIDI file 정지 시 리와인드: [Y]
    9. MIDI file 연속 재생: [N]
    10. 곡 간 정지 시간(초): [5] (0~10)
    11. Dump settings to microSD card: [N]
  • EXIT 버튼 → 초기 상태로 복귀

회로

아두이노 나노의 핀 연결

74HC595 시프트레지스터 IC를 쓰지 않는 조건으로 설계했기 때문에 아두이노 나노의 모든 핀이 다 쓰이고 있다.

Arduino 핀 기능 설명 또는 역할
D0 MIDI IN (RX)
D1 MIDI OUT (TX)
D2 Rotary Encoder CLK 회전 신호 A (인터럽트 가능)
D3 Rotary Encoder DT 회전 신호 B (인터럽트 가능)
D4 Encoder SW (버튼) 로터리 인코더 버튼 입력
D5 MULTI 버튼 MULTI-CHANNEL 모드 진입
D6 STOP/EXIT 버튼 편집 모드/재생 종료
D7 SAVE/+ 버튼 현재 설정 저장 또는 +1
D8 LOAD/- 버튼 저장된 프로그램 로드 또는 -1
D9 MIDI Activity LED MIDI IN/OUT 동작 표시용
D10 microSD CS SD 카드 선택 신호
D11 microSD MOSI SPI 데이터 출력
D12 microSD MISO SPI 데이터 입력
D13 microSD SCK SPI 클럭
A0 Part A LED Part A 활성 표시
A1 Part B LED Part B 활성 표시
A2 Drums LED Drums 모드 표시
A3 PLAY/PAUSE 버튼 MIDI 재생 제어
A4 LCD SDA I2C LCD 데이터
A5 LCD SCL I2C LCD 클럭
A6 PART SELECT 버튼 파트 선택(외부 풀업 저항 연결함)
  • D0/D1 (RX/TX): MIDI IN/OUT으로 사용할 수 있지만, USB 시리얼 통신과 공유되므로, 점퍼 헤더를 중간에 넣어서 업로드 때에는 연결을 끊고 업로드 후 다시 연결하는 방식으로 사용.
  • SPI (D10–D13): microSD 카드에 적합하게 잘 배정됨.
  • A4/A5: I²C LCD에 올바르게 사용됨.
  • A6: 입력 전용 아날로그 핀이므로 버튼용으로 적절. 반드시 풀업 저항을 연결해야 함. 본 프로젝트에서는 10K 사용.

매우 불친절한 실체배선도(2025년 8월 26일 버전). 당연히 오류가 있을 수 있음!

전원 연결 요령

  • USB로 전원을 공급하면 Nano의 5V 핀으로 그대로 전달되는데, PC의 USB 포트 허용치(일반적으로 500mA) 이내로 제한된다.
    • 이 상태에서 Vin에서 뜨는 약 4V의 전압은 역누설 때문에 생기는 '유령 전압'이라서 실제로 전류 공급이 불가하다.
  • 외부 어댑터의 5V를 쓰려면 아두이노 나노의 5V 핀에 넣으면 된다. 단, 안정적인 5V여야 하며, USB와 동시 연결하면 전원이 충돌하거나 역전류가 발생할 수 있으므로 주의해야 한다.
  • 외부 5V 어댑터로 작동하는 경우 어댑터 커넥터 옆의 분배 스타노드에 메인 벌크(470-1000uF 전해)를 두면 전압 안정에 도움이 된다. 각 모듈 근처에는 로컬을 보강하기 위하여 4.7-47uF 전해 + 세라믹 100nF를 연결한다.
  • Vin으로 공급되는 전원은 레귤레이터를 거쳐 5V로 전환된다. 따라서 5V보다는 높아야 하며, 온보드 레귤레이터의 전류 제한에 유의해야 한다.
  • 일반 LED는 저항 포함 시 5~10mA로도 충분히 밝다. 단순 ON/OFF만 한다면 아두이노 나노 출력핀에서 저항을 직렬로 넣은 뒤 LED를 구동해도 좋다. 많은 예제에서 220Ω을 사용하는데, 실내에서 지시등 목적이라면 470 Ω~1 kΩ(2-4mA)로도 충분히 밝다.
    • ATmega328P 권장 핀당 ≤ ~20 mA (절대최대 40 mA)
[5V 안정화 어댑터 or DC-DC Step-down] → (전원 분배)
                                         ├── Arduino Nano 5V 핀
                                         ├── LCD 모듈
                                         ├── microSD 모듈
                                         └── LED, 센서 등

Decoupling capacitor (also reffered to as bypass capacitor)

https://rheingoldheavy.com/bypass-capacitors/

  • 74HC595의 Vcc-GND에 리드를 최대한 짧게 하여 100nF 세라믹 커페시터 배치
  • 전원 안정화 목적의 커패시터 배치 요령은 위에서 설명하였음

인코더 신호 처리

  • 인코더 출력(CLK→D2, DT→D3)은 아두이노 나노의 디지털 입력핀에 직접 넣지 않고 74HC14 슈미트 트리거를 통과하여 넣었다. 남는 게이트의 입력핀은 Vcc로 묶는다.

MIDI IN & OUT schematics

opto-isolator는 PC900을 사용하였다. 아래 회로도에서는 표시하지 않았으나 PC900의 6번핀(+5V)과 그라운드 사이에 바이패스 커패시터를 연결해 놓았다. 스케치 업로드 시에는 RX/TX로 연결되는 회로를 끊어야 PC와 아두이노 나노 사이에 시리얼 통신이 원활하게 진행된다(점퍼 처리).

5핀 DIN MIDI 커넥터에서 실제 신호가 왕복하는 핀은 다음의 두 개이다. 2번 핀은 케이블 쉴드 접지용이고, 1과 3은 쓰지 않는다.

  • Pin 4: MIDI Current Source (+5 V 쪽)
  • Pin 5: MIDI Current Sink (Signal)

2025년 8월 26일 현재 MIDI in 회로가 제대로 작동하지 않는다. 허, 돌아버리겠다. 이미 DREAM SAM9703 도터보드 작동을 위해 만들어서 잘 작동함을 입증한 회로인데…(증거물) 8월 27일, 만능기판 뒤 패드 사이를 잘 긁어내고 에탄올로 세척하여 문제를 해결하였다!

4번 핀에 달린 280Ω 저항은 너무 낮은 값이다?

일부 회로/쉴드(특히 6N138 다알링턴 출력용)에서 220–330 Ω을 쓰는 예가 있지만, PC900은 디지털(오픈콜렉터) 타입이라 그렇게 낮추면 싱크 전류가 과다해져서 동작이 불안정해지거나 스펙을 초과한다고 한다.

  • 수신 옵토가 PC900V, 수신 전원 5V(=VRX), 규격에 충실한 MIDI IN 표준 회로일 때 RD=280Ω 권장. 에지를 빠르게 해 rise/fall을 2µs 이하로 맞추기 쉽다고 한다. 그러나 챗GPT는 이 저항이 너무 낮나고 한다.
  • 280 Ω로도 “될 수는” 있지만, PC900류에겐 전류 여유가 거의 없음
  • 1 kΩ 전후 + 74HC14 구성이 신뢰성과 수명, 호환성 면에서 가장 안전
  • 74HC14를 쓰지 않는다면 2.2 kΩ ~ 4.7 kΩ → 전류도 적당, 파형도 충분히 빠름
  • 만약 6N138이라면 220–330 Ω이 관행이지만, 그 경우도 전류/발열을 반드시 확인해야 함

MIDI IN 신호 처리 회로 점검 가이드

참고

nano_ardule_midi_controller/start.txt · Last modified: by hyjeong