機能 #315
完了ノーツレーダー細分化 Phase 2: B分類(パターン認識)サブ軸の新規解析実装
説明
目的¶
#313 で確定した細分化データモデル設計(docs/notes-radar-subdivision-design.md)の Phase 2。NotesRadarCalculator.collectMetrics に per-lane 音符時系列・間隔ヒストグラムを導入し、横方向のパターン認識軸を新規解析で算出する。
親設計: #313。前提: Phase 1 (#314) の伝送・保持・集計縦串。
スコープ(B分類サブ軸)¶
-
PATTERN(新規親):
pattern_randa(乱打)/pattern_jack(縦連)/pattern_trill(トリル)/pattern_kaidan(階段) -
CHORD パターン:
chord_gachioshi(ガチ押し)/chord_denim(デニム)/chord_jika(軸) -
SCRATCH 細分:
scratch_single(単皿)/scratch_ren(連皿)/scratch_complex(皿複合) -
RHYTHM(新規親):
rhythm_24th/rhythm_henpyoshi(変拍子)/rhythm_irregular(不規則間隔) -
NOTES:
notes_density_peak_10s/notes_endgame(終盤)
新規パターン解析プリミティブ(設計 §5)¶
collectMetrics の既存1回走査に同居(追加走査なし、O(notes))。ChartMetrics に per-lane 状態を追加:
-
lastNoteTimeByLane[]/lastScratchTimeByLane[]/ 直近音符 lane 列(K=8 リング)/lastAnyNoteTime/ グローバル間隔ヒストグラム / パターンカウンタ / 10s ピーク Deque(既存 addPeakEvent と同型)。 - 音符ごと:
gap = time - lastNoteTimeByLane[lane]でジャック、直近2音符 lane で階段(単調±1)/トリル(A-B-A)、低同時押し×散らばりで乱打。 - 皿:
lastScratchTimeByLane間隔で連皿/単皿、皿 TL 前後窓の鍵盤で皿複合。 - リズム: 各 TL の BPM から拍長 → 4/8/12/16/24分グリッド命中・off-grid率・エントロピー。
暫定閾値(実データで再調整)¶
jack/trill ≤110ms, stair ≤130ms, 連皿境界180ms, 皿複合窓±250ms, デニム gap≤130ms, ガチ押し size≥4, off-grid 15%, 終盤末尾20%, 10s窓。
本体側の変更接点¶
Phase 1 と同じ縦串(feature/calculator/dto/handler/sqlite/ir)。差分は collectMetrics への per-lane 状態・ヒストグラム・パターンカウンタ追加と、各サブ軸 raw 算出。パターン軸を本体で 0–200 化する場合は anchor 定数を追加(数値は実データ後決め、暫定線形)。
plugin / server 側の責務¶
新 axis_key を EAV に追加保持・集計。新パターン軸の 0–200 anchor テーブルを実データ分布から確定。
テスト方針¶
NotesRadarCalculatorTest を手組み TimeLine で拡張: ジャック/トリル/階段/乱打/連皿/単皿/皿複合/リズム/終盤 の各パターンを既知譜面で計上・境界検証(閾値直上/直下の ON/OFF)、既存6軸値の不変(回帰)。
未解決(実データ後決め)¶
全パターン軸の 0–200 anchor、閾値を固定msかBPM相対か、乱打エントロピー閾値・窓K、皿複合窓と重み、デニム/ガチ押しsize閾値、リズムoff-grid許容、パターン軸rawを本体正規化かserver正規化かの責務分界。
エージェント ちゃん さんが17日前に更新
- 期日 を 2026/06/23 にセット
- 開始日 を 2026/06/19 から 2026/06/23 に変更
- 次のチケットに後続 機能 #314: ノーツレーダー細分化 Phase 1: A分類サブ軸の露出・IR伝送・EAV保持・集計 を追加
エージェント ちゃん さんが17日前に更新
- ステータス を 未着手 から 実装中 に変更
- 進捗率 を 0 から 10 に変更
実装に着手しました。
- ブランチ:
feature/315 - 対応方針: #313 設計 §5 の per-lane 音符時系列・間隔ヒストグラムを既存
collectMetrics単一走査(O(notes))に同居させ、B分類サブ軸15個を raw 値でNotesRadarFeature末尾に追加。Phase 1 と同型の縦串(calculator/feature/dto/handler/sqlite/ir)で伝送・保持。0–200 anchor 正規化は実データ後決めのため本フェーズでは行わず raw のみ送出(Phase 1 踏襲)。
エージェント ちゃん さんが17日前に更新
- 次のチケットに先行 機能 #316: ノーツレーダー細分化 Phase 3: B分類パターン軸の 0–200 anchor 実データ較正と本体正規化 を追加
エージェント ちゃん さんが17日前に更新
- ステータス を 実装中 から 完了 に変更
- 進捗率 を 10 から 100 に変更
対応が完了しました。
概要¶
ノーツレーダー細分化 Phase 2(#313 設計 §5)。NotesRadarCalculator.collectMetrics の既存シングル走査内(追加パスなし・O(notes))に per-lane 音符時系列・間隔ヒストグラム・10秒ピーク窓を導入し、B分類パターン認識サブ軸15個を raw 値で算出。Phase 1 (#314) と同型の縦串で伝送・保持。
変更点¶
-
NotesRadarFeatureレコードに15サブ軸を末尾追加(39→54)。既存6主軸 + 33 raw は不変=後方互換。 - 追加サブ軸: notes_density_peak_10s / notes_endgame / pattern_jack / pattern_trill / pattern_kaidan / pattern_randa / chord_gachioshi / chord_denim / chord_jika / scratch_single / scratch_ren / scratch_complex / rhythm_24th / rhythm_henpyoshi / rhythm_irregular。
- 鍵盤パターン状態と皿状態を分離、全音符共通
lastAnyNoteTimeでリズム/乱打間隔を算出。変拍子は小節線 rate の変動係数。暫定閾値を定数化(設計 §5)。 - 変更ファイル:
NotesRadarCalculator.java/NotesRadarFeature.java/SongDataDto.java/SongDataResultSetHandler.java/SQLiteSongDatabaseAccessor.java/IRChartData.javaほかテスト3件(計9件)。
テスト¶
-
xvfb-run -a ./gradlew test: 成功(1061件成功 / 失敗0 / エラー0 / 既存スキップ10)
関連 MR¶
- !69 (feature/315 → develop)
残課題 / 補足¶
- 0–200 anchor 実データ較正と本体正規化は後続 #316(Phase 3)で対応。本チケットは raw 送出まで。