痛いOTAKUのポエム

地雷多すぎ人間の愚痴

特殊なコントローラとStepManiaを用いたPS1・2コントローラのコンバータの評価(方法説明用の記事)

なにこれ

後でいろんなPS1・2のコントローラをUSBコントローラとして使用できるようにするコンバータの評価を行うとき、
各記事にいちいち方法を載せてたらキリがないので参照させる用の記事です。

個別のコンバータの記事にはタグで飛んでください。

使用するコントローラ

Enter氏が販売している『【pop'n music用】beatmania風コントローラー』を使用します。
私の場合、特別にボタンを2個増やしたものを作ってもらったので厳密には全く同じものではないですが、ボタンの個数以外は同じものです。
Enter🏳️‍🌈 (@eraBEMANI_sfw) / X
erabemani.booth.pm

Enter氏製のコントローラはコスト削減のために100gスイッチからバネ抜いているためか、押し方によってはチャタリングが発生します。
(というかIIDXのINIFINITASやpop'nのLivelyなどといったコナステ系ソフト、BMSプレイヤーがデフォルトでチャタリング対策設定が入ってるから大丈夫なだけで、
 ステマニ等のデフォルトだとチャタリング対策設定がオフのゲームだと普通にチャタリングしてる気がします。
 なお、Enter氏製のコントローラは非常に素晴らしい物であり、実用上の問題は全くないということは強調しておきます。
 現に弐寺の☆12で普通にAAAとか出されてるし……)

これを私が以前DDRステマニ兼用コントローラとして使うために作ってもらった基板に繋いで使用します。

DDRステマニ兼用コントローラ基板の説明

コントローラからの入力は下の画像1枚目の左のブレッドボードに対して行われます。
左のブレッドボードは各スイッチの入力をダイオードで整流しつつ2分割しています。
分割した1つは右側のブレッドボードに接続しreviveUSBを用いたUSBコントローラとして使用します。
もう1つは画像2枚目のPS1のDDRコントローラ基板に接続しPS1コントローラとして使用します。
これを使うと1つの入力でUSBコントローラとしてもPS1コントローラとしても同時に使用が可能です。

コンバータの評価方法について

もしも1つの入力で1P側と2P側を同時に操作できるようにしてStepManiaで同じ譜面をバーサスプレーしたら、1P側も2P側も全く同じリザルトが出るはずです。
しかし、何かしらの理由で片側だけ入力遅延が起こっていたら、1Pと2Pでリザルトに差が発生します。

1P側をreviveUSBを用いたUSBコントローラの入力、2P側をDDRコントローラにPS1・2のコントローラのコンバータを噛ませたうえでの入力とし、
1P側と2P側のリザルト画面を比較することで評価を行います。
入力自体は全く同時なのだから、遅延などがあるとすればコンバータのせいだろうという訳です。


さて、StepManiaを使用していない方や、使用していてもITG界隈には馴染みがないかたはこう思われるかもしれません。
「リザルト画面を見たところで遅延なんて分からなくねえ?」
大丈夫です。分かる方法があります。
「SimplyLove」というテーマを使用することです。SimplyLoveのリザルト画面には下図のようなものを表示する機能があります。

見るべき点は3か所あります。

  • mean(判定誤差の平均値)
  • ヒストグラム
  • 誤差グラフ(画像下部の点)

です。

ヒストグラムと誤差グラフに関する補足

Simply Loveではプレイヤーごとに出した最低の判定ごとにグラフの範囲を調整しています。
なので、1P側の方がヒストグラムが横に広がっていたり、誤差グラフが散らばっているように見えることがあります。
たとえば下の図では1P側がGREATを出していないのでEXCELLENTの範囲までになるように拡大して描画されており、2P側はGREATを出しているのでGREATの範囲も映るように縮小して描画されています。

こういうときは色を基準にして比較してください。
ちなみに、Simply Love使用時の判定幅は以下の通りです。
水色FANTASTIC:±0.0110
白FANTASITC:±0.0215
EXCELLENT:±0.0430
GREAT:±0.1020
DECENT:±0.1350

遅延の評価について

遅延そのものはmeanのみで評価します
2P側は各入力に対してコンバータの遅延が乗っかっていますから、平均値はコンバータの遅延分だけ大きくなるはずです。
(厳密に言えば後述するポーリングレートの問題で遅延が大きい時と小さい時がありますが、実用上の範囲ではそこまで問題がないものと判断してこの方法で評価します。)
なので、上の画像の例だと12.7-(-9.6)で22.3msの遅延として評価します。
meanの差(遅延)が小さければ小さいほど良いコンバータであるとして扱います。

ポーリングレートの評価について

