機能 #366
完了機能 #340: [Phase 1] 非依存コア(パーサ/スキンIR/DB/タイミング)
ferrhythm-chart: ノーツレーダー(チャート解析指標)計算
説明
目的¶
選曲画面/IR 連携用に、チャートからノーツレーダー(譜面の難易度特性を表す解析指標)を計算する。
方針確定(2026-06-21 ユーザ確認)¶
ユーザ要件「beatoraja songdata.db と完全互換(フォーク)」により、本チケットは計算ロジックに絞り込んだ上で範囲を拡張した。他の作業は #367/#368 に分離。
スコープ¶
-
ferrhythm-chartに純関数の計算モジュールを新設し、beatoraja フォークNotesRadarCalculator.javaの**全feature_*(6主軸+全サブ軸+*_radar)**を忠実移植(較正済みアンカーテーブル含む)。 -
SongInformation.java相当のinformation値(n/ln/s/ls/total/density/peakdensity/enddensity/mainbpm/distribution/speedchange/lanenotes)も忠実算出。 - 純関数として構造化データを返す(DB 写像は #368)。
スコープ外(他チケットへ移動)¶
- DB マッピング/scan 配線 → #368(beatoraja songdata.db スキーマ完全互換化)。
- 数値の bit-exact 互換の前提(#SCROLL/TOTAL解決/LNMODE 等)→ #367。
検証(コンテナ)¶
純関数ロジックの TDD。cargo test グリーン。beatoraja 参照実装(NotesRadarCalculator.java/SongInformation.java)との数値照合。
担当¶
Codex 委譲(source-only)
関連¶
いづ さん さんが15日前に更新
· 編集済み
https://gitlab.izu-san.com/games/beatoraja
このリポジトリ内にレーダー計算関連のソースコードがある
エージェント ちゃん さんが15日前に更新
参考実装メモ(beatoraja 解析ソース)
ローカルに beatoraja ソースを配置済み: /workspaces/beatoraja。
- レーダー6主軸の定義:
src/bms/player/beatoraja/PlayerNotesRadarAxis.java→NOTES / PEAK / SCRATCH / SOF-LAN / CHARGE / CHORD(#352 のsongs.radar_*6列に対応)。 - レーダー計算:
src/bms/player/beatoraja/song/NotesRadarCalculator.java,NotesRadarFeature.java,PlayerNotesRadarState.java。 - サブ軸(楽曲詳細情報)テーブル:
src/bms/player/beatoraja/song/SongInformation.java+SongInformationAccessor.javaのinformationテーブル(n/ln/s/ls/total/density/peakdensity/enddensity/mainbpm/distribution/speedchange/lanenotes)。#352 でsong_analysisテーブルとして格納先を先行作成済み(全列 nullable・本チケットで値を投入)。 - 注:
/workspaces/beatorajaのsongテーブルは本家を大幅拡張したフォークで多数のfeature_*/feature_*_radar(pattern/rhythm 等のサブ軸)列を持つ。本チケットの指標セット・正規化方法は設計時に確定する(まずは PlayerNotesRadarAxis の6主軸+information相当のサブ軸を基線とする)。
#352 側の格納先(実装済み): songs.radar_notes/radar_peak/radar_scratch/radar_soflan/radar_charge/radar_chord(6主軸)+ 別テーブル song_analysis(サブ軸詳細)。本チケットは ferrhythm-chart の Chart から純関数でこれらを算出し #352 の格納先へ書き込む。
エージェント ちゃん さんが15日前に更新
- ステータス を 未着手 から 実装中 に変更
- 進捗率 を 0 から 10 に変更
実装に着手しました。
- ブランチ:
feature/366-notes-radar - 対応方針:
ferrhythm-chartに純関数のradarモジュールを新設し、beatoraja フォーク(NotesRadarCalculator.java)の6主軸アンカー正規化を忠実移植(ferrhythm-timing依存を追加して beat→秒 変換)+information相当サブ軸を算出。#352 のsongs.radar_*/song_analysisへ写像し、差分スキャンの再パース経路へ配線する。TDD でcargo test緑化。
エージェント ちゃん さんが15日前に更新
- 期日 を 2026/06/22 にセット
- 開始日 を 2026/06/21 から 2026/06/22 に変更
- 次のチケットに後続 機能 #367: ferrhythm-chart: beatoraja BMSModel 忠実化(#SCROLL/TOTAL解決/LNMODE 等・レーダー数値互換の前提) を追加
エージェント ちゃん さんが15日前に更新
- 次のチケットに先行 機能 #368: ferrhythm-db: beatoraja songdata.db スキーマ完全互換化(folder/song/information・feature_* 全列) を追加
エージェント ちゃん さんが15日前に更新
- 説明 を更新 (差分)
- ステータス を 実装中 から 設計中 に変更
再スコープ(2026-06-21)
ユーザ要件「beatoraja songdata.db と完全互換(フォーク)」に伴い、作業を3チケットに分割しました。
-
#367(新規・前提):
ferrhythm-chartparser を beatoraja BMSModel に忠実化(#SCROLL/TOTAL解決/LNMODE 等)。本 #366 をブロック。 -
#366(本チケット・再スコープ): 計算のみに絞り、
NotesRadarCalculatorの全feature_*+information値を純関数で算出。DB マッピング/scan 配線は #368 へ移動。 -
#368(新規):
ferrhythm-dbを beatoraja songdata.db スキーマへ完全互換化(#352 自前スキーマを置換)。本 #366 に依存。
依存順: #367 → #366 → #368。まず #367(parser 忠実化)から着手します。本 #366 は #367 完了まで設計中(2)で保留。
エージェント ちゃん さんが15日前に更新
- ステータス を 設計中 から 実装中 に変更
実装に着手しました。
- ブランチ:
feature/366-notes-radar - 対応方針: #367(parser忠実化)完了によりブロック解除。
ferrhythm-chartに純関数analysisモジュールを新設し、jbmsbms.model.TimeLine相当の抽象タイムライン行モデル上にNotesRadarCalculator(全6主軸+全サブ軸+*_radar)とSongInformation相当(n/ln/s/ls/density/peakdensity/enddensity/total/mainbpm/distribution/speedchange/lanenotes)を line-by-line 忠実移植。Chart→行アダプタを追加し、beatoraja の JUnit テストベクタ(NotesRadarCalculatorTest/SongInformationTest)を Rust テストへ直移植して数値照合(許容 1e-4)。DB 写像は #368、bit-exact 前提は #367 のスコープ。
エージェント ちゃん さんが15日前に更新
- ステータス を 実装中 から 完了 に変更
- 進捗率 を 10 から 100 に変更
対応が完了しました。
概要¶
選曲画面 / IR 連携用のノーツレーダー(譜面解析指標)を beatoraja フォーク(NotesRadarCalculator / SongInformation)から ferrhythm-chart へ純関数として忠実移植。Chart から構造化データを返すのみで DB 写像は #368 スコープ。
変更点¶
-
ferrhythm-chart::analysisモジュール新設(3 層): jbmsTimeLine相当の抽象行モデル /calculate_notes_radar(全feature_*= 6 主軸+全サブ軸+*_radar、較正アンカー表逐語) /calculate_song_information(n/ln/s/ls/density/peakdensity/enddensity/total/mainbpm/distribution/speedchange/lanenotes) /analyze_chartアダプタ(jbms レーン番号・LN 始終端合成・getLastTime 忠実な尺長) - パーサ:
Chart.bar_lines公開(rhythm_henpyoshi 用)+跨ぎ小節 LN ペアリング修正(従来は通常ノート 2 個に化けていた既存バグを jbms 同様へ) -
ferrhythm-chartにferrhythm-timing依存追加 - 変更ファイル:
crates/ferrhythm-chart/src/analysis/mod.rs(新規)・bms.rs・model.rs・bmson.rs・lib.rs・Cargo.tomlほか 7 件
テスト¶
-
cargo test: 成功(ワークスペース 202 passed / 0 failed。analysis 74 件=beatoraja JUnit ベクタ 32 本を 1:1 移植+アダプタ/LN/BGM テスト) -
cargo clippy --all-targets/cargo fmt --all -- --check: 成功(0 warnings) - 追加検証: beatoraja フォーク実 DB(76 実譜面)とローカル照合—整数カウント全項目 76/76 完全一致、看板 float 軸(notes_density/duration/chord/scratch_density/soflan/rhythm_henpyoshi/mainbpm)はほぼビット一致。残差は ms 切り捨て由来のみ。
関連 MR¶
- !10 (feature/366-notes-radar → develop)
残課題 / 補足¶
- BMSON の
bar_linesは現状空(最小フォールバック)。BMSON 譜面の rhythm_henpyoshi のみ影響—別チケット化の要否は要判断。 - レーダー値の DB 写像 / scan 配線は #368。