Files
HolodoriCalc/docs/research/song-score-formula-validation.md
dal4segno e688036d11
Publish GitHub Pages output / publish (push) Successful in 54s
fix: calculate chart scores with song formulas and hidden note weights
2026-09-06 21:51:42 +09:00

8.9 KiB
Raw Permalink Blame History

곡별 점수 환산식 검증 — 2026-09-06

결론

최신 후속 결과: 원본 SUS로 m0341 Expert 분모 800850을 산출하여 적용했다. 현재 388개 전체가 공식 기반이다. 기존 분모 21개와의 교차 검증 및 산출 과정은 코로네 Expert SUS 분석에 기록했다. 아래 387개 적용 및 누락 관련 설명은 이전 검증 단계의 이력이다.

후속 구현: 387개 채보에 formula-v1을 적용했다. m0341.expert는 기존 추정값을 유지한다. 아래 분석 수치와 비교표는 적용 전 상태의 기록이며, 검증 스크립트를 현재 상태에서 실행하면 공식 적용 채보의 모델 간 차이는 0으로 표시된다. 채보 수집 시에도 공식이 우선되며, 실측 적용 명령은 공식 기반 값을 덮어쓰지 않는다.

연구 공식에 곡별 계수·난이도와 perfect_note_weight를 적용하면 저장된 13곡, 18개 곡/난이도, 19건의 일반 PERFECT 실측값을 모두 정확히 재현한다. 실측값에 맞춘 새로운 상수 피팅은 하지 않았다. 기존 공통 상수보다 근거가 강하며, 곡별 환산값을 생성할 공식으로 채택할 수 있다.

단, 서비스의 notes 가중치 합을 분모로 그대로 쓰면 안 된다. 비가시 지점을 포함한 환산용 분모는 scoreFormula.perfectNoteWeight로 별도 보관한다. 득점 노트 및 스페셜 시각과 이벤트 계산은 변경하지 않았다.

자료와 재현 방법

  • 연구 문서: https://docs.google.com/document/d/1P1newxmgxS8b-0raHk5vqnbb8X1nXh1xs3d4gYuhUMQ
  • 문서가 제공하는 메타데이터: https://airei.dev/metadata/music_meta.json
  • 메타데이터는 이번 조회에서 HTTP 200으로 접근 가능했다. 원문 775개 레코드 중 서비스 카탈로그 및 실측표에 필요한 389개 레코드의 관련 필드만 song-score-formula-reference.json에 보존했다. 조회 시각·원본 전체 SHA-256도 포함했다.
  • 실측 원본: data/score-calibrations.json. 이 자료는 곡/난이도, 종합력, 가창 보너스, 일반 PERFECT 점수를 제공한다. 플랫폼·전체 플레이 로그·측정 시각은 기록되어 있지 않다.
  • 로컬 HolodoriDB 한국어 원본 origin/main: 1d7c7850bf2df34239c440b5b0cc53bbd72e5d5d.
  • Music.json의 곡별 계수 및 MusicDifficulty.json의 난이도 레벨은 참고 데이터 389개 모두 일치했다. Setting.json의 liveDeckEvaluationCoefficientPermilMultiply는 2300이다.

실행:

node scripts/validate-song-score-formula.mjs

스크립트는 고정 참고 데이터와 현재 저장소를 읽기만 한다. 실측 점수는 BigInt 유리수 연산으로 마지막 올림까지 검증하며, 기존 scoreRatio는 공식 입력으로 사용하지 않는다. 누락된 실측 참고값, 실측 불일치, 카탈로그 난이도 또는 콤보 수 불일치에서는 실패한다. 실측이 없는 카탈로그의 참고 데이터 누락은 별도로 보고한다.

검증 공식

W는 일반 PERFECT=1000 단위의 perfect_note_weight, k는 곡별 liveScoreCoefficientPermil, L은 난이도 레벨이다.

C = 2.3 × (1 + k/1000 × (L − 5))
scoreRatio = (W/1000) / C
일반 PERFECT 점수 = ceil(종합력 / scoreRatio × (1 + 가창 보너스/100))

실측 조건은 콤보·스킬 배율이 없는 일반 PERFECT 기본 점수로 해석한다. 기존 실측 검산도 같은 전제를 사용한다.

올림된 점수 S로부터 ratio는 단일 값으로 결정되지 않는다. A=종합력×가창배율이면 가능한 구간은 [A/S, A/(S−1))다. 모든 실측에서 연구식의 ratio가 이 구간 안에 들었으며, 같은 채보에 여러 측정이 있으면 모두 충족했다. 기존 보정 ratio와 연구 ratio가 소수점까지 같을 필요는 없다.

전체 실측 결과

곡 난이도 실측 점수 연구식
Our Promise Easy 6,571 6,571
Our Promise Normal 4,091 4,091
Our Promise Hard 2,295 2,295
Our Promise Expert 1,455 1,455
PSYCHO Hard 2,023 2,023
PSYCHO Expert, 가창 10% 1,203 1,203
PSYCHO Expert, 가창 8.26% 1,184 1,184
Los! Los! Los! Hard 1,633 1,633
Los! Los! Los! Expert 1,008 1,008
Erandekurete Arigatou Expert 1,742 1,742
Bling-Bang-Bang-Born Expert 998 998
ALiCE&u Expert 980 980
Ahoy!! We are Houshou Pirates Expert 1,128 1,128
Alien Alien Expert 761 761
Asuenokyokaisen Expert 1,014 1,014
Boom! Boom! Tropica Vacation Expert 937 937
UNDEAD Expert 1,113 1,113
Zenryoku-Jumping! Expert 1,671 1,671
NAKAMAKA Expert 841 841

