# Ardule Playback Engine 판정 보고서 ## & ADS v0.1 Binary Cache Format Proposal --- ## 1. 판정 개요 (Executive Summary) 본 문서는 현재 **Ardule Drum Pattern Player v2.5 재생 엔진**이 ADS(Ardule Data Stream)를 입력으로 받을 경우에도 **2-bar 단위로 강제 분절되어 처리되는지 여부**를 검증하고, 이를 기반으로 **Nano Ardule에 적합한 ADS v0.1 바이너리 캐시 포맷**을 제안한다. ### 핵심 판정 요약 - ❌ 재생 엔진은 **step(32) / bar / 2-bar 단위로 이벤트를 처리하지 않는다** - ✅ 실제 재생 메커니즘은 **절대시간 기반 이벤트 스트리밍 엔진**이다 - ⚠️ 다만 “2-bar 패턴”을 전제로 한 **의미적 흔적(주석, 명명)** 은 남아 있다 - 🎯 구조적으로 ADS 입력을 수용하는 데 **본질적인 장애는 없다** --- ## 2. 재생 엔진 구조 판정 (Detailed Analysis) ### 2.1 시간축 기준 판정 #### ❌ 존재하지 않는 구조 - step index (0..31) - for(step < 32) - step → note 매핑 테이블 - bar boundary에서만 이벤트 처리하는 로직 #### ✅ 실제 사용 중인 구조 엔진은 다음 상태 변수들로 재생을 제어한다: - `patLoopLenTicks` - `patLoopStartUs` - `patEventIndex` - `patEventCount` - `nextEventUs` - `haveNextEvent` 이 구조는 **grid/step 기반 시퀀서가 아니라**, **delta/absolute time event scheduler**의 전형적인 형태이다. --- ### 2.2 “2-bar”의 실제 의미 코드 주석 중 다음 문구가 존재한다: ```cpp // Pattern playback loop (2-bar absolute-time engine) ``` 그러나 코드 분석 결과: - “2-bar”는 **재생 단위가 아니라 데이터의 길이에 대한 관례적 설명** - 엔진은 bar 수, 박자표(time signature)를 해석하지 않으며 - 단지 loop length(ticks)까지만 시간을 비교한다 --- ### 2.3 이벤트 처리 경계 분석 이벤트는 다음 조건에서 **즉시 송출**된다: ```cpp if (haveNextEvent && nowUs >= nextEventUs) { // send MIDI event } ``` 패턴 끝은 이벤트 인덱스 비교 후 loop 또는 종료를 결정할 뿐이다. ➡️ bar / 2-bar 경계에서만 이벤트를 묶는 구조는 존재하지 않는다. --- ## 3. 판정 결론 > **현재 Ardule 재생 엔진은 ADS를 입력으로 받아도 > 2-bar 단위로 끊어서 재생하지 않는다.** --- # 4. ADS v0.1 설계안 (Binary Cache Format) ## 4.1 설계 철학 ADS는 Nano Ardule에서 **해석 없이 즉시 재생 가능한 입력물**이다. ARR / ADT의 구조적 의미를 모두 제거한 **시간 정렬된 MIDI 이벤트 스트림**이다. --- ## 4.2 ADS의 책임 범위 ### 책임 - MIDI 이벤트 시퀀스 - 이벤트 간 시간 간격 - 전체 재생 길이 - (선택) loop 여부 ### 비책임 - bar / beat / time signature - 패턴 개념 - 구조 해석 - 실시간 편집 --- ## 4.3 ADS v0.1 파일 구조 ### 전체 구조 ``` [ ADS Header ] [ Event Stream ] ``` --- ### Header (16 bytes) | 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 | 이벤트 수 | --- ### Event Stream 각 이벤트는 delta-tick 기반: ``` [ deltaTick ][ status ][ data1 ][ data2? ] ``` --- ## 4.4 Loop 규칙 - flags.bit0 == 1 → 전체 길이 기준 loop - loop 위치는 항상 tick 0 --- ## 4.5 1-bar / 변박 처리 원칙 - ADS에는 bar 개념 없음 - APS 단계에서 tick 기반으로 평탄화 - Nano Ardule는 박자를 알지 못한 채 재생 --- ## 5. ADS vs MIDI 역할 분담 | 항목 | ADS | MIDI | |----|----|----| | 패턴 기반 그루브 | 최적 | 가능 | | 변박 | 제한적 | 최적 | | 메모리 효율 | 매우 높음 | 낮음 | | 엔진 부담 | 최소 | 큼 | --- ## 6. 최종 정리 > **ADS는 Nano Ardule을 위한 ‘무사고 재생 스트림’이며, > 현재 재생 엔진은 이미 그 철학에 부합한다.**