/inf_daken_counter_obsw

INFINITAS打鍵カウンタの開発用 for Developing INFINITAS_daken_counter

Primary LanguagePythonApache License 2.0Apache-2.0

INFINITAS打鍵カウンタ(OBS websocket版)

beatmania IIDX INFINITAS専用の打鍵カウンタです。

SP,DPのどちらにも対応しています。
リアルタイム判定内訳表示の部分を逐次スキャンし、叩いたノーツ数を算出します。
その日の各判定(ピカグレ、黄グレ、…)の合計値も表示します。
(画面の情報を画像処理によって取得しているのみで、リバースエンジニアリングの類ではありません)

その日に打鍵したノーツ数をTwitterに投稿するための機能も備えています。

また、HTMLでリアルタイム表示するためのIFを備えており、OBS配信でも使いやすくなっています。

主な機能はこちらの動画で紹介しています。
https://www.youtube.com/watch?v=1LSqYLQKDjU

動作環境

下記の環境で確認しています。

OS: Windows10 64bit(22H2)
CPU: Intel系(i7-12700F)
GPU: NVIDIA系(RTX3050)
ウイルス対策ソフト: Windows Defender
OBS: 29.1.2

注意点

  • OBS28.0以降でないと動きません。OBS27以前を使いたい方は、前のバージョンをお使いください。
  • 32bitOSでは動作しません。
  • プレー設定(Start->E2)の「判定の数リアルタイム表示」を有効にしないと動きません
  • INFINITAS用PCから配信用PCにキャプチャボード経由で映像を送る構成では動きません。
  • プレーログの保存は打鍵カウンタ終了時に行います。起動したままだとスコアビューワに反映できません。

本ツールのメリット

SP,DPの両方に対応

本ツールはDPでも使えます。
また、1P/2P/DPを自動判別する仕様のため、1日にSP/DPを両方やる人にも対応できます。
あと、Double Battle系オプション(DBR,DBM,...)にも対応しています。

曲中以外(選曲画面など)での打鍵をカウントしない

選曲画面で迷子になる人や空打ちの多い人も安心です。

OBSでの配信で使いやすい

OBSのブラウザソースで読み込めるhtmlを同梱しているため、配信のたびに適切な位置にウィンドウを移動する作業が不要です。
(INFINITASで使っているモニタ内にあるウィンドウはOBSで拾えない)

また、HTMLなので表示部分の見た目をCSSによって自由にカスタマイズできます。

ファイル一覧

ファイル名 説明
notes_counter.exe ツール本体
manage_score.exe スコアビューワ
layout\autoload.html OBSで読み込むノーツ数表示用HTMLファイル
layout\basetitle.html OBSで読み込む配信のタイトル名表示用HTMLファイル
layout\gauge.html OBSで読み込むグルーブゲージ情報表示用HTMLファイル
layout\graph.html OBSで読み込むノーツ数リアルタイム表示用HTMLファイル
layout\history_cursong.html OBSで読み込む単曲プレー履歴の一覧表示用HTMLファイル
layout\inf_today_stats.html OBSで読み込む1日の統計情報表示用HTMLファイル
layout\judge.html OBSで読み込む判定内訳表示用HTMLファイル
layout\option.html OBSで読み込むオプション表示用HTMLファイル
layout\series.html OBSで読み込む配信のシリーズ名(第N回の部分)表示用HTMLファイル
layout\today_result.html OBSで読み込む本日の成果一覧表示用HTMLファイル
layout\*.png 各種判定処理に必要な画像ファイル
resources\ 曲名認識(OCR)機能のために必要な外部入力ファイル
noteslist.pkl 全収録曲のノーツ数一覧が記録されたファイル。
alllog.pkl 自動生成される全打鍵ログの保存用ファイル
dakenlog.pkl 自動生成される過去に起動した日に叩いたノーツ数の情報
*.xml 自動生成される各種データ表示用ファイル。layout内のHTMLファイルから使う。
dbg.log デバッグ用データ
settings.json ツール本体の設定ファイル。
README.txt 説明書
LICENSE ライセンス情報

