====== Ardule Drum Pattern System 설계서 ======
**최종 작성일:** — Haeyoung Jeong, 2025/10/22 08:45
{{:nano_ardule_midi_controller:drum_patterm_grid.png?400|}}
그려놓고 보니 전혀 말이 되지 않는 드럼 패턴이다.
----
===== 1. 목적(Goal) =====
Arduino Nano 기반의 **Ardule Drum Pattern System**은 SD 카드에 저장된 **2마디(2-bar) 단위의 드럼 패턴 데이터 파일**을 읽어 반복 재생하는 시스템이다.
* MIDI 파일을 직접 파싱하지 않고, 사전 변환된 **Ardule Pattern Data (.APD)** 또는 **Drum Pattern (.DRP)** 파일을 이용한다.
* APD는 **2바이트/스텝 구조**의 메모리 효율적 포맷으로, 2마디(4/4 기준 32스텝) 패턴을 완전하게 표현한다.
* LCD UI를 통해 패턴, 드럼킷, BPM을 선택하고 루프 재생한다.
* 장르별 프로필(12슬롯 노트맵) + 델타 구조로 다양한 악기 조합을 유연하게 지원한다.
* 텍스트 파일(Ardule Pattern Text or Ardule Patterm eXtended Text, .APT or .APX)을 이용하여 데이터 입력을 쉽게 할 수 있다.
> ※ 2025년 10월 21일 이후, SD 카드에는 MIDI 파일 대신 **양자화·인코딩된 2마디 패턴 파일(.APD)**을 저장하고, Ardule 본체는 이를 직접 읽어 루프 재생하는 구조로 변경되었다.
----
===== 2. 시스템 개요(System Overview) =====
^ 항목 | 사양 |
| MCU | Arduino Nano (ATmega328P, 16 MHz, Flash 32KB, SRAM 2KB, EEPROM 1KB) |
| 표시 | 16×2 I²C LCD (0x27/0x3F) |
| 입력 | 최소한 3개의 버튼 (UP / DOWN / SELECT, INPUT_PULLUP), 인코더는 옵션 |
| MIDI OUT | DIN-5, 31,250 bps (HW UART 또는 SoftwareSerial) |
| 저장소 | SD 카드(FAT), EEPROM/PROGMEM |
| 대상 음원 | GM/GS 호환 모듈(표준/록/재즈/라틴/전자/808 등) *Dream SAM9703 + GMS963200-B 사운드 롬*을 사용한 도터보드 활용에 최우선 적용 |
**동작 흐름**
- SD 카드에서 APD/DRP 파일 선택
- 파일의 헤더 파싱 및 장르 프로필 로드
- 로컬 노트맵 생성 및 델타 적용
- 32스텝 스텝워드(2B/스텝) 로딩
- LCD UI로 패턴/BPM/킷 선택 후 루프 재생
----
===== 3. 데이터 포맷(Data Format) =====
**기본 단위:** 2마디(4/4) = 32스텝 (16분음표 기준)
스텝 워드 구조 (16bit = 2B):
+----------------+----------------+----------------+
| bit15..12 | bit11..10 | bit9..0 |
| Reserved | Accent(2bit) | Note Mask(≤12) |
+----------------+----------------+----------------+
**예시:** %%0x0405%% → Accent=%%01%% (L1=%%64%%), NoteMask=%%0b0000000101%% (슬롯0,2 활성화)
**패턴 파일 구성 요소**
* 스텝 본체: %%32 × 2B = 64B%%
* 로컬 노트맵: 최대 %%12B%% (slot → MIDI note)
* 패턴 헤더:
* 장르 ID, BPM, 델타 개수 및 데이터
* (선택) 변형 슬롯, 페이지 스위치, 예외 이벤트
* 파일 확장자: %%*.APD%% 또는 %%*.DRP%%
**APD 헤더 구조 (예시)**
struct PatternHeader {
uint8_t genre_id;
uint16_t bpm;
uint8_t delta_count;
// 이어서 (slot_index, midi_note) * delta_count
};
**로컬 노트맵/장르 프로필 구조 (예시)**
struct GenreProfile {
uint8_t kit_id; // 권장 GS/GM 드럼킷
uint8_t note_map[12]; // 기본 12슬롯
uint8_t accent_lut[4]; // 예: {48, 64, 96, 112}
char name[12]; // "Latin", "Rock" ...
};
----
===== 4. 장르 프로필 + 델타 구조(Genre Profile + Delta) =====
장르별로 자주 쓰는 12슬롯 노트맵을 **PROGMEM**에 저장하고, 패턴별 변동만 델타로 기술한다.
→ 장르별 악기 차이를 몇 바이트의 델타로 처리하므로, 평균 헤더 크기가 3~12B 수준에 머문다.
예) Latin 장르에서 Conga → Agogo로 바뀐 경우, (slot5, 67) 1개만 델타로 기록.
----
===== 5. 메모리 전략(Memory Strategy) =====
* 로컬 노트맵(12슬롯): 패턴별 실제 사용 악기만 채택 (2B/스텝 유지)
* 예외 이벤트(13슬롯 이상): `(step, note, accent)` 2~3B/건
* 페이지드 키트: 드물게 페이지 전환(1B/회)
* 변형 슬롯(선택): Crash/China/Splash 등 1슬롯 4변형(2bit)
* 평균 용량: 약 80~100B/패턴
----
===== 6. SD→APD 변환 파이프라인 (PC 전처리) =====
MIDI Type-0 파일을 사전에 변환하여 `.APD`로 저장한다.
- 헤더 파싱: `ppqn`, Tempo(0x51), TimeSig(0x58)
- 2마디 틱 범위 계산: `2 bars = 8 * ppqn`
- 채널 10 NoteOn 이벤트 추출
- 32스텝 양자화: `ticks_per_step = ppqn/4`
- 상위 10~12개 노트 선택 → 슬롯 매핑
- 벨로시티 → 4단계 Accent 매핑 (48/64/96/112)
- 스텝 워드 구성: NoteMask + Accent
- 장르 프로필 선택 및 델타 계산
- `.APD` 헤더 + 노트맵 + 스텝 데이터로 저장
----
===== 7. 패턴 파일 검증 단계 (Pattern File Validation) =====
APD 파일은 단순 구조이지만, 로딩 시 다음 항목을 확인한다.
1. 파일 헤더 매직(`"APD"` or `"DRP"`) 존재 여부
2. 패턴 길이(32스텝 = 64B) 일치 여부
3. 장르 ID / BPM 유효성
4. 델타 개수(0–12) 범위 확인
5. 로컬 노트맵과 실제 스텝 마스크 일관성
6. Accent 값이 0–3 범위인지 검증
**오류 처리**
* 구조 이상: `ERR_BAD_FORMAT`
* 데이터 불일치: `WARN_CORRUPT`
* 정상: `OK_PATTERN_READY`
> 검증은 **재생 중이 아닐 때** 수행해야 하며, SD I/O 중단이 ISR을 방해하지 않도록 한다.
----
===== 8. 재생 엔진(Playback Engine) =====
**타이밍:** 16분음표 틱(ms) = %%60000 / (BPM × 4)%%
**권장 구현:** Timer1 CTC ISR로 스텝 틱 발생 → 메인 루프는 UI/입출력 전용
ISR(TIMER1_COMPA_vect){
uint16_t w = stepWords[step];
uint8_t acc = (w >> 10) & 0x03;
uint16_t mask= w & 0x03FF;
// 예: {48, 64, 96, 112}
uint8_t vel = ACC_LUT[acc];
for(uint8_t s = 0; s < 12; s++){
if(mask & (1 << s)){
uint8_t n = noteMap[s];
if(n){ // 0은 비활성
// ch10 Note On
Serial.write(0x90 | 9);
Serial.write(n);
Serial.write(vel);
}
}
}
step = (step + 1) % 32;
}
* **스윙/트리플렛:** ISR 비교값이나 다음 틱의 오프셋을 가변 적용(데이터 증가 없이 재생 파라미터로 처리).
----
===== 9. UI 설계(16×2 LCD) =====
모드 순환: **Pattern → Kit → BPM → Play → Pattern**
예시 표시:
P12: Latin A
Latin 118 BPM
조작:
* UP/DOWN: 값 변경
* SELECT: 모드 전환 / 재생 토글
* 장르 선택 시 즉시 미리듣기 가능
----
===== 10. 저장소 설계 =====
* **SD 카드:** `.APD` 또는 `.DRP` 파일 저장
* **EEPROM (1KB):** 사용자 패턴 8~12개 영구 저장
* **PROGMEM:** 기본 장르 프로필 및 내장 패턴
savePattern(base, header, deltas, steps);
loadPattern(base);
----
===== 11. APT 파일 (Ardule Pattern Text) =====
**목적(Purpose)**
APT 파일은 `.APD`의 내용을 **사람이 읽고 편집하기 쉬운 2차원 그리드 형태**로 표현한 텍스트 포맷이다.
`.APD`가 스텝(시간) 중심의 이진 구조라면, `.APT`는 **각 악기(파트)** 를 행(row)으로, **시간(스텝)** 을 열(column)로 표현한다.
즉, 사람이 직접 리듬 구조를 시각적으로 파악하거나 수정하기 위한 **시각화/편집용 포맷**이다.
**파일 확장자:** `.APT`
**표준 헤더 문자열:** `# Ardule Pattern Text v2.1`
**기본 구조(Basic Layout) - 8 비트 Rock 예시**
STEPS=32 BPM=109 MIDI_CH=9 TIME_SIG=4/4
SLOTS=Kick:36,Snare:38,CHH:42,OHH:46,Crash:49,HighTom:50,LowTom:45,Ride:51
Ride: .... .... .... .... || .... .... .... ....
HighTom: .... .... .... .... || .... .... .... ....
Crash: .... .... .... .... || .... .... .... ....
OHH: .... .... .... .... || .... .... .... ....
LowTom: .... .... .... .... || .... .... .... ....
CHH: o.o. o.o. o.o. o.o. || o.o. o.o. o.o. o.o.
Snare: .... o... .... o... || .... o... .... o...
Kick: o.o. ..o. o.o. ..o. || o.o. ..o. o.o. ..o.
# row = 파트(악기), column = 스텝(시간)
# 32스텝 = 2마디 (4/4 × 2)
# 기호(대소문자 무시):
# ^ = ACC3 (강박)
# X/x = ACC2 (중간강)
# O/o = ACC1 (약박)
# . = ACC0 (무음)
**악센트(Accent) 표현 규칙**
* 각 문자는 대소문자를 구별하지 않는다. (`X`=`x`, `O`=`o`)
* 4단계 악센트(ACC=3~0)는 다음과 같이 매핑된다.
^ 기호(Symbol) ^ ACC ^ Velocity 예시 ^ 의미(Meaning) ^
| ^ | 3 | 112 | 강박 (forte) |
| X / x | 2 | 96 | 중간강 (mezzo forte) |
| O / o | 1 | 64 | 약박 (mezzo piano) |
| - | 0 | — | 무음 (rest) |
* `.APD` 변환 시 각 스텝의 전체 ACC는 그 스텝 내 모든 슬롯의 **최대 ACC**로 계산된다.
**변환 규칙(Conversion Notes)**
* 한 행(row)은 하나의 악기 슬롯을 의미한다.
* 열(column)은 시간(스텝)이며, 일반적으로 32열 = 2마디(4/4 기준).
* `[NOTE MAP]` 블록은 `.APD`의 로컬 노트맵과 동일하다.
* 주석(`#`)은 변환 시 무시된다.
* APT → APD 변환기는 각 기호를 해석하여 bitmask + 공통 ACC 구조로 압축한다.
**요약(Summary)**
APT는 사람이 직관적으로 읽고 편집할 수 있는 드럼 패턴 표현 형식으로,
각 악기별 행(row)과 32스텝의 열(column)로 구성된다.
기호(`X/x`, `O/o`, `.`, `-`)를 통해 강약(Accent)을 표현하며,
변환기(`apt2apd.py`)를 통해 `.APD` 실행 포맷으로 자동 변환된다.
----
===== 12. 향후 확장 =====
* **Song Mode:** 다수 패턴 체인 구성
* **스윙/트리플렛 UI:** 실시간 가감
* **SD 브라우저:** 패턴 검색, 미리듣기
* **패턴 편집 기능:** 간단한 스텝 수정 및 저장
* **MCU 확장:** ESP32/Teensy 기반으로 SD 스트리밍 지원
----
===== 13. 요약 =====
Ardule Drum Pattern System은 **APD(Ardule Pattern Data)** 파일을 기반으로 동작하는 32스텝 드럼 루퍼이다.
장르 프로필과 델타 구조를 활용하여 GM/GS 드럼킷의 폭넓은 호환성을 유지하면서도, Nano 환경에서 실시간 재생이 가능한 최소한의 데이터 구조를 갖춘다.
SD→APD 변환 파이프라인을 통해 PC에서 사전 처리된 데이터를 안정적으로 로드하고, LCD UI를 통해 간편하게 패턴, 킷, BPM을 제어할 수 있다.
----
**(C) 2025 Haeyoung Jeong — Ardule Project**
* {{ :nano_ardule_midi_controller:drum_pattern_format_v1_1_with_diagram.docx |}} <- 위 본문보다 이전에 작성되었음
* {{ :nano_ardule_midi_controller:apt_v2.1_specification.docx |}}
* {{ :nano_ardule_midi_controller:adx_tools.zip |}}