본 문서는 현재 Ardule Drum Pattern Player v2.5 재생 엔진이
ADS(Ardule Data Stream)를 입력으로 받을 경우에도 2-bar 단위로 강제 분절되어 처리되는지 여부를 검증하고,
이를 기반으로 Nano Ardule에 적합한 ADS v0.1 바이너리 캐시 포맷을 제안한다.
엔진은 다음 상태 변수들로 재생을 제어한다:
patLoopLenTickspatLoopStartUspatEventIndexpatEventCountnextEventUshaveNextEvent
이 구조는 grid/step 기반 시퀀서가 아니라,
delta/absolute time event scheduler의 전형적인 형태이다.
코드 주석 중 다음 문구가 존재한다:
// Pattern playback loop (2-bar absolute-time engine)
그러나 코드 분석 결과:
이벤트는 다음 조건에서 즉시 송출된다:
if (haveNextEvent && nowUs >= nextEventUs) { // send MIDI event }
패턴 끝은 이벤트 인덱스 비교 후 loop 또는 종료를 결정할 뿐이다.
➡️ bar / 2-bar 경계에서만 이벤트를 묶는 구조는 존재하지 않는다.
현재 Ardule 재생 엔진은 ADS를 입력으로 받아도
2-bar 단위로 끊어서 재생하지 않는다.
ADS는 Nano Ardule에서 해석 없이 즉시 재생 가능한 입력물이다.
ARR / ADT의 구조적 의미를 모두 제거한 시간 정렬된 MIDI 이벤트 스트림이다.
[ ADS Header ] [ Event Stream ]
| Offset | Size | Field | Description |
|---|---|---|---|
| 0x00 | 4 | magic | “ADS\0” |
| 0x04 | 1 | version | 0x01 |
| 0x05 | 1 | flags | bit0: loop |
| 0x06 | 2 | reserved | future |
| 0x08 | 4 | totalTicks | 전체 길이 |
| 0x0C | 2 | tpqn | ticks/QN |
| 0x0E | 2 | eventCount | 이벤트 수 |
각 이벤트는 delta-tick 기반:
[ deltaTick ][ status ][ data1 ][ data2? ]
| 항목 | ADS | MIDI |
|---|---|---|
| 패턴 기반 그루브 | 최적 | 가능 |
| 변박 | 제한적 | 최적 |
| 메모리 효율 | 매우 높음 | 낮음 |
| 엔진 부담 | 최소 | 큼 |
ADS는 Nano Ardule을 위한 ‘무사고 재생 스트림’이며,
현재 재생 엔진은 이미 그 철학에 부합한다.