# ARR-based Pattern Length Interpretation **작성일:** 2026-01-13 --- ## 1. 배경과 문제의식 Ardule 시스템에서 드럼 패턴의 기본 단위는 ADT(Ardule Drum Pattern)이며, 기존에는 패턴의 길이(1-bar / 2-bar)가 ADT 파일 자체에 의해 결정되었다. 이로 인해 동일한 연주 내용을 가지면서 길이만 다른 패턴(예: half pattern)이 다수 생성되는 문제가 발생하였다. 본 문서는 **패턴의 연주 내용과 재생 길이 해석을 분리**하여, 패턴 길이에 대한 authority를 ADT가 아닌 ARR(체인)로 이동시키는 설계 원칙과 구현 방안을 정리한다. --- ## 2. 설계 목표 - ADT 파일은 **연주 내용만을 정의**한다. - 패턴의 재생 길이(전체 / 앞마디 / 뒷마디)는 **ARR에서만 해석**한다. - 기존 half pattern(_h 패턴)은 제거하지 않고 **그대로 유지**한다. - ARR 포맷은 **하위 호환성**을 유지해야 한다. - 체인 편집 UI는 사용자의 의도를 과도하게 추측하지 않는다. --- ## 3. 기본 개념 정리 ### 3.1 ADT (Pattern Authority) - ADT는 고유한 패턴 길이를 가진다. - 일반 패턴: 2 bars - half pattern (`_h`): 1 bar - ADT에 정의된 길이는 **상한선(authority)** 이다. ### 3.2 ARR (Interpretation Authority) - ARR는 패턴을 **어떻게 재생할지 해석**한다. - ARR는 ADT의 내용을 변경하지 않으며, **재생 범위만 선택**할 수 있다. --- ## 4. BARS 라인 (Optional) ### 4.1 개요 ARR 파일에는 선택적으로 `BARS|` 라인을 포함할 수 있다. - `BARS|` 라인은 **옵션(optional)** 이다. - 존재하지 않을 경우, 모든 패턴 엔트리는 **Full(F)** 로 간주된다. - 이를 통해 기존 ARR 파일과의 **하위 호환성**을 유지한다. ### 4.2 MAIN| 과의 관계 - `BARS|` 라인은 `MAIN|` 라인과 **1:1 대응**한다. - 각 엔트리는 콤마(`,`)로 분리된다. - 엔트리 개수가 다를 경우, ARR는 invalid로 간주할 수 있다. 예시: ``` MAIN|DRM_012,DRM_045,DRM_020 BARS|F,A,B ``` --- ## 5. BARS 토큰 정의 `BARS|` 라인은 **단일 문자 토큰**만 사용한다. | 토큰 | 의미 | |----|----| | F | Full pattern (ADT 전체 길이) | | A | 1st bar만 재생 | | B | 2nd bar만 재생 | ### 해석 규칙 - 실제 재생 길이는 다음과 같이 결정된다: ``` effective_length = min(ADT_length, BARS_selection) ``` - half pattern(`_h`) 위에 `A` 또는 `B`가 지정되어도 ADT 고유 길이를 초과할 수 없으며, 결과는 항상 1 bar이다. --- ## 6. 체인 편집 UI 동작 규칙 ### 6.1 L 키 동작 체인 편집 창에서 `L` 키를 누르면, 현재 선택된 패턴 엔트리에 대해 다음 상태를 순환한다. ``` F → A → B → F ``` - `L` 키는 **ARR 내부 해석만 변경**한다. - ADT 파일 자체는 절대 수정하지 않는다. ### 6.2 run (`xN`) 처리 규칙 - `PATT x2` 와 같이 동일 패턴이 반복(run)된 경우, **전체 run을 한 번에 half로 만드는 것은 의미가 없다**. - `L` 키를 누르면: - **항상 마지막 반복 엔트리만** length 변경 대상이 된다. - 그 결과, UI 상에서 run은 자동으로 분해된다. 예시: ``` PATT x2 ``` `L` 입력 후: ``` PATT x1 PATT @A ``` 이는 사용자의 의도가 “두 번째 반복만 다르게 재생하고 싶다”는 점을 명시적으로 반영한 설계이다. --- ## 7. 기존 half pattern(_h)의 처리 - `_h` 패턴은 **본질적으로 1-bar 패턴**이다. - ARR에서 길이 변경을 시도하더라도 결과는 변하지 않는다. - `_h` 패턴은 계속 유효하며, 제거 대상이 아니다. --- ## 8. 설계 요약 - 패턴 길이의 authority는 **ADT → ARR**로 이동한다. - `BARS|` 라인은 **옵션**이며 하위 호환성을 보장한다. - 길이 관련 토큰은 **단일 문자(F/A/B)** 로 단순화한다. - run에 대한 length 변경은 **항상 마지막 엔트리만** 적용한다. - 기존 half pattern 자산은 **존중하고 유지**한다. --- 이 설계는 과거의 자산을 보존하면서, 미래의 확장(세분화된 길이 해석, ADS 컴파일)을 자연스럽게 수용하기 위한 기반을 제공한다.