インストール方法

打鍵カウンタのインストール

リリースページから最新版のinf_daken_counter.zipをダウンロードし、好きなフォルダに解凍してください。
アップデートする場合は、古いバージョンのフォルダを最新版のファイルで上書きしてください。
(settings.jsonを新バージョンのフォルダに移行するだけでもOK)

OBSwebsocketのインストール

OBSwebsocketをインストールしておいてください。
5.0のアルファ版は不安定らしいので、4.9系を推奨します。(2023/3/16時点)
~~Windows-Installer.exeと書いてあるファイルをダウンロードして実行します。
インストール後にOBSを再起動すると、メニューバー内ツールの中にobs-websocket設定が出てきます。

OBSのメニューバー内ツール -> obs-websocket設定 を開き、

  • WebSocketサーバを有効にする にチェック
  • システムトレイアラートを有効にする にチェック
  • サーバーパスワードを好きな文字列に変更(打鍵カウンタにも入力するので忘れないように注意)

しておいてください。
image

打鍵カウンタの設定

in_daken_counter内のnotes_counter.exeを実行します。
メニューバー内ファイル -> 設定 を開きます。

OBSwebsocket関連の情報を入力してください。

  • OBS hostは基本的にlocalhostで良いはずですが、環境に応じてローカルIPアドレスを設定してください。
  • OBS websocket portはOBS側と同一の値に設定してください。(OBS側を変更していなければ4444)
  • OBS websocket passwordはOBS側で設定したサーバーパスワードと同一のものを入力してください。
  • INFINITAS用ソース名にはOBS側でINFINITASの画面を取り込んでいるゲームキャプチャソースの名前を入力してください。 image

参考までに、作者がINFINITAS用に使っているゲームキャプチャソースの設定も載せておきます。
(INFINITASという名前にしています)
image

正しく設定できていれば、打鍵カウンタの設定画面を閉じた時に以下のような接続通知が出ます。
image

websocket設定及びINFINITAS用ソース名が正しく設定されていれば、
saveボタン(またはF6)を押した時にキャプチャ画像の保存が行われます。 うまく動かない場合は確認してみてください。
(プレーオプション画面を開いて、乱・ミラーなどのオプション情報が正しく取得できることを確認する、の方が早いかもしれません)

使い方

  1. OBSを起動する。
  2. notes_counter.exeを起動する。
  3. startをクリックする。(起動時に即startにチェックすると、次回以降はスキップ可能)
  4. INFINITASをプレーする。

resetをクリックするとカウンタ(プレー回数・ノーツ数・各判定値)をリセットできます。
また、start時にresetにチェックしておくと、start後にカウンタを自動でリセットします。
(resetを押しても即座に設定ファイルから消えるようにはしていません。間違えて押してしまった場合は、すぐにnotes_counter.exeを終了すればカウント値を元に戻せます。)
image

tweetをクリックすると、その時点でのプレー曲数・ノーツ数をTwitterに投稿できます。
(ブラウザが開きます) image

リザルトの自動保存

v.2.0.2以降でランプ・スコア等の更新時にリザルト画像を自動保存する機能を追加しました。

設定画面にてリザルト自動保存先フォルダを設定した上で、
自動保存を実行する条件を指定してください。(デフォルトでは全てオフにしています)
image

リザルト自動保存機能の注意点

DB系(DBMやDBRなど)の使用時には自己べストが残らないため、
ランプやスコアの更新を自動保存のトリガにすることができません。
そのため、DB用の設定を用意しています。

H乱使用時にもDB系と同様の問題がありますが、 この場合ランプを狙うゲームではない気がするので、
H乱については更新に関係なく常時保存する有効時以外は自動保存しない仕様としています。

DJ Levelやスコアの更新時に保存する設定では、
途中落ちスコアが保存される場合もあるのでご注意ください。

