# Index File Single-Source, Category Display Reordering **작성일:** 2026-01-13 ## 1. 목적 Ardule Pattern Player는 `INDEX.TXT`를 단일 소스로 유지하면서도, 사용자가 버튼 입력으로 **카테고리(장르) 목록의 표시 순서**를 즉시 전환할 수 있게 한다. 이 설계는 SD 카드의 인덱스 파일을 재생성/수정하지 않고, **펌웨어 내부의 “표시용 순서”만 바꾸는 방식**을 채택한다. --- ## 2. 범위 - 대상: Pattern Player의 **장르 요약 화면**(예: `AFC(20) BLU(10) ...` 처럼 장르별 집계를 보여주는 화면) - 비대상: 패턴 개별 목록 자체의 정렬(447개 전체 엔트리를 재정렬하는 기능은 범위 밖) --- ## 3. 핵심 원칙 1. **INDEX 파일은 하나**(`INDEX.TXT`)만 유지한다. 2. `INDEX.TXT`의 내용/정렬(알파벳 순 등)은 **변경하지 않는다.** 3. 펌웨어는 `INDEX.TXT`를 스캔하여 **장르별 집계 테이블**을 만든다. 4. 표시 순서 변경은 **장르 25개 내외의 “표시용 인덱스 배열”만 정렬**하여 처리한다. 5. 표시 순서 변경은 **즉시 반영**되며, 별도의 파일 생성/저장은 없다. --- ## 4. 데이터 모델 ### 4.1 장르 집계 테이블(실데이터) 펌웨어 내부에 장르별 정보를 다음과 같이 유지한다. - `genre[i].code` : 3글자 장르 코드(예: `AFC`) - `genre[i].count` : 해당 장르 패턴 개수 - `genre[i].first_pos` : 해당 장르의 첫 패턴 위치(줄 인덱스 또는 파일 오프셋) > `first_pos`는 장르 선택 후 패턴 리스트로 진입할 때 즉시 점프하기 위한 정보다. ### 4.2 표시용 순서 배열(정렬 대상) - `order[k] = i` 형태의 인덱스 배열(길이 ≈ 장르 수) - 화면 출력 시 `i = order[k]`를 사용하여 `genre[i]`를 참조한다. - 실데이터(genre 배열)는 움직이지 않고, **order만 정렬한다.** --- ## 5. 표시 순서 모드(카테고리 정렬 모드) 장르 표시 순서는 버튼(A6) 입력으로 다음 모드를 순환한다. 1. **A→Z** : 장르 코드 알파벳 오름차순 2. **Z→A** : 장르 코드 알파벳 내림차순 3. **N↓** : 패턴 개수 내림차순(많은 장르부터) 4. **N↑** : 패턴 개수 오름차순(적은 장르부터) 모드 전환 규칙: - `mode = (mode + 1) mod 4` - 모드 변경 시 `order[]`를 해당 기준으로 재정렬하고 화면을 갱신한다. --- ## 6. LCD 표시 규칙 ### 6.1 Line 2 왼쪽 모드 인디케이터 LCD Line2의 좌측 4칸 내외에 모드를 고정 표시한다. - `A->Z` - `Z->A` - `N↓` - `N↑` 예시(16x2 기준, 개념): - `N↓ FNK(74) ...` - `A->Z AFC(20) ...` > `N`은 “패턴 개수(Number of patterns)”를 의미한다. > 화살표는 “정렬 방향”을 의미한다. --- ## 7. 사용자 동작 흐름 ### 7.1 장르 요약 화면에서 - 엔코더 회전: 현재 하이라이트 장르 이동(선택 이동) - 엔코더 버튼(또는 기존 선택 버튼): 해당 장르로 진입(첫 패턴으로 점프) - **A6 버튼**: 장르 표시 순서 모드 순환(A→Z → Z→A → N↓ → N↑) ### 7.2 장르 진입(점프) 규칙 - 선택된 장르 `genre[i]`의 `first_pos`로 이동하여 패턴 리스트를 보여준다. - 패턴 리스트는 `INDEX.TXT` 순서 그대로이며, 별도의 “전체 정렬”을 하지 않는다. --- ## 8. 구현 난이도 및 리소스 평가 - 정렬 대상: 장르 수 ≈ 25 - 정렬 알고리즘: 삽입정렬/버블정렬로 충분(데이터가 작고 빠름) - RAM 사용량: 매우 작음 - `genre[]` 테이블 + `order[]` 배열 - SD I/O: 기존과 동일(인덱스 파일을 바꾸지 않음) --- ## 9. 예외 및 정책 1. **동일 count 장르의 tie-break** - `N↓/N↑`에서 count가 같으면 2차 기준은 장르 코드(A→Z)로 정한다. 2. **장르 수가 0인 항목** - 정상적으로는 생성되지 않으나, 존재한다면 표시에서 제외하거나 최하단으로 보낸다(구현 선택). 3. **INDEX 스캔 실패/누락** - 장르 테이블 생성 실패 시 기본 모드(A→Z)로 폴백하고 오류 메시지 표시(선택). --- ## 10. 기대 효과 - “항상 Afro-Cuban이 먼저 나오는 지겨움”을 제거하고, - 사용자 의도(자주 쓰는 장르/많은 패턴 장르)를 빠르게 탐색할 수 있으며, - INDEX.TXT 단일 소스 유지로 유지보수/배포/도구 체계를 단순화한다. --- ## 11. 향후 확장(선택) - 모드 추가: - `REC`(최근 사용 장르) - `FAV`(즐겨찾기 장르) - 모드 토글을 장르 화면에만 국한하지 않고, 패턴 목록에서도 “장르 점프”에 적용 - 장르 목록을 페이지 단위로 넘기는 “PAGE 점프” 병행 (단, 본 문서는 “INDEX 파일 하나 + 장르 표시 순서 변경”을 핵심 범위로 한다.) >Note: 장르별 집계후 알파벳 순서대로 표시되는 것은 현재의 기본 동작임