Table of Contents

Nano Ardule MIDI Controller: 단계별 코딩 로드맵

목표: 하드웨어를 모두 연결한 뒤, 기능을 작은 단위로 쪼개어 안정적으로 구현·검증한다. 각 단계는 독립 스케치로 끝내고, 통합은 맨 마지막에 진행한다. 이 문서는 2025년 8월 21일에 작성된 개정판이다.

최종 수정일: — Haeyoung Jeong 2025/08/26 08:19

꽃과 PCB


전제(Assumptions)


전체 원칙


추천 디렉토리 구조

/NanoArdule
  /src
    config.h
    ui.h / ui.cpp                // LCD UI, 화면 템플릿, 상태머신
    midi_io.h / midi_io.cpp      // TX/RX, Running Status, 유틸
    routing.h / routing.cpp      // Layer/Split, 채널 리매핑
    storage.h / storage.cpp      // EEPROM (User Program/Combi/Global)
    player.h / player.cpp        // SD & Type-0 MIDI 재생
    main.ino
  /tests
    step_00_base.ino
    step_01_lcd_power.ino
    step_02_inputs.ino
    step_03_midi_tx.ino
    step_04_midi_rx_pass.ino
    step_05_routing_layer_split.ino
    step_06_ui_modes.ino
    step_07_eeprom.ino
    step_08_sd_player.ino

단계 0. 베이스 골격-passed

목표: 공통 헤더·유틸과 전역 상태 정의, 부팅 배너

해야 할 일

통과 기준

산출물: step_00_base.zip test/, src/ 구조는 아직 만들지 않고 단순하게 시작한다.

주의사항


단계 1. 전원·LCD·LED 스모크 테스트_passed

목표: 전원 품질과 LCD, LED 배선 이상 유무 확인

해야 할 일

통과 기준

산출물: step_01_lcd_power.zip 필요한 상수를 전부 코드 안에서 #define 문으로 정의했으므로 여기에서는 config.h 파일을 포함하지 않음


단계 2. 로터리 인코더 & 버튼 입력_passed

목표: 인코더 증감과 버튼 단·장 클릭을 정확히 읽어들임

해야 할 일

통과 기준

산출물:


단계 3. MIDI TX 기본_passed

목표: 실제 GM 음원으로 Note/Program/Channel 전송 검증

해야 할 일

통과 기준

산출물:


단계 4. MIDI RX & 패스스루_passed

목표: 외부 키보드 입력 파싱 및 기본 패스스루

해야 할 일

통과 기준

산출물:


중간단계 정리

Step 04 완료 체크리스트 (Step 05 시작 조건)

하드웨어/전원

펌웨어 기본

입력 안정화

Step 04 기능 달성

트러블슈팅 기록 (요약)

ChatGPT 대화 목록이 너무 길어져서 다음 단계부터는 새 창으로 넘어가려고 한다. 아래를 새 채팅 첫 메시지로 붙여넣으면 바로 다음 단계로 넘어간다고 한다.

프로젝트: Nano Ardule MIDI Controller

현황(요약):
- Step 04까지 완료. Program Change를 인코더로 조절/전송 OK.
- LCD는 16자 패딩으로 잔상 제거, Activity LED 동작.
- 인코더 RISING + STEP_GUARD_US≈800µs, 버튼 디바운스/장단클릭 정상.
- (선택) Note Loop 토글도 동작함/안함: [여기에 O/X 적기]

요청:
- Step 05: Routing (Layer/Split)과 채널 리매핑 설계 및 테스트 스케치 제시.
- 우선 목표: PART A/B 단일/동시(A+B)와 DRUMS(CH10) 모드 전환, 키 스플릿 포인트 지정, 트랜스포즈 엔트리 진입 UI 골격.

단계 5. 라우팅: Layer & Split

목표: 입력 노트를 A/B 다중채널로 복제 또는 음역대로 분기. 당초 단계 목표는 아주 간단하게 설정하였으나, SAM9703 도터보드에 장착된 GMS963200-B(4 MB ROM)의 모든 소리에 접근하기 위한 GS 사운드 브라우저 (Sound Browser) 기능이 들어가면서 다소 복잡해졌다. 사운드 브라우저에 진입하려면 인코더 버튼을 길게 눌러야 한다.

