Table of Contents

Ardule Drum Pattern System 설계서

최종 작성일: — Haeyoung Jeong, 2025/10/22 08:45

그려놓고 보니 전혀 말이 되지 않는 드럼 패턴이다.


1. 목적(Goal)

Arduino Nano 기반의 Ardule Drum Pattern System은 SD 카드에 저장된 2마디(2-bar) 단위의 드럼 패턴 데이터 파일을 읽어 반복 재생하는 시스템이다.

※ 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 사운드 롬*을 사용한 도터보드 활용에 최우선 적용

동작 흐름

  1. SD 카드에서 APD/DRP 파일 선택
  2. 파일의 헤더 파싱 및 장르 프로필 로드
  3. 로컬 노트맵 생성 및 델타 적용
  4. 32스텝 스텝워드(2B/스텝) 로딩
  5. 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 활성화)

패턴 파일 구성 요소

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`로 저장한다.

  1. 헤더 파싱: `ppqn`, Tempo(0x51), TimeSig(0x58)
  2. 2마디 틱 범위 계산: `2 bars = 8 * ppqn`
  3. 채널 10 NoteOn 이벤트 추출
  4. 32스텝 양자화: `ticks_per_step = ppqn/4`
  5. 상위 10~12개 노트 선택 → 슬롯 매핑
  6. 벨로시티 → 4단계 Accent 매핑 (48/64/96/112)
  7. 스텝 워드 구성: NoteMask + Accent
  8. 장르 프로필 선택 및 델타 계산
  9. `.APD` 헤더 + 노트맵 + 스텝 데이터로 저장

7. 패턴 파일 검증 단계 (Pattern File Validation)

APD 파일은 단순 구조이지만, 로딩 시 다음 항목을 확인한다.

1. 파일 헤더 매직(`“APD”` or `“DRP”`) 존재 여부 2. 패턴 길이(32스텝 = 64B) 일치 여부 3. 장르 ID / BPM 유효성 4. 델타 개수(0–12) 범위 확인 5. 로컬 노트맵과 실제 스텝 마스크 일관성 6. Accent 값이 0–3 범위인지 검증

오류 처리

검증은 재생 중이 아닐 때 수행해야 하며, 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;
}

9. UI 설계(16×2 LCD)

모드 순환: Pattern → Kit → BPM → Play → Pattern

예시 표시:

P12: Latin A
Latin 118 BPM

조작:


10. 저장소 설계

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) 표현 규칙

기호(Symbol) ACC Velocity 예시 의미(Meaning)
3 112 강박 (forte)
X / x 2 96 중간강 (mezzo forte)
O / o 1 64 약박 (mezzo piano)
- 0 무음 (rest)

변환 규칙(Conversion Notes)

요약(Summary) APT는 사람이 직관적으로 읽고 편집할 수 있는 드럼 패턴 표현 형식으로, 각 악기별 행(row)과 32스텝의 열(column)로 구성된다. 기호(`X/x`, `O/o`, `.`, `-`)를 통해 강약(Accent)을 표현하며, 변환기(`apt2apd.py`)를 통해 `.APD` 실행 포맷으로 자동 변환된다.


12. 향후 확장


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