操作
機能 #314
完了ノーツレーダー細分化 Phase 1: A分類サブ軸の露出・IR伝送・EAV保持・集計
機能 #314:
ノーツレーダー細分化 Phase 1: A分類サブ軸の露出・IR伝送・EAV保持・集計
説明
目的¶
#313 で確定した細分化データモデル設計(docs/notes-radar-subdivision-design.md)の Phase 1。新規パターン解析を伴わず、既に NotesRadarCalculator / NotesRadarFeature が算出済みの A分類サブ軸を新 axis_key として露出し、伝送 → 保持(EAV) → 集計 の縦串を先に通す。
親設計: #313。後続: Phase 2(B分類・新規パターン解析)。
スコープ(A分類サブ軸)¶
-
NOTES:
notes_density_peak_1s(既存peakBurstNotes公開化)/notes_local_hardness(ピーク密度/平均密度比) -
PEAK:
peak_burst_1s/peak_sustained_3s(既存値公開化) -
CHORD:
chord_max_size(maxChordSize公開済) -
SOF-LAN:
soflan_accel/soflan_decel(既存ソフランクラスタを speed 差符号で分離)/soflan_stop(stopCount/soflanStopTimeTotal)/soflan_visual(scrollChangeCount+逆スクロール) -
SCRATCH:
scratch_bss(scratch lane の LongNote 始端。判定が軽微なため Phase 1 に含める)
本体側の変更接点(#313 §7 の縦串・既存29列と同型)¶
-
NotesRadarCalculator.ChartMetrics/calculate(): A分類値の露出(多くは既存値、soflan accel/decel は cluster 生成時に speed 差符号を保持する小改修)。 -
NotesRadarFeature.java: record コンポーネントを末尾追加。EMPTY・互換コンストラクタ・コンパクトコンストラクタを更新。既存6値先頭は不変=後方互換。 -
SongData.java: getter 追加。 -
SongDataDto.java/SongDataResultSetHandler.java(列名存在チェック付き getDouble)。 -
SQLiteSongDatabaseAccessor.java:SONG_COLUMNS/FEATURE_COLUMNS_SQL/ Tablenew Column("feature_xxx","REAL")(自動 ALTER 起点)。INSERT の VALUES プレースホルダ数を SONG_COLUMNS/DTO 順と一致させる。 -
IRChartData.java:values.put("feature_xxx", ...)。現状の「最終6値のみ送信」を「全 feature_ 送信」へ拡張*(server がサブ軸を受け取れる前提)。
plugin / server 側の責務¶
- IR 受信で
feature_*を EAV テーブルsong_chart_feature(song_sha256, axis_key, value, updated_at)に展開保持(axis_key=feature_を除いた名と1:1)。 - 集計(達成率
min(exscore/(notes*2),1.0)重み・軸ごと上位N平均・0〜200 アンカー)を新 axis_key へ拡張。
バックフィル¶
#145 同方式: 楽曲全更新で全譜面再計算 → songdata.db を IR 側へ取り込み。自動 ALTER で旧 DB も列追加、旧値0は全更新で再計算され埋まる。
テスト方針¶
-
NotesRadarCalculatorTest拡張: A分類値の算出・境界、既存6軸値の不変(回帰)、NotesRadarFeature.EMPTY要素数一致、SongDataDtoround-trip 一致、列欠落 DB(旧スキーマ)で getDouble が 0 を返すこと。 -
IRChartDataTest: 新 feature_* キーが values に載ること。
未解決(実データ後決め)¶
- soflan accel/decel/visual の重み配分(既存総合 soflan との二重計上回避係数)。
- 各サブ軸の集計上位N。
- パターン軸ではないため anchor は既存流用 or 比率系はそのまま。
エージェント ちゃん さんが17日前に更新
- 期日 を 2026/06/22 にセット
- 開始日 を 2026/06/19 から 2026/06/22 に変更
- 次のチケットに後続 機能 #313: ノーツレーダー6軸の細分化データモデル設計(弱点分析 #293 の前提整備) を追加
エージェント ちゃん さんが17日前に更新
- 次のチケットに先行 機能 #315: ノーツレーダー細分化 Phase 2: B分類(パターン認識)サブ軸の新規解析実装 を追加
エージェント ちゃん さんが17日前に更新
- ステータス を 未着手 から 実装中 に変更
- 進捗率 を 0 から 10 に変更
実装に着手しました。
- ブランチ:
feature/314 - 対応方針: #313 設計の Phase 1(A分類サブ軸)を本体側に実装。10サブ軸を raw 値・タクソノミー名で
NotesRadarFeature/songdata.dbに専用列として追加(既存6値先頭は不変=後方互換)、IR 伝送を「最終6値のみ」→「全 feature_*」へ拡張。EAV保持・集計は izu-ir 側(本リポジトリ外)のため対象外。
エージェント ちゃん さんが17日前に更新
- ステータス を 実装中 から 完了 に変更
- 進捗率 を 10 から 100 に変更
対応が完了しました。
概要¶
#313 設計の Phase 1。算出済みの A分類サブ軸10種を raw 値・タクソノミー名で NotesRadarFeature / songdata.db に専用列として露出し、IR 伝送を「最終6値のみ」→「全 feature_*(39キー)」へ拡張。既存6値先頭+23 raw 値は不変=後方互換。EAV保持・集計は izu-ir(本リポジトリ外)のためスコープ外。
変更点¶
-
NotesRadarFeatureの record 末尾に10サブ軸を追加(EMPTY・互換コンストラクタ2種・コンパクトコンストラクタ更新)。追加:notes_density_peak_1s/notes_local_hardness/peak_burst_1s/peak_sustained_3s/chord_max_size/soflan_accel/soflan_decel/soflan_stop/soflan_visual/scratch_bss。 -
NotesRadarCalculator:peakBurstNotes公開化、soflan cluster score を speed差符号でイベント数比例分割(accel+decel==clusterScore)、逆スクロール(scroll<0)計数、scratch lane LongNote 始端計数。 -
SongDataDto/SongDataResultSetHandler/SQLiteSongDatabaseAccessor(SONG_COLUMNS・FEATURE_COLUMNS_SQL・Table 自動ALTER)に10列を同順反映。旧スキーマDBは自動ALTER+getDouble既定0で無痛拡張。 -
IRChartData: feature_* を6→全39キー送信へ拡張。 - 変更ファイル: 本体6・テスト3 の計9件。
テスト¶
-
xvfb-run -a ./gradlew test(全スイート): 成功 - 追加: 各サブ軸の算出・境界、soflan accel/decel 分割不変条件、逆スクロール、scratch BSS、既存6軸+23raw値の回帰不変、
SongDataDtoround-trip、旧スキーマDBで getDouble=0、IR 全39キー送信。
関連 MR¶
- !68 (
feature/314→ develop、merge commit6db08830)
残課題 / 補足¶
- anchor正規化・集計上位N・soflan重み配分は設計§8の後決め事項(server / Phase 2 範囲)。
- 実データ反映はバックフィル(楽曲全更新で全譜面再計算→songdata.db を IR 取り込み、#145 同方式)。
- 後続: #315(Phase 2: B分類・新規パターン解析)。
操作