이 단계에서는 Nano Ardule MIDI Controller의 핵심 기능을 구현하는 것이므로 매우 주의깊게 진행하여 실패가 없도록 해야 한다. 8월 마지막 주말에 꽤 공을 들여서 코딩을 구현하였다. 애초에 구상하였던 작동 방식도 조금씩 합리적으로 변하고 있다.

해야 할 일

통과 기준

Split 세부적으로 들여다보기

생각보다 고려할 것이 많다!

산출물


단계 6. UI 모드·화면 템플릿·안전 탈출

목표: 버튼으로 모드 전환, 인코더로 파라미터 순환 편집. 사운드 브라우저(인코더 버튼 길게 눌러 진입)을 여기에서 구현한다.

해야 할 일

통과 기준

사실 단계 5~6의 경계가 모호해졌다. 단일채널(A or B part 하나만 활성) 및 멀티채널(레이어: A+B, 스플릿:A/B) 기능 및 프로그램 편집 기능까지는 하나의 스케치 파일에서 해결하였는데, SD카드에 담긴 MIDI 파일(드럼 패턴 포함)까지 재생하는 기능을 넣기 시작하니 메모리가 꽉 차서 업로드가 되지 않고 있다. 이에 대해서는 블로그의 메모리 한계에 부딪친 Nano Ardule 컨트롤러라는 글에서 대략적인 해결 방안을 기록해 두었다. 여기에서 제안한 바를 이용하여 최적화를 먼저 실시한 뒤, 스케치 파일을 나누어서 나머지 개발을 진행해야 할 것이다. — Haeyoung Jeong 2025/09/09 13:10

산출물: `/tests/step_06_ui_modes.ino`


단계 7. EEPROM: User Program & Combi 저장/로드

목표: User Program(단일 파트)과 Combi(A+B) 슬롯 저장

데이터 레이아웃(예시)

필드 크기 설명
MAGIC 4B `“ARDU”`
VER 1B 구조 변경 대비
SLOTN CH/PRG/BANK/VOL/PAN/RVB/CHR/필요 CC
CRC16 2B 무결성

해야 할 일

통과 기준

산출물: `/tests/step_07_eeprom.ino`


단계 8. microSD & Type-0 MIDI 플레이어

메모리가 매우 부족해져서 microSD 카드에 담긴 MIDI 파일 재생 기능은 완전히 독립시키기로 한다. SD 카드를 읽다가 read error가 나는 문제로 정말 고생을 많이 했다.

목표: SD에서 곡 스캔, 선택 재생/일시정지/정지

해야 할 일

통과 기준

산출물: `/tests/step_08_sd_player.ino`


단계 9. Global Settings(SETUP)

목표: 기본 악기/채널/대기시간/연속재생 등 EEPROM에 저장

권장 항목(예)

  1. Part A/B 기본 Program
  2. Part A/B 기본 Channel, 대체 CH(연주 중 리매핑용)
  3. 인코더 적용 지연(예: 0.2s)
  4. MIDI 파일 정지 시 리와인드 여부
  5. 연속 재생 On/Off, 곡 간 대기시간(초)
  6. (선택) 설정 덤프 to SD

통과 기준

산출물: `/src/storage.(h|cpp)` 업데이트 + UI 반영


단계 10. 통합·최적화·예외 처리

목표: 모든 기능 동시 구동에서 안정성 확보

체크리스트

산출물: `/src/main.ino` 완성 빌드


최종 QA 체크리스트


트러블슈팅 힌트


작업 순서 요약

1) 베이스 골격 → 2) LCD·LED 스모크 → 3) 입력 → 4) MIDI TX → 5) MIDI RX/패스 → 6) 라우팅 → 7) UI 모드 → 8) EEPROM → 9) SD/플레이어 → 10) Global → 11) 통합/QA