Table of Contents

Pattern Chain Display – Implementation Plan

작성일: 2026-01-05
대상: APS Pattern Chain 화면 (Chain Viewer/Editor)
목표: “항목 수” 중심의 기존 표시를 유지하면서, 연주 길이/섹션 길이/바 위치를 친절하게 표시


1. 목표(What)

1.1 타이틀 바(1줄) 확정 포맷

타이틀 바는 한 줄에 모두 포함하며, APS 버전 표기는 제거한다.

▶ Pattern Chain — Items=9, Unique=7, Bars=17, CI=1b

정의:


2. 인덱스/라인 표시 포맷(Option 1 확정)

2.1 기본 라인 포맷

NN (bBB): [Section{Nb}] PATTERN xN
NN (bBB): [Section]     PATTERN xN
NN (bBB):               PATTERN xN      # 섹션이 없으면 생략

예시:

01 (b01): [Verse{8b}]  AFC_P002.ADT x1
02 (b03): [Verse]      AFC_P003.ADT x1
03 (b05): [Verse]      AFC_P004.ADT x1
04 (b07): [Verse]      AFC_P003.ADT x1
05 (b09):              AFC_B030.ADT x1
06 (b09): [Chorus{9b}] AFC_P005.ADT x1
07 (b11): [Chorus]     AFC_P006.ADT x1
08 (b13): [Chorus]     AFC_P007.ADT x1
09 (b15): [Chorus]     AFC_h001.ADT x1

3. 계산 규칙(How)

3.1 play bars 계산 (핵심)

엔트리마다 “재생 bar 수”를 계산한다.

entry_play_bars = base_bars(pattern) * repeat_count

여기서:

>Count-in(CI)은 Bars 및 start bar 계산에 절대 포함하지 않는다.

3.2 start bar(bBB) 계산

체인 시작을 b01로 두고, 누적 재생 bar 수로 다음 엔트리의 시작 bar를 계산한다.

start_bar = 1 + cumulative_bars_before_this_entry

표기:

3.3 섹션 bar 길이 ''%%{Nb}%%'' 계산

섹션 이름이 같은 엔트리들의 entry_play_bars를 합산하여 섹션 길이를 구한다.

section_bars[section] = Σ entry_play_bars for entries in that section

표기 규칙:

3.4 섹션 “첫 엔트리” 판정

출력 순회 중, 섹션이 처음 등장할 때만 {Nb}를 붙인다.

if section and section not in seen_sections:
    show "[Section{Nb}b]"
    seen_sections.add(section)
else:
    show "[Section]"

섹션이 비어있거나 None이면:


4. 타이틀의 값 계산(Title Metrics)

4.1 Items

Items = len(chain_entries)

4.2 Unique

Unique = len(set(entry.filename for entry in chain_entries))

4.3 Bars

Bars = Σ entry_play_bars for all entries

4.4 CI


5. 구현 단계(Plan)

Phase A – 계산 함수 추가(안전, 재사용 가능)

  1. is_half_pattern(filename or meta)
  2. entry_play_bars(entry)
  3. compute_chain_metrics(entries) -> Items, Unique, Bars
  4. compute_section_bars(entries) -> dict(section->bars)
  5. compute_start_bars(entries) -> list(start_bar per entry)

Phase B – 출력 포맷 적용(표시만 변경)

  1. 타이틀 바 출력 포맷을 확정 문자열로 변경
  2. 라인 출력에서 NN (bBB):를 추가
  3. 섹션 첫 엔트리에서만 {Nb}를 삽입

Phase C – 검증(회귀 방지)


6. 주의점 및 향후 확장

6.1 Half 판정 소스

6.2 향후 “부분 비활성(PLAY_STEPS)” 도입 시


7. 완료 기준(Done)

▶ Pattern Chain — Items=<n>, Unique=<u>, Bars=<b>, CI=<ci>
NN (bBB): [Section{Nb}b] filename xN   # 섹션 첫 등장
NN (bBB): [Section]      filename xN   # 섹션 지속
NN (bBB):                filename xN   # 섹션 없음