プレーログ表示機能(OBS連携)

v.2.0.8以降で以下のようにプレーログを表示する機能を追加しました。

  • リザルト画面でその曲のプレー履歴を一覧表示
  • 選曲画面でその日の更新履歴を一覧表示 image image

リザルト画面の認識処理については、
inf-notebookのrecog.py周りを使わせていただいています。(わるとさんに感謝!)
https://github.com/kaktuswald/inf-notebook

設定方法は後述

打鍵ログ画像生成機能

v.2.0.5以降で1日に叩いたノーツ数のログを保存し、ログを元に以下のようなグラフを作成する機能を追加しました。
log_2023-04-05_2023-04-11

ファイル -> グラフ作成から以下の管理画面が開きます。
image

直近7日今月を押すと、それぞれ対応する期間の集計を行い、ツイート画面を開きます。
また、inf_daken_counterのフォルダ内に作成したグラフが保存されます。 image

注意
その日のノーツ数ログの保存のタイミングはnotes_counter.exe終了時となっています。
プレー後すぐにグラフを作成したい場合は一度アプリを終了してから作成してください。

カレンダービューにおいて、*がついている日は打鍵ログが保存されている日となります。
左上のラジオボタンから、編集モード及び範囲選択モードが選べます。

編集モード

カレンダービューから日付を1日だけ選択し、打鍵ログの修正が行なえるモードです。

  1. 日付を選択すると、その日の打鍵ログの一覧が右側のリストボックスに表示されます。
  2. 不要なデータがある場合は、リストボックス上で選択して削除を押すと削除できます。
  3. その日のデータを全てまとめてもよい場合にはマージを押すと合算して1つのデータにまとめます。
  4. 保存を押すと編集した結果を保存します。

注意点ですが、1日の打鍵ログが複数ある場合、グラフ生成時には1番上のデータしか使われません。
複数のデータがある場合はマージを推奨します。

範囲選択モード

カレンダービューから打鍵ログ集計の開始日・終了日を選択するモードです。

  1. 左上のラジオボタンから範囲選択モードに切り替える。
  2. カレンダービュー上で開始日にしたい日をクリックする。
  3. カレンダービュー上で終了日にしたい日をクリックする。(選択した範囲が緑色に変わります)
  4. グラフ生成を押すと、選択した範囲の集計結果のグラフ画像が保存され、ツイート画面が開きます。

スコアビューワ機能

v.2.0.11より、打鍵カウンタ上のスコアを一覧表示できるようになりました。
同梱のmanage_score.exeを実行することで、以下のようなウィンドウが表示されます。
本ビューワの主な機能は以下。

  • 打鍵カウンタのログ(alllog.pkl)に残っている各曲の自己べスト(クリアランプ、スコア、BP)を一覧表示
  • 検索ワードによる表示する曲のフィルタリング
  • 全ログのCSV出力 image

出力するCSVファイルでは、SP, DP, DoubleBattleの順に全データが並びます。
Double Battleについては、譜面難易度の部分がDBHDBAのような表記となります。

OBSソース制御機能(new)

v.2.0.17より、OBSソースを自由に制御する機能を追加しました。
選曲画面、プレー画面、リザルト画面(、及び打鍵カウンタの起動・終了時)において、
好きなソースの表示・非表示や、シーンの切り替えを行うことができます。

この機能により、

  • 曲プレー中のみ手元カメラを表示
  • リザルト画面で統計情報(history_cursong.html)を表示
  • 打鍵カウンタ起動時にノーツ数とプレーオプションを表示→終了時に非表示 といった制御がOBSのスイッチャーを使わなくてもできるようになります。

OBSへの設定方法

プレーログ表示の設定方法

