This commit is contained in:
2026-04-24 21:26:39 +09:00
parent cd38fd49e2
commit 0fe1e355a7
15 changed files with 204 additions and 11339 deletions

25
spec.md
View File

@@ -43,10 +43,27 @@
- 로드된 모델과 학습 시 사용했던 스케일링 파라미터(Mean, Std)를 동일하게 적용하여 예측을 진행한다.
# Factor
## 종류
- average_density: 평균 밀도
- peak_density: 최고 초당 밀도
- max_combo: 노트의 수
## 추천 Factor 세트 (난이도 결정 핵심 지표)
1. **density_avg**: 평균 노트 밀도 (총 노트 수 / 곡 길이)
2. **density_peak**: 1초당 최대 밀도 (가장 촘촘한 구간의 노트 수)
3. **bpm_avg**: 곡의 평균 BPM
4. **bpm_change**: BPM 변화율 (BPM 변속의 다양성)
5. **note_count**: 총 노트 수
6. **complexity**: 동캇 꼬임
## Factor 계산 로직
- **밀도 계열**:
- 노트 간 시간 간격을 `delta`라고 할 때, `1 / delta`로 순시 밀도를 구한 뒤 최대값(`peak`)과 평균값(`avg`)을 도출합니다.
- **패턴 계열**:
- 노트 타입을 배열로 매핑(예: 0=none, 1=don, 2=ka, 3=big_don, 4=big_ka)합니다.
- 슬라이딩 윈도우(예: 4~8개 노트)를 사용하여 인접한 노트의 타입 변화가 잦은 구간을 복합 패턴으로 판정(`complex_ratio`)합니다.
- **연타 계열**:
- `#ROLL` 명령 혹은 특정 시간 내에 입력이 몰려있는 노트를 연타로 간주하여 카운트합니다.
## 구현 가이드
- `factorize.ts`에서 각 곡의 `Course` 데이터를 순회하며 위 지표들을 계산합니다.
- 계산된 값은 `Record<string, number>` 형태로 반환하여 학습기에 입력합니다.
- 모든 Factor는 이상치(Outlier) 처리를 위해 학습 단계에서 `StandardScaler` 또는 `RobustScaler`를 반드시 거쳐야 합니다.
# Scripts
- `parse.ts`: TJA 문자열을 `Course` 객체로 변환.