원인: 점수를 받는 노트와 환산 분모의 차이

아래는 일반 노트=1로 정규화한 값이다.

채보 현재 notes 가중치 합 참고 playable 가중치 (base_weight) 참고 환산 분모 (perfect_note_weight)
Our Promise Expert 632.05 632.05 633.95
PSYCHO Expert 766.25 763.55 786.55
Boom! Boom! Tropica Vacation Expert 801.75 798.55 839.95

Our Promise는 playable 집계가 같아도 분모가 1.9 크다. 따라서 현재 노트 분류만 정리한다고 해결되지 않는다. 연구 문서는 비가시 릴레이·베지어 지점에도 분모 가중치를 부여한다고 설명하며, 참고 메타데이터의 perfect_note_weight − base_weight는 그 설명과 부합한다. 이번에는 SUS 원문을 독립 파싱해 비가시 지점 개수를 재구성하지는 않았다.

PSYCHO 등에는 현재 notes와 참고 playable 집계 사이에도 차이가 있다. 비가시 분모 누락 외에 홀드·릴레이·끝 플릭 분류의 차이가 추가로 존재한다. 이 차이의 개별 노트 원인은 이번 검증에서 확정하지 않았다. 실제 노트 점수 및 전체 곡 점수 정확성은 별도 점검이 필요하다.

예를 들어 Boom! Boom! Tropica Vacation Expert는 종합력 296,408, 가창 0%, k=7, L=27이다.

현재 notes 합을 분모로 사용: ceil(296408 × 2.6542 / 801.75) = 982
참고 환산 분모 사용:        ceil(296408 × 2.6542 / 839.95) = 937
실측:                                                       937

환산 분모를 늘리기 위해 비가시 노트를 서비스의 득점·콤보 배열에 추가해서는 안 된다. 분모 전용 필드로 보관해야 한다.

서비스 전체 범위 비교

현재 카탈로그 388개 중 참고 데이터가 있는 것은 387개다. 이들 모두 난이도 레벨 및 로컬 노트 수와 참고 full-combo 수가 일치한다. 같은 노트 수가 같은 노트 분류·가중치를 보장하지는 않는다.

  • 실측 보정 채보: 16개. 올림 전 기본 점수의 연구식 대비 평균 절대 차이 0.0432%, 최대 0.0772%. 위 실측 점수는 기존 보정과 연구식 모두 재현한다.
  • 공통 상수 추정 채보: 371개. 연구식 대비 평균 절대 차이 3.9301%. 절대 차이 5% 초과 114개, 10% 초과 15개.
  • KINGWORLD Expert: 현재 기본 점수가 연구식보다 21.8420% 낮음.
  • Excuse My Rudeness, But Could You Please RIP? Expert: 현재 기본 점수가 연구식보다 13.9990% 높음.
  • 참고 데이터 누락: m0341.expert. 현재 추정 채보 372개 중 하나다.

위 백분율은 (현재 올림 전 기본 점수 / 연구식 기본 점수 − 1) × 100이다. 실측하지 않은 채보의 수치는 두 모델 간 차이이며, 실제 게임 오차율로 검증한 값은 아니다. 카탈로그 포함 전체를 집계했으며 공개 시각에 따른 필터는 적용하지 않았다.

적용 시 경계와 남은 검증

  1. 곡별 계수·난이도·독립적인 PERFECT 분모를 보존하고 공식으로 ratio를 생성한다. 서비스의 종합력 / scoreRatio 인터페이스는 유지 가능하다.
  2. 실측값은 회귀 검증 기준으로 유지한다. 현재 보정값과 연구 ratio의 작은 차이는 올림된 1노트 점수만으로는 우열을 판별할 수 없다.
  3. 참고 데이터가 없는 m0341 Expert는 분모를 별도 확보하거나 기존 추정과 구분하여 유지해야 한다.
  4. 실제 총점까지 검증됐다고 표시하지 않는다. 이번 증거는 일반 PERFECT 1노트 19건이며 스킬, 콤보, PC/모바일 차이, 홀드 중간 올림을 검증하지 않았다.
  5. 참고 메타데이터 제공자와 연구 문서는 같은 출처 계열이므로, 완전히 독립적인 두 연구의 교차 검증으로 보지 않는다. 독립적인 대조 기준은 저장소에 이미 있던 실측 점수다.

실행 확인

  • 신규 검증 스크립트: 19/19 정확 일치.
  • 기존 npm run data:validate-score-calibrations: 18개 보정 항목 통과.
  • npm run check: 오류 0, 경고 0.
  • npm run build: 온라인 빌드 확인.

최초 검증 단계에서는 사용자 동작을 변경하지 않았다. 후속 공식 적용은 UPDATES.md에 기록했다. 기존 작업 중인 다른 변경은 보존했다.