v.2.0.18以降で設定方法が変わっています。
表示するだけなら1.だけでもできます。自動で表示・非表示制御をする場合は2.以降が必要となります。

  1. 同梱のlayout\history_cursong.htmllayout\today_result.htmlをOBSへブラウザソースとして追加する。
  2. ファイル->OBS制御設定を開く
  3. 各画面で使うシーン名を画面上部のリストボックスから選択し、setボタンで設定する。
  4. 2.のブラウザソースの名前がHTMLファイル名と一致するように変更する。
  5. 必要に応じてブラウザソースをダブルクリックし、幅・高さを設定する。 以下の設定でちょうどよく見えるように調整しています。
  • today_result.html(名前:today_result)は幅1800, 高さ960
  • history_cursong.html(名前:history_cursong)は幅2600, 高さ1400

各HTMLのソース名については、好きな名前に設定してそのソースに対する表示・非表示設定を自分で登録してもよいです。デフォルトではtoday_result, history_cursongとして登録しています。

高さは大きめにしておいて、Alt+ドラッグでトリミングしてもいいかもしれません。その辺はお好みで。

3.を行わないと、プレー中に自動でこれらのビューの表示・非表示を切り替える機能が動かないので注意です。 image image image

その日のログ表示ビュー(today_result)に表示する曲数はHTML側で変更できます。
index==XとするとX+1曲分表示されます。

    if (index == 29){ // 直近の30曲だけ表示としている。曲数はここから変更可能。
        return false;
    }

編集後はブラウザソースをダブルクリック→現在のページのキャッシュを更新 で即反映できます。

その日のログ表示ビュー(today_result)に反映するための条件を設定画面から変更できます。
本日の履歴の更新: 更新時のみとすると、ランプorスコア更新の場合のみ載るようになります。
(内部的には全リザルトを保存しています) image

また、保存したリザルト画像からスコアデータに反映するボタンを押すと、
リザルト画像の自動保存先フォルダにあるINFINITASのリザルト画像から プレー日、スコア、ランプなどを抽出して保存することができます。
フォルダ内に保存された画像の枚数によってはかなり時間がかかるので注意です。
プレー履歴の情報はalllog.pklに保存されるため、このボタンは一度押すだけでよいです。(2回以上押しても日付が同じリザルトは登録しない)

プレーログ表示のレイアウトはそれなりに調整していますが、
HTMLやCSSを編集することでカスタマイズも可能です。(webデザインに詳しい人向け)

ノーツ数グラフの表示方法

  1. ソースの追加 -> ブラウザを選択する。好きな名前を付けてOK。
    image
  2. 1.で作成したブラウザソースをダブルクリックする。
  3. ローカルファイルのチェックを入れ、同梱のlayout\graph.htmlを選択する。
  4. 画面の大きさは幅800、高さ400ぐらいに設定する。(Alt+ドラッグでトリミングできるので小さすぎなければ適当で良いです)
  5. 背景に色を付ける場合は以下のようなカスタムCSSを設定する。(graph.htmlのみOBS側での設定が必要。他はHTML内の変更でもOK。)
body { background-color: rgba(0, 0, 0, 0.8); margin: 0px auto; overflow: hidden; }

PG,GR,GDのノーツ数が逐次更新されていきます。

image

プレーオプションの表示方法

v.2.0.18で方式が変わっています。
(option.htmlを使う前の方式も変わらず動きますが、設定はinfdc_optの方が楽です)

  1. ソースを追加->テキスト(GDI+)でテキストソースを追加する
  2. 追加されたソースを右クリック->名前を変更でソースの名前をinfdc_optに変更する。
  3. infdc_optの見た目をカスタマイズする

ちなみに、名前をinfdc_opt_dynとするとプレー中のみ表示されます。

image

グルーブゲージ情報の表示方法

グルーブゲージ種別(EX-HARDとかEASYとか)を表示するためのlayout\gauge.htmlも同梱しています。
取得タイミングはプレーオプションと同時(約0.5s必要)なので、切り替えが速すぎると取得漏れする場合があります。

また、曲中だけオプションを表示するための<normal_dyn>などのタグも用意しています。
(layout\gauge.html内でコメントアウトしています) 必要に応じてHTMLを編集して使ってください。

