Table of Contents
Why Ardule Does Not Use Standard MIDI Libraries: Technical Rationale for SMF Streaming and Real-Time Pattern Engines
Ardule이 표준 MIDI 라이브러리를 사용하지 않는 기술적 이유
Nano Ardule 프로젝트는 Arduino 플랫폼(Nano/Nano Every)을 기반으로 드럼 패턴(ADT/ADP) 재생, MIDI 파일 스트리밍(Type-0/1), 레이어/스플릿, GM/GS/XG Reset 등 다양한 기능을 구현하고 있다. 일반적으로 널리 알려진 MIDI 라이브러리(FortySevenEffects MIDI Library 등)를 사용할 법도 하지만, Ardule는 이러한 라이브러리를 일절 사용하지 않는다. 그 기술적 이유를 아래와 같이 정리한다.
1. 표준 MIDI 라이브러리는 “실시간 MIDI 입력 처리용”이지 “SMF 스트리밍 재생용”이 아니다
대부분의 유명 MIDI 라이브러리는 다음 목적을 위해 설계되었다.
- UART로 들어오는 MIDI IN 메시지를 파싱
- Running Status, Real-time 메시지 처리
- 메시지 단위 콜백 구조
반면 Ardule이 필요한 것은 다음이다.
- SD 카드에서 일반 MIDI 파일(SMF) 스트리밍 재생
- Delta-time 계산 → 절대시간(absolute time) 스케줄링
- Track merge(Type-1) 처리
- Note On/Off duration 처리
- Tempo meta-event 처리
즉, 표준 라이브러리는 SMF 재생 기능 자체가 없으며, SMF 스트리밍 재생 구조와 궁합이 맞지 않는다.
2. ADT/ADP 기반의 초경량 패턴 엔진과 라이브러리 구조가 정면 충돌함
Ardule 고유의 드럼 패턴 시스템은 다음 특징을 가진다.
- 48-step grid
- Accent LUT
- Note-mask 구조
- 자체 delta-time → absolute time 변환
- 2-bar gapless loop 엔진
- 프리뷰/재생 전환 시 절대 시간 재계산
이러한 구조는 표준 MIDI 라이브러리의 이벤트 중심 처리 방식과 맞지 않는다. Ardule 엔진은 ‘시간 중심(time-driven)’, 라이브러리는 ‘이벤트 중심(event-driven)’이다.
3. 메모리 제약: Arduino Nano/Nano Every 환경에서는 라이브러리 탑재조차 어려움
표준 MIDI 라이브러리는 다음을 모두 포함한다.
- SysEx 파서
- NRPN/RPN
- Aftertouch
- Control Change 객체 구조
- 콜백 구조
- 메시지 클래스 및 내부 큐
- USB MIDI 확장 코드(일부 버전)
Ardule은 다음과 같은 환경을 가진다.
- Nano SRAM: 2KB
- Nano Every SRAM: 6KB
- 패턴 버퍼, LCD 버퍼, SD read-ahead 버퍼, 상태머신 등으로 이미 높은 점유
따라서, 라이브러리를 추가하면 메모리 부족 → 실행 불가 → 타이밍 불안정이 필연적이다.
4. SMF 스트리밍에서 타이밍 정확도가 절대적이기 때문에 라이브러리의 지터는 용납 불가
SMF 재생은 다음 조건을 충족해야 한다.
- Delta-time을 기반으로 수 μs 단위의 시간 정밀도 확보
- 동일 시점(Delta=0)에서 다수 이벤트의 동시 처리
- Note duration 관리
- Tempo 변화 적용
표준 MIDI 라이브러리는 다음 구조적 지연을 가진다.
- 내부 큐 지연
- 콜백 호출 지연
- 다단계 함수 호출
- 객체 생성/소멸 비용
이로 인해 0.5~3ms 수준의 지터가 발생하며, 이는 드럼 패턴 재생 및 SMF 재생에서는 명백하게 귀에 들리는 타이밍 오차이다.
5. Ardule은 이미 절대시간 기반의 MIDI 엔진을 자체 구현하였음
Ardule 엔진은 다음과 같은 절대시간 구조를 갖는다.
- 32-bit 마이크로초(us) 기반 스케줄링
- ADP/ADT 패턴 엔진과 동일한 시간 계산 모델
- SD 스트리밍 read-ahead 방식
- Running Status 재구성
- Track merge 시 우선순위 큐 기반 절대시간 처리
이러한 구조는 표준 라이브러리의 내부 로직과 전혀 맞지 않으며, 표준 라이브러리를 사용할 경우 오히려 엔진이 망가진다.
6. 불필요한 기능이 너무 많아 오히려 성능을 떨어뜨림
Ardule가 실제로 필요로 하는 것은 다음뿐이다.
- MIDI OUT 송출
- GM/GS/XG SysEx Reset
- 채널 복제(layer/split)
- 드럼 패턴용 Note On/Off
- SMF 재생용 절대시간 스케줄링
반면 표준 라이브러리는 다음을 포함한다.
- Aftertouch
- Poly Pressure
- RPN/NRPN
- MMC(MIDI Machine Control)
- Real-time Sync Clock
- 런타임 SysEx 버퍼 관리
- USB MIDI 대응 코드
즉, Ardule에는 전혀 필요 없는 기능 덩어리이며, 무거운 구조 때문에 성능과 안정성만 떨어뜨린다.
7. 결론: Ardule는 성능, 타이밍, 메모리, 구조 모두의 이유로 표준 MIDI 라이브러리를 사용할 수 없다
Ardule은 다음 요구사항을 모두 동시에 만족시켜야 한다.
- μs 단위 절대 타이밍
- Gapless 재생
- 48-step 드럼 패턴 엔진
- SD 기반 SMF 스트리밍 재생
- 최소 메모리 구조
- Running Status 제어
- Layer/Split 처리
- GM/GS/XG SysEx 지원
이 모든 조건은 표준 MIDI 라이브러리로는 해결 불가하며, 따라서 Ardule은 자체 저수준(byte-level) MIDI 처리 코어를 직접 구현하는 방식만이 가능하다.
이 문서는 Ardule 프로젝트의 기술적 설계 의도를 정리한 공식 설명자료로 활용 가능하다.
저자 및 이용 안내
이 문서는 정해영의 아이디어와 지시에 따라 AI 도구(ChatGPT)의 도움을 받아 작성되었습니다.
본 문서는 Creative Commons CC0 1.0 Universal Public Domain Dedication에 따라 누구나 자유롭게 복제, 수정, 배포, 활용할 수 있으며, 출처 표시도 필요하지 않습니다. 다만, 내용의 정확성은 보장되지 않았으며, 정해영은 본 문서의 내용에 대해 어떠한 법적 책임도 지지 않습니다.
Authorship and Usage Notice
This document was written with the assistance of an AI tool (ChatGPT), based on the ideas and direction provided by Haeyoung Jeong.
It is released under the Creative Commons CC0 1.0 Universal Public Domain Dedication. Anyone may freely copy, modify, distribute, and use the content, with no requirement for attribution. However, the accuracy of the content is not guaranteed, and Haeyoung Jeong assumes no legal responsibility for its use.
