작성일: 2026-01-05
대상: APS Pattern Chain 화면 (Chain Viewer/Editor)
목표: “항목 수” 중심의 기존 표시를 유지하면서, 연주 길이/섹션 길이/바 위치를 친절하게 표시
타이틀 바는 한 줄에 모두 포함하며, APS 버전 표기는 제거한다.
▶ Pattern Chain — Items=9, Unique=7, Bars=17, CI=1b
정의:
Items = 체인 엔트리(항목) 수 = 화면에 표시되는 줄 수Unique = 중복 제거한 패턴 파일 수 (파일명 기준)Bars = 재생 기준 총 마디 수 (repeat, half 반영 / Count-in 미포함)CI = Count-in (예: -, 1b, 2b)[...]로 표시{Nb} 형태로 추가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
엔트리마다 “재생 bar 수”를 계산한다.
2 bars_h / _H): 1 barxN이면 위 bar 수에 N을 곱한다.entry_play_bars = base_bars(pattern) * repeat_count
여기서:
base_bars(pattern):>Count-in(CI)은 Bars 및 start bar 계산에 절대 포함하지 않는다.
체인 시작을 b01로 두고, 누적 재생 bar 수로 다음 엔트리의 시작 bar를 계산한다.
start_bar = 1 + cumulative_bars_before_this_entry
표기:
b01, b02, ... 형태b01) 권장 (필요 시 3자리로 확장)
섹션 이름이 같은 엔트리들의 entry_play_bars를 합산하여 섹션 길이를 구한다.
section_bars[section] = Σ entry_play_bars for entries in that section
표기 규칙:
{8b} 처럼 b를 포함하여 마디 단위임을 명확히 한다.
출력 순회 중, 섹션이 처음 등장할 때만 {Nb}를 붙인다.
if section and section not in seen_sections:
show "[Section{Nb}b]"
seen_sections.add(section)
else:
show "[Section]"
섹션이 비어있거나 None이면:
{Nb}도 없음Items = len(chain_entries)
xN)은 “고유 패턴 수”에 영향을 주지 않음Unique = len(set(entry.filename for entry in chain_entries))
Bars = Σ entry_play_bars for all entries
CI=-CI=1bCI=2bis_half_pattern(filename or meta)entry_play_bars(entry)compute_chain_metrics(entries) -> Items, Unique, Barscompute_section_bars(entries) -> dict(section->bars)compute_start_bars(entries) -> list(start_bar per entry)NN (bBB):를 추가{Nb}를 삽입xN) 포함 케이스에서 Bars 및 start bar 누적이 맞는지 확인_h### 규칙PLAY_BARS=1을 우선Bars는 여전히 bar 단위로 유지하되,Trim=3/4) 같은 방식으로 확장 가능▶ 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 # 섹션 없음