1日の統計情報ビューの表示方法

  1. ソースの追加 -> ブラウザを選択する。好きな名前を付けてOKを押す。
  2. 1で作成したブラウザソースをダブルクリックする。
  3. ローカルファイルのチェックを入れ、同梱のlayout\inf_today_stats.htmlを選択する。
  4. 画面の大きさは幅4000、高さ3000に設定する。

image

履歴ビューのような表示のon/off制御は行っていないため、
現状は以下のようにホットキー経由での表示on/offを前提としています。
(適切な自動表示タイミングを見つけられていません。。)

OBSの設定->ホットキーで作成したブラウザソースの項目を見つけて
表示、非表示の両方にキー設定をすれば切替可能となります。
以下の画像では、inf_today_stats.htmlをCtrl+Shift+7で切り替え可能としています。 image

配信タイトル内のシリーズ文字列の表示方法

第237回のような文字列を配信タイトルから抽出して表示するlayout\series.html及び、
九段たぬきのDP配信のような固定のタイトル部分を抽出するlayout\basetitle.htmlも同梱しています。
下記画像の赤枠で囲んだ領域を自動で更新してくれる感じのやつです。 image

配信を行う度に、以下のようにURLを取り込む必要があります。

  1. ファイル -> 配信を告知する を押して配信準備用ウィンドウを開く
  2. YoutubeLiveのURLを入力する
  3. タイトル文字列に応じて検索クエリを設定する。
    (例えば、九段たぬきのINFINITAS DP配信 #85 のようなタイトルの場合、#[number]と設定)
  4. goボタンをクリック(または入力欄でEnterキーを押す)
  5. ブラウザにて配信情報をツイートするための画面が表示されます。また、アプリ上にOBSで使うコメント欄用のURLが表示されます。

image image

あとは、OBSのブラウザソースでseries.html, basetitle.htmlを取り込んでおいてください。

OBSソース・シーンの制御設定(new)

ファイル->OBS制御設定を開くと、以下のような設定画面が表示されます。

image

画面上部のリストボックスからシーン・ソースを選択して、
各リスト下部にあるaddボタンを押すと追加できます。

各シーン(選曲画面、プレー中、リザルト画面)での設定は以下のようになっています。

  • シーン: その画面に入った時にシーンを切り替えたい場合に設定
  • 開始時: その画面に入った時に表示・非表示するソースを設定
  • 終了時: その画面から抜ける場合に表示・非表示するソースを設定
  • 各リストについて、登録したものを削除したい場合は選択してdelボタンを押すことで消せます

例えばプレー画面(プレー中)の場合、
選曲を終えてプレー画面に入った時に開始時側の設定を、
プレーを終えて画面が暗転した時に終了時の設定をそれぞれ読み込むようになっています。

また、INFINITASの画面表示用のソースをここから設定することもできます。(INFINITAS画面の部分)
今までのプレーログ用ビューの表示・非表示制御をデフォルトで設定しています。

その他

設定ファイル(settings.json)がない場合は起動時に生成されます。
設定がおかしくなった場合は起動前にsettings.jsonを削除すればリセットできます。

スコア取得開始後はdata.xmlにデータが逐次書き込まれます。

スコア取得間隔はsettings.jsonのsleep_timeから変更可能です(デフォルト:1秒)。
密度の高い曲でクイックリトライした場合は取得が追いつかず、少し低めに出る場合があります。
厳密さを求める方はsleep_timeを小さめに設定してもいいかもしれません。

当分ないと思いますが、プレー画面のレイアウトが変わると使えなくなります。
その際はなるべく早く対応するつもりですが、ベストエフォートな対応となりますことをご了承ください。

ライセンス

Apache License 2.0に準じるものとします。

非営利・営利問わず配信などに使っていただいて問題ありません。
クレジット表記等も特に必要ないですが、書いてもらえたら喜びます。

連絡先

Twitter: @cold_planet_