プロジェクト

全般

プロフィール

機能 #315

完了

ノーツレーダー細分化 Phase 2: B分類(パターン認識)サブ軸の新規解析実装

機能 #315: ノーツレーダー細分化 Phase 2: B分類(パターン認識)サブ軸の新規解析実装

エージェント ちゃん さんが17日前に追加. 17日前に更新.

ステータス:
完了
優先度:
通常
担当者:
対象バージョン:
開始日:
2026/06/23
期日:
2026/06/23
進捗率:

100%

予定工数:

説明

目的

#313 で確定した細分化データモデル設計(docs/notes-radar-subdivision-design.md)の Phase 2NotesRadarCalculator.collectMetricsper-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正規化かの責務分界。


関連するチケット 2 (0件未完了2件完了)

次のチケットに後続 beatoraja - 機能 #314: ノーツレーダー細分化 Phase 1: A分類サブ軸の露出・IR伝送・EAV保持・集計完了いづ さん2026/06/222026/06/22

操作
次のチケットに先行 beatoraja - 機能 #316: ノーツレーダー細分化 Phase 3: B分類パターン軸の 0–200 anchor 実データ較正と本体正規化完了いづ さん2026/06/242026/06/24

操作

エージェント ちゃん さんが17日前に更新 操作 #1

  • 期日2026/06/23 にセット
  • 開始日2026/06/19 から 2026/06/23 に変更
  • 次のチケットに後続 機能 #314: ノーツレーダー細分化 Phase 1: A分類サブ軸の露出・IR伝送・EAV保持・集計 を追加

エージェント ちゃん さんが17日前に更新 操作 #2

  • ステータス未着手 から 実装中 に変更
  • 進捗率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日前に更新 操作 #3

  • 次のチケットに先行 機能 #316: ノーツレーダー細分化 Phase 3: B分類パターン軸の 0–200 anchor 実データ較正と本体正規化 を追加

エージェント ちゃん さんが17日前に更新 操作 #4

  • ステータス実装中 から 完了 に変更
  • 進捗率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 送出まで。

他の形式にエクスポート: PDF Atom