====== Nano Ardule MIDI Controller: 설계 요약 문서 ====== * **작성자:** 정해영 * **최초 작성일:** 2025년 8월 5일 * **최종 수정일:** --- //[[jeong0449@gmail.com|Haeyoung Jeong]] 2025/08/26 08:37// {{:pictures:nano_ardule_20250905.png?250|}} {{:pictures:nano_ardule_20250828.jpg?250|2025년 8월 28일 제작 상태}} {{:pictures:nano_ardule_20250826.png?250|}} ===== 네임스페이스가 포함하는 하위 정보 ===== {{pglist> files dirs nostart}} ===== 목표 ===== 별도의 조절 장치를 갖고 있지 않은 GM sound module의 활용도를 높이기 위한 Arduino Nano 기반의 MIDI Controller(**Nano Ardule**)를 제작한다. Ardule은 **Ardu**ino + Mo**dule**의 합성어이며, 프랑스어로 ‘어려운’(arduous)이라는 뜻도 갖고 있다. 2개 프로그램의 layer/split이 가능하며, 음색 설정을 user program/combi 형태로 microSD 카드에 저장하고 로드할 수 있다. 또한 카드에 저장된 type 0 MIDI 파일을 재생하는 기능도 갖고 있다. 이 프로젝트는 GM 명령어를 공부하고 아두이노의 활용법을 익히기 위한 목적도 있다. ===== 시스템 구성 ===== * **주 제어부:** Arduino Nano 호환 보드 (CH341 드라이버 필요) * **출력 대상:** [[:my_old_synths_and_midi#dream_sam9703을_이용한_midi_음원_보드_활용_dream_project|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와 대화하면서 이를 구체화하기 시작함. 설계 개념은 [[sound browser|여기]]를 참조할 것. * 모드 진입: 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 후 다른 버튼 누르면 원래 상태로 복귀. 파트 설정은 복원됨 [[Drum Pattern Auto Slicing/Merging & 8.3 Renaming|드럼 패턴 자동 분할·병합 및 8.3 리네이밍]] ===== Global Settings ===== * **저장 위치:** EEPROM * **진입 방법:** SPLIT 버튼 누른 상태로 전원 On * **설정 방법:** * 인코더 버튼 → 카테고리 전환 * 인코더 회전 → 값 조절 * **설정 항목 (기본값):** - Part A default instrument: [0] - Part B default instrument: [48] - Part A channel: [1] (1~9, 11~16) - Part B channel: [2] (1~9, 11~16) - Alternative Part A channel: [14] - Alternative Part B channel: [15] - 인코더 대기 시간(초): [0.2] (0.1~1.0) - MIDI file 정지 시 리와인드: [Y] - MIDI file 연속 재생: [N] - 곡 간 정지 시간(초): [5] (0~10) - 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 사용. {{ :pictures:nano_ardule_wiring_diagram_20250826_.png?400 |매우 불친절한 실체배선도(2025년 8월 26일 버전). 당연히 오류가 있을 수 있음!}} ==== 전원 연결 요령 ==== {{ :pictures:arduino_nano_power_path.png?400 |}} * 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는 [[PC900V|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 도터보드 작동을 위해 만들어서 잘 작동함을 입증한 회로인데...([[https://youtu.be/XxzaA6_Qilw?si=HBuI1Q6n-hquc6jV|증거물]]) 8월 27일, 만능기판 뒤 패드 사이를 잘 긁어내고 에탄올로 세척하여 문제를 해결하였다! {{ :pictures:midi_schematics.png?400 |}} === 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 Signal Handling Circuit Troubleshooting Guide|MIDI IN 신호 처리 회로 점검 가이드]] ===== 참고 ===== * {{:nano_ardule_midi_controller:pc900v_datasheet.pdf|PC900V 데이터시트}} * [[http://midi.teragonaudio.com/hardware/pc_intfc.htm|A schematic for a MIDI Adapter designed to work with the Sound Blaster joystick]] * [[https://www.dosdays.co.uk/media/dream/SAM9703.PDF|SAM9703 데이터시트]] {{ :pictures:sam9703.png?400 |}} * {{:nano_ardule_midi_controller:cleanwave32_synthesizer_rom.pdf|CleanWave32 ROM(GMS973201B for SAM9407) 데이터시트}}{{:nano_ardule_midi_controller:cleanwave_32_sound_variations.xlsx|}} - 나의 SAM9703 보드에 장착된 사운드 롬은 GMS963200-B임 * Arduino Nano pinout: [[https://www.tech-sparks.com/arduino-nano-pinout-guide/|출처]] [[https://content.arduino.cc/assets/Pinout-NANO_latest.pdf|공식 웹사이트의 자료]] {{ :pictures:arduino_nano_pinout.png?400 |}} * [[:roland_gs_variation_table|Roland GS Variation Table]] * [[https://mitxela.com/other/ca33.pdf|MMA MIDI 1.0 Electrical Specification]]