では、ヒストグラムと誤差グラフでは何を見るかというと、ポーリングレートを評価します。
雑に言えばポーリングレートとは入力検知の頻度のことで、一般的なUSB機器は125Hz(1秒間に8回)の入力検知を行っています。
125Hzだと0.008秒ごとに入力検知を行っているので、0.000秒での入力検知が行われた後の0.001~0.008秒での入力はすべて0.008秒のタイミングに行われたものとして扱われます。
125Hzならまだマシですが60Hzだと0.016...秒ごとの入力検知になるので、0.001~0.016秒までの入力がすべて0.016...秒のタイミングで行われたものとして扱われます。
ポーリングレートが低いと何が困るかというと、遅いピカグレやMARVELOUSで収まるはずだった判定が光らないGREATやPERFECT判定になったりします。

上の画像では1P側はわりと滑らかな線でヒストグラムが推移しているのに対して、2P側は明らかにツンツンしています。
誤差グラフも2P側は1P側と比べて明らかに「入力が検知されていない高さ」があります。
これはポーリングレートによるものです。
ポーリングレートによって入力されてないとして扱われてしまっているゾーンが出来てしまっていることになります。
こういったゾーンが存在しない(ポーリングレートが高い)ほうが良いコンバータであるとして扱います。

ポーリングレート評価の画像についての補足

「待った!ポーリングレートによって一定間隔でしか判定されないなら、ヒストグラムがそんな滑らかな曲線になるのはおかしくないか?」と思われるかと思います。
先ほどの説明だと125Hzのコントローラなら「……-0.008、0.000、0.008……」と0.008刻みでしか値が入らないはずで、もっと極端な棒グラフになるはずです。
これはSimply Loveのヒストグラム描画処理のせいで、滑らかな曲線にするために実際の入力の±0.003ミリ秒の範囲にも値が入っているためです。

ここをちょっと弄ってやると、更にツンツンした分かりやすい画像になります。
以下の2枚は同一リザルトのものです。
<修正した表示>

<Simply Loveデフォルトの表示>

修正するとポーリングレートによる入力されない区間が強調されるなら、なぜそちらの画像を使わないのかと思われるでしょうが、理由はあります。
他の人が同様に検証して同じ結果を得られる必要があるからです。

修正内容自体は簡単で、先ほどの画像にも写っているScaleFactorの値を変えればいいだけです。
これは以前にも書きました。
sha10n.hatenablog.com
ただし、上記の記事では「Pane4の29行目にある」と記載していますが、Simply Loveのバージョンが変わった2023年09月21日現在では「Pane5の30行目」に場所が変更されています。

よって、もしも他の人が追試を行おうと思った時に、同じ場所に同じ処理が埋まっている保証がなく、同様の表示を再現できないかもしれません。
であるなら、デフォルトを利用したほうがよいという思想です。

チャタリング対策の評価について

ところで、ポーリングレートが高いととある問題が浮上します。
それはチャタリングです。
チャタリングについても一応説明すると、ボタンを1回押しただけのつもりでもボタンの内部で微細な振動が起こるせいで2回、3回と連打したかのような挙動をすることです。
厳密にはチャタリングとポーリングレートに直接的な関係はありませんが、ポーリングレートが低いことによって結果的にチャタリングが防がれることがあります。
(たとえば125Hzなら0.001~0.008秒での入力はすべて0.008秒のタイミングに行われたものとして扱われる訳ですから、0.001秒と0.003秒と0.005秒で3回押されたとしても1回分扱いにしかならないので結果的にチャタリングが防がれていると言えます)

reviveUSBにはチャタリング対策をしたファームウェアがありますが、私はそのファームウェアを導入していません。
なので、1回しか押したつもりが無くても連打された判定になりえます。
チャタリングが発生した場合は下の図のように1P側の誤差グラフの下の方に紫の点が発生します。

ポーリングレートが高いからといって、チャタリングまで再現がされてしまうのは嬉しくないですよね。
なので、1P側で紫の点が発生しているときに2P側には紫の点がない(チャタリングが防がれている)ほうが良いコンバータであるとして扱います。

まあ、ぶっちゃけ先述したようにコナステ系ソフト、BMSプレイヤーがデフォルトでチャタリング対策設定が入ってるから大丈夫ではあるのですが、
もしかしたら格ゲーであるとかSteamのゲームであるとか別のソフトではチャタリング対策がされていないかもしれません。
そこについて一応考慮したものとなります。

評価に使用する譜面について

  • BPM125で8分垂れ流しの譜面
  • BPM150で8分垂れ流しの譜面
  • BPM180で8分垂れ流しの譜面
  • BPM125で16分縦連を含む譜面(最大5連)
  • BPM150で16分縦連を含む譜面(最大3連)
  • BPM180で16分縦連を含む譜面(最大3連)

上記の6譜面を用います。全て自作です。

8分垂れ流しの譜面は遅延、ポーリングレートの評価用です。
16分縦連を含む譜面はチャタリング対策の評価用です。

StepManiaにもチャタリング対策用の設定はありますが、これを0ms(オフ)にしてプレーした時と10msにしてプレーした時を掲載します。
0msだけだとチャタリングのせいでミスってるのか、ただ私が下手くそなだけなのか見分けがつかないと思ったためです。

おわり

評価方法の説明については以上です。