Table of Contents
Ardule Drum Pattern Text Format: ADT v2.2
- BUILD_ID: ADT22-SPEC-20251116
- Status: Stable specification (Ardule Drum Pattern Player v2.3 / v2.4 기준)
- First published: 2025-11-16
- Scope: ADT v2.2 텍스트 포맷 및 ADP v2.2 바이너리 캐시 생성 기준
Ardule Drum Pattern System에서 사용하는 2-bar 드럼 패턴의 텍스트 표현 포맷이다. ADT v2.2는 ADP v2.2 바이너리 캐시 포맷과 1:1 대응되며, 사람이 읽고 편집하기 쉬운 것을 목표로 한다.
1. 기본 개념
- 패턴 단위: 2마디(2 bars)를 기본 전제로 한다.
- TIME_SIG: 표기 및 UI용 박자표 정보. 실제 재생 타이밍 계산에는 관여하지 않는다.
- GRID / LENGTH: 패턴의 해상도(그리드)와 총 스텝 수를 정의한다.
- 표준 조합(2-bar 기준)
- GRID=16, LENGTH=32 (4/4, 1 bar = 16 steps)
- GRID=8T, LENGTH=24 (12/8, 1 bar = 12 steps)
- GRID=16T, LENGTH=48 (4/4 triplet, 1 bar = 24 steps)
- 다른 조합도 표현은 가능하지만, ADP v2.2 표준 플레이어와의 호환성은 보장하지 않는다.
- SLOTS: 동시에 사용할 드럼 슬롯(보통 12).
- ACC (accent level): 각 스텝의 타격 세기를 0~3의 4단계로 표현한다.
- 0: rest (무음)
- 1: 약박
- 2: 중간강
- 3: 강박
- ORIENTATION
- STEP: 한 줄이 “한 스텝에서의 모든 슬롯 상태”를 의미한다.
- SLOT: 한 줄이 “한 슬롯에서의 전체 스텝 패턴”을 의미한다.
- ADP 변환 시에는 항상 STEP 오리엔테이션으로 정규화된다.
2. 파일 구조 개요
ADT v2.2 파일은 다음과 같이 구성된다.
- 첫 줄: 버전 코멘트(권장)
- 헤더: key=value 형식의 메타데이터
- SLOT 선언: SLOT0..SLOT11
- 본문 패턴: ORIENTATION에 따라 STEP 또는 SLOT 방식으로 표현된 문자 격자
예)
; ADT v2.2 NAME=ROCK01_MAIN TIME_SIG=4/4 GRID=16 LENGTH=32 SLOTS=12 KIT=GM_STD ORIENTATION=STEP SLOT0=KK@36,KICK SLOT1=SN@38,SNARE SLOT2=CH@42,HH_CL ... SLOT11=PH@44,HH_PED X..X..X..X..X..X..X..X.. ....X.......X.......... ........................ ...
3. 헤더 필드
모든 헤더 필드는 `KEY=VALUE` 형식이며, 대소문자를 구분하지 않는다. 미지의 키는 무시된다.
| 키 | 필수 여부 | 형식 / 예시 | 설명 |
|---|---|---|---|
| NAME | 필수 | `NAME=ROCK01_MAIN` | 패턴 이름(ASCII/UTF-8 문자, 공백 허용). |
| TIME_SIG | 필수 | `TIME_SIG=4/4` | 박자표. 재생 타이밍에는 영향 없음. |
| GRID | 필수 | `GRID=16` / `8T` / `16T` | 패턴 해상도. |
| LENGTH | 필수 | `LENGTH=32` | 전체 스텝 수(정수). |
| SLOTS | 필수 | `SLOTS=12` | 슬롯 수. ADP v2.2 표준은 12를 가정. |
| KIT | 필수 | `KIT=GM_STD` | 드럼 킷 이름(문자열). |
| ORIENTATION | 선택 | `ORIENTATION=STEP` | STEP 또는 SLOT. 생략 시 자동 판정. |
- 버전 코멘트
- 첫 줄에 `; ADT v2.2`를 넣는 것을 권장한다.
- 이것은 코멘트일 뿐, 별도의 `VERSION=` 필드는 존재하지 않는다.
- ORIENTATION 자동 판정 규칙
- ORIENTATION이 누락되었을 때:
- 본문에서 “길이 L, 폭 S”인 줄이 L개 존재하면 STEP으로 해석.
- “길이 L, 폭 S”인 줄이 S개 존재하면 SLOT으로 해석.
- 둘 다 아니면 STEP으로 가정한다.
4. SLOT 선언
각 슬롯은 MIDI 노트 번호, 약어, 이름으로 정의한다. 키 이름은 `SLOT0`부터 `SLOT11`까지를 표준으로 한다.
형식:
SLOTn=ABBR@NOTE[,NAME]
- `n`: 0~11 (정수)
- `ABBR`: 1~3자의 슬롯 약어 (예: KK, SN, CH)
- `NOTE`: 0~127 범위의 MIDI 노트 번호
- `NAME`: 인간이 읽기 위한 슬롯 이름(선택)
예)
SLOT0=KK@36,KICK SLOT1=SN@38,SNARE SLOT2=CH@42,HH_CL SLOT3=OH@46,HH_OP SLOT4=LT@45,TOM_L SLOT5=MT@47,TOM_M SLOT6=HT@50,TOM_H SLOT7=RD@51,RIDE SLOT8=CR@49,CRASH SLOT9=RM@37,RIM SLOT10=CL@39,CLAP SLOT11=PH@44,HH_PED
- 어떤 SLOTn이 선언되지 않은 경우, 위의 GM 12슬롯 기본값으로 채운다.
- ADP v2.2 표준에서는 SLOTS=12, SLOT0~11이 모두 존재하는 것을 기본으로 한다.
5. 본문 패턴: STEP / SLOT 표현
헤더와 SLOT 선언 이후부터 파일 끝까지는 “본문 패턴” 영역이다. 빈 줄 또는 세미콜론(;)으로 시작하는 줄은 코멘트로 취급하여 무시한다.
5.1 사용 가능한 문자와 ACC 매핑
본문에서 사용할 수 있는 문자는 다음과 같다.
| 문자 집합 | ACC 값 | 의미 | |
|---|---|---|---|
| `-` | 0 | rest / hit 없음 | |
| `.` | 1 | 약박 | |
| `o`, `O` | 2 | 중간강 | |
| `x`, `X`, ` | ` | 3 | 강박 |
- 공백, 탭, 기타 문자는 모두 무시된다(라인 정규화 과정에서 제거).
- 출력 시에는 `- . o X` 형태를 권장하지만, 파서는 위 문자 집합 전체를 허용한다.
5.2 STEP 오리엔테이션
- 한 줄이 “한 스텝에서의 모든 슬롯 상태”를 의미한다.
- 각 줄의 길이(유효 문자 수)는 `SLOTS`와 같아야 한다.
- 줄의 개수는 `LENGTH`와 같아야 한다.
예) GRID=16, LENGTH=32, SLOTS=12
X..X..X..X..X..X..X..X.. ....X.......X.......... ........................ ...
- 위 예시에서 첫 줄은 step 0에 해당하며, 왼쪽에서 오른쪽으로 SLOT0→SLOT11 순서이다.
- 각 문자에 대응하는 ACC 값(0~3)이 ADP에 저장된다.
5.3 SLOT 오리엔테이션
- 한 줄이 “한 슬롯에서의 전체 스텝 패턴”을 의미한다.
- 각 줄의 길이(유효 문자 수)는 `LENGTH`와 같아야 한다.
- 줄의 개수는 `SLOTS`와 같아야 한다.
- 줄의 순서는 SLOT0, SLOT1, …, SLOT(SLOTS-1)이다.
예) SLOTS=12, LENGTH=32
X..X..X..X..X..X..X..X.. ; SLOT0 ....X.......X.......... ; SLOT1 ........................ ; SLOT2 ...
ADT v2.2 → ADP v2.2 변환기에서는 내부적으로 항상 STEP 오리엔테이션으로 변환한 뒤, ADP를 생성한다.
6. 멀티 ADT 컨테이너(ADX)
ADT v2.2는 여러 개의 패턴을 하나의 파일로 묶는 컨테이너 형식(ADX)을 지원한다.
- 파일 확장자: `.adx` 권장.
- 구조:
- `[패턴 헤더 + SLOT 선언 + 본문]` 블록이 여러 개 연속.
- 각 패턴은 `NAME=` 필드를 통해 고유한 이름을 가진다.
- 다른 파일에서 참조:
- `FILE.ADX:SECTION` 형태로 참조.
- 여기서 `SECTION`은 해당 패턴의 `NAME` 값이다.
- 예: `ROCKPACK.ADX:ROCK01_MAIN`
7. ADP v2.2와의 관계(요약)
ADT v2.2는 ADP v2.2 바이너리 캐시와 1:1 대응한다.
- GRID, LENGTH, SLOTS 정보는 ADP 헤더에 그대로 반영된다.
- 각 스텝의 ACC 값(0~3)과 슬롯 인덱스(0~11)가 ADP payload로 인코딩된다.
- ADP 헤더에는 다음과 같은 메타 필드가 추가된다.
- PPQN: 재생 엔진 참고용 (표준 값 96)
- SWING, TEMPO: 현재 버전의 ADT→ADP 변환기에서는 0으로 고정
- CRC16: 정규화된 ADT 텍스트(ORIENTATION=STEP, SLOT0~11, 본문 STEP 격자)에 대한 CRC-CCITT(0x1021, init 0xFFFF)
ADT v2.2 사양에서는 SWING, TEMPO를 별도의 헤더 필드로 정의하지 않는다. 이 필드는 ADP v2.2 헤더 레벨에서만 존재하며, 현재 구현에서는 모두 0으로 저장된다.
8. 검증 체크리스트
ADT v2.2 파일을 생성하거나 읽을 때 다음을 확인한다.
- 첫 줄이 `; ADT v2.2`인지 확인 (권장, 필수는 아님).
- 헤더:
- NAME, TIME_SIG, GRID, LENGTH, SLOTS, KIT 필드가 모두 존재하는가?
- GRID는 16 / 8T / 16T 중 하나인가?
- LENGTH는 24 / 32 / 48 중 하나인가? (표준 조합 권장)
- SLOTS는 12인가? (ADP v2.2 표준 플레이어는 12를 가정)
- SLOT 선언:
- SLOT0..SLOT11이 모두 정의되었는가?
- 정의되지 않은 SLOTn은 GM 12슬롯 기본값으로 채워졌는가?
- 본문:
- ORIENTATION=STEP인 경우
- 본문 내 유효 라인 수가 LENGTH와 동일한가?
- 각 라인의 유효 문자 수가 SLOTS와 동일한가?
- ORIENTATION=SLOT인 경우
- 본문 내 유효 라인 수가 SLOTS와 동일한가?
- 각 라인의 유효 문자 수가 LENGTH와 동일한가?
- 사용된 문자가 `- . o O x X ^` 범위를 벗어나지 않는가?
- 멀티-ADT(ADX)의 경우
- 각 패턴이 고유한 NAME을 가지고 있는가?
- 외부 참조 시 `FILE.ADX:NAME` 형식을 사용하는가?
이 사양은 현재 제공되는 `mid2adt.py` 및 `adt2adp.py` 스크립트와 호환되며, Ardule Drum Pattern Player v2.3/2.4에서 사용할 ADP v2.2 캐시 파일 생성의 기준으로 삼는다.
