プロジェクト

全般

プロフィール

機能 #356

完了

機能 #343: [Phase 3] クロック/並行モデルと最小プレイアブル

最小プレイアブル(譜面ロード→キー音予約→判定)

機能 #356: 最小プレイアブル(譜面ロード→キー音予約→判定)

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

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

100%

予定工数:

説明

目的

エンジンを End-to-End で繋ぐ最小の遊べるループ。

スコープ

  • 譜面をロードしキー音をサンプル予約
  • キー入力を取得し判定窓で評価、スコア集計
  • (描画は Phase 4 前なのでコンソール/最小表示で可)

検証(Windows ホスト)

具体曲を添えてレイテンシ・判定をホストで確認

担当

Codex 委譲(source-only)、ホスト検証はユーザー

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

  • ステータス未着手 から 実装中 に変更
  • 進捗率0 から 10 に変更

実装に着手しました。

  • ブランチ: feature/356-minimal-playable
  • 対応方針: #355 のクロック/スレッド分離スカフォルド上に、譜面ロード→キー音サンプル予約→入力を判定窓で評価→スコア/ゲージ/ランプ集計、という最小プレイループのプラットフォーム非依存ロジック核を ferrhythm クレートに実装する(実機オーディオ/Raw Input/対話描画は Windows ホスト検証)。

設計方針 : スコープ確定事項

  • 対象モード: 7K / 14K(判定窓が提供される範囲)。他モードは UnsupportedKeyMode
  • 判定対象: 通常ノート+LN(頭+リリース)をフル判定。
  • 地雷(MINE): 衝突検出は gameplay 層でフル実装し、被弾数・即死フラグをリザルトに記録。体力ゲージへの数値ダメージは保留ferrhythm-score は無改変。地雷ダメージ数値モデルは後続チケットで確定)。
  • 成果物: ヘッドレスなロジック核(PlaySession:入力イベント列+クロックtick → 判定 → スコア/ゲージ/ランプ)。実機デバイス/対話ループ/コンソール表示の結線は Windows ホスト検証へ委譲。

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

進捗 : コンソール・プレイ・ハーネスを追加(グラフィック無しでホスト検証可能に)

ロジック核に加え、チケットの「描画は Phase 4 前なのでコンソール/最小表示で可」に沿って、グラフィック無しで Windows ホストで実機検証できるコンソール・ハーネスを追加した。

  • PlaySession をサンプルレート設定可能化(PlayConfig.sample_rate、既定48kHz)。デバイスが非48kHzでも判定が狂わない。
  • crates/ferrhythm/src/harness.rs(新規・プラットフォーム非依存・テスト有): 引数解析(譜面パス / --shared --exclusive / --gauge / --gain)、7K の VK→Lane マッピング。
  • crates/ferrhythm/src/main.rs: #[cfg(windows)] でコンソール・ハーネス本体(WASAPI 起動 → キー音バンクデコード → BGM を1秒プリロールで予約 → Raw Input(message-only window) で押下/離鍵をタイムスタンプ付き取得→レーン判定→押下時キー音即時発音→判定をライブ表示→ESCで PlayResult 表示)。非Windowsはスタブ。

ホスト実行(要グラフィック無し):

cargo run -p ferrhythm --release -- C:\path\to\song.bms
cargo run -p ferrhythm --release -- C:\path\to\song.bms --shared --gauge easy --gain 0.8

7K キー割当: スクラッチ=A、鍵1..7 = S D F Space J K L、終了=ESC。

検証状況: コンテナ(Linux)で cargo fmt/clippy/test(43件)すべて green、Linuxスタブビルド成功。#[cfg(windows)] ハーネス本体はコンテナでコンパイルされないため、Windows ホストでの cargo build と実機での音/判定/レイテンシ確認はユーザー検証が必要。

簡略化(将来課題): 入力タイムスタンプは song 位置で代用(精密な QPC→sample 相関は後続)、キー音発音は更新スレッド経由(poll間隔ぶんの追加レイテンシ)、終了はESCのみ(譜面終端検出は省略)、exclusive 48kHz 推奨。

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

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

対応が完了しました。

概要

#355 のクロック/スレッド分離スカフォルド上に、譜面ロード→キー音サンプル予約 / キー入力→判定窓評価→スコア/ゲージ/クリアランプ集計、という最小プレイループのプラットフォーム非依存ロジック核を実装。あわせて、グラフィック未実装でも Windows ホストで実機検証できるコンソール・プレイ・ハーネスを追加した。

変更点

  • ferrhythm-input: タイムスタンプ付き InputEvent(core Lane への Press/Release + SamplePosition)を追加。
  • ferrhythm (gameplay): timing_map_from_chart(chart→TimingMap)、KeysoundBank/build_bgm_schedule/push_schedule/decode_keysound_bank(BGM をサンプル位置へ予約)、PlaySession(レーン別判定ステートマシン:フル LN=頭/尾の悪い方で確定・早離し崩れ Poor・未リリース尾の自動 Poor、地雷衝突検出=被弾数/即死フラグ記録でゲージ無作用、後期窓自動ミス、空押し時の次ノートキー音返却、7K/14K のみ)、PlayConfig.sample_rate(デバイスレート追従)、crate::Error 拡張。
  • コンソール・ハーネス: harness.rs(引数解析・7K VK→Lane、プラットフォーム非依存・テスト有)+ main.rs#[cfg(windows)] 本体(WASAPI 起動→キー音デコード→BGM を1秒プリロールで予約→Raw Input 判定→押下時キー音即時発音→判定ライブ表示→ESC で PlayResult)。windows = 0.58Win32_Graphics_Gdi 含む)を Windows 専用依存に追加。
  • 変更/新規ファイル: crates/ferrhythm/src/gameplay/{mod,timing,schedule,session}.rs, crates/ferrhythm/src/{harness,main,lib,error}.rs, crates/ferrhythm/Cargo.toml, crates/ferrhythm-input/src/{event,lib}.rs, crates/ferrhythm-input/Cargo.toml ほか(計13ファイル前後)。

テスト

  • cargo test(全ワークスペース): 成功(ferrhythm は 43 件。判定各バンド境界・空押し・自動ミス・LN 頭/尾/崩れ/自動ミス・地雷被弾/即死/非被弾・7K での P2 除外・非対応モード・end-to-end・サンプルレート設定・引数解析・VK→Lane など)
  • cargo clippy --all-targets / cargo fmt --all -- --check: 成功(警告0)
  • Windows ホストでハーネスのビルド+実機動作を確認済み(ユーザー検証)。

関連 MR

  • !19 (feature/356-minimal-playable → develop) — マージ済み

残課題 / 補足

  • 地雷ダメージのゲージ数値モデル、BmsonPercent→判定ランクの確定マッピング、キー音の拡張子フォールバック(.wav↔.ogg)、入力タイムスタンプの QPC→sample 精密相関、キー音の低遅延発音経路、ハーネスの譜面終端検出 は後続課題。

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