プロジェクト

全般

プロフィール

機能 #366

完了

機能 #340: [Phase 1] 非依存コア(パーサ/スキンIR/DB/タイミング)

ferrhythm-chart: ノーツレーダー(チャート解析指標)計算

機能 #366: ferrhythm-chart: ノーツレーダー(チャート解析指標)計算

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

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

100%

予定工数:

説明

目的

選曲画面/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)

関連

  • #367 にブロックされる(parser 忠実化が先行)。
  • #368 に先行(計算出力を #368 の DB へ格納)。
  • #352 で格納先の nullable 列を先行用意(ただし #368 で beatoraja 互換スキーマへ置換予定)。

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

次のチケットに後続 Ferrhythm - 機能 #367: ferrhythm-chart: beatoraja BMSModel 忠実化(#SCROLL/TOTAL解決/LNMODE 等・レーダー数値互換の前提)完了いづ さん2026/06/21

操作
次のチケットに先行 Ferrhythm - 機能 #368: ferrhythm-db: beatoraja songdata.db スキーマ完全互換化(folder/song/information・feature_* 全列)完了いづ さん2026/06/232026/06/23

操作

いづ さん さんが15日前に更新 · 編集済み 操作 #1

https://gitlab.izu-san.com/games/beatoraja
このリポジトリ内にレーダー計算関連のソースコードがある

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

参考実装メモ(beatoraja 解析ソース)

ローカルに beatoraja ソースを配置済み: /workspaces/beatoraja

  • レーダー6主軸の定義: src/bms/player/beatoraja/PlayerNotesRadarAxis.javaNOTES / 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.javaSongInformationAccessor.javainformation テーブル(n/ln/s/ls/total/density/peakdensity/enddensity/mainbpm/distribution/speedchange/lanenotes)。#352 で song_analysis テーブルとして格納先を先行作成済み(全列 nullable・本チケットで値を投入)。
  • 注: /workspaces/beatorajasong テーブルは本家を大幅拡張したフォークで多数の 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-chartChart から純関数でこれらを算出し #352 の格納先へ書き込む。

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

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

  • 期日2026/06/22 にセット
  • 開始日2026/06/21 から 2026/06/22 に変更
  • 次のチケットに後続 機能 #367: ferrhythm-chart: beatoraja BMSModel 忠実化(#SCROLL/TOTAL解決/LNMODE 等・レーダー数値互換の前提) を追加

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

  • 次のチケットに先行 機能 #368: ferrhythm-db: beatoraja songdata.db スキーマ完全互換化(folder/song/information・feature_* 全列) を追加

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

  • 説明 を更新 (差分)
  • ステータス実装中 から 設計中 に変更

再スコープ(2026-06-21)

ユーザ要件「beatoraja songdata.db と完全互換(フォーク)」に伴い、作業を3チケットに分割しました。

  • #367(新規・前提): ferrhythm-chart parser を 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日前に更新 操作 #7

  • ステータス設計中 から 実装中 に変更

実装に着手しました。

  • ブランチ: feature/366-notes-radar
  • 対応方針: #367(parser忠実化)完了によりブロック解除。ferrhythm-chart に純関数 analysis モジュールを新設し、jbms bms.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日前に更新 操作 #8

  • ステータス実装中 から 完了 に変更
  • 進捗率10 から 100 に変更

対応が完了しました。

概要

選曲画面 / IR 連携用のノーツレーダー(譜面解析指標)を beatoraja フォーク(NotesRadarCalculator / SongInformation)から ferrhythm-chart へ純関数として忠実移植。Chart から構造化データを返すのみで DB 写像は #368 スコープ。

変更点

  • ferrhythm-chart::analysis モジュール新設(3 層): jbms TimeLine 相当の抽象行モデル / 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-chartferrhythm-timing 依存追加
  • 変更ファイル: crates/ferrhythm-chart/src/analysis/mod.rs(新規)・bms.rsmodel.rsbmson.rslib.rsCargo.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

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