---
# System prepended metadata

title: 2台以上のキーボードでオフライン対戦をする
tags: [技術ネタ, Empengineer]

---

# この記事を読むと嬉しい想定読者
オフラインでのゲームプレイで使用デバイスがキーボード同士の対戦になったとき困る人・大会運営者等。例えばストリートファイタ―6等でもこの問題には打つ手がなかったようで、公式ルールではこの場合オンラインで対戦するように定められています([カプコンプロツアーコントローラ利用規定5項より](https://sf.esports.capcom.com/cpt/jp/rules/))。
大きな大会ではオンライン対戦の準備もあるでしょうが、個人レベルのオフ会などでは致命的なことがあり得ます。

# KeyboardSplitterXbox
## これは何？
最大4つのキーボードを仮想的なXboxコントローラとして扱えるツール。
## 背景：Windowsにおけるキーボード入力の問題
例えばゲームで対戦するための入力デバイスとしてキーボードを2つ接続して、同一の例えばAキーを押すとします。しかしそれら2つのキーボードからのA入力は個別に認識されることはなく、全く同じA入力とみなされてしまうため、2つのキーボードではゲームは成立しません。
## このツールを使うと？
各キーボードは独立した仮想XBoxコントローラによる個別の入力としてみなされるようになり、結果的に最大4つのキーボードがゲーム内で4つのXboxコントローラのように扱われ、ゲームを成立させることができます。

## Download
[最新版のKeyboard.Splitter.x.x.x.x.zipをダウンロード・解凍してください。](https://github.com/djlastnight/KeyboardSplitterXbox/releases)


## 事前にシステムにインストールが必要なもの
注意：exeへの直リンクですので、クリックするとダウンロードされます
各々実行してインストールしてください。
- [DirectX 9.0c June](https://download.microsoft.com/download/8/4/A/84A35BF1-DAFE-4AE8-82AF-AD2AE20B6B14/directx_Jun2010_redist.exe)

- [Vcredist 2013 x86](https://download.microsoft.com/download/2/E/6/2E61CFA4-993B-4DD4-91DA-3737CD5CD6E3/vcredist_x86.exe)

- [Microsoft's Xbox Accessories Driver (64 bit)](https://github.com/djlastnight/KeyboardSplitterXbox/blob/master/Xbox360Accessories_x64_1.2.exe?raw=true)



# 使い方


## 実ボタン配置とボタン配置設定用xmlファイル
[XBOX公式のコントローラ配置図を以下に引用します](https://support.xbox.com/ja-JP/help/xbox-360/accessories/controllers)
![公式からの引用](https://hackmd.io/_uploads/ByKfnnnhge.png)

上図の実ボタン配置と対応する設定ファイルのテンプレートが以下です。コメントでどのボタンに対応するか細かく補足しました。
まず以下のxmlをコピーしてsplitter_presets.xmlの中身を丸ごと入れ替えてください。

```xml
<?xml version="1.0" encoding="utf-16"?>
<preset_data xmlns:xsi="http://w3.org/2001/XMLSchema-instance" xmlns:xsd="http://w3.org/2001/XMLSchema">
  <preset name="BaseTemplate">
    <button id="4096">Z</button><!-- Aボタン -->
    <button id="8192">X</button><!-- Bボタン -->
    <button id="16384">C</button><!-- Xボタン -->
    <button id="32768">A</button><!-- Yボタン -->
    <button id="256">S</button><!-- Lボタン -->
    <button id="512">D</button><!-- Rボタン -->
    <button id="32">Escape</button><!-- BACKボタン -->
    <button id="16">Enter</button><!-- スタートボタン -->
    <button id="64">L</button><!-- LeftThumb=左スティックのプッシュ入力 -->
    <button id="128">P</button><!-- RightThumb=右スティックのプッシュ入力 -->
    <trigger id="65536">F</trigger><!-- 左トリガ ー-->
    <trigger id="131072">V</trigger><!-- 右トリガー -->
    <axis id="1" value="-32768">Left</axis><!-- 左スティック左Xinput -->
    <axis id="1" value="32767">Right</axis><!-- 左スティック右Xinput -->
    <axis id="2" value="-32768">Down</axis><!-- 左スティック下Xinput -->
    <axis id="2" value="32767">Up</axis><!-- 左スティック上Xinput -->
    <axis id="4" value="-32768">None</axis><!-- 右スティック左Xinput -->
    <axis id="4" value="32767">None</axis><!-- 右スティック右Xinput -->
    <axis id="8" value="-32768">None</axis><!-- 右スティック下Xinput -->
    <axis id="8" value="32767">None</axis><!-- 右スティック上Xinput -->
    <dpad direction="1">None</dpad><!-- 方向パッド右POV -->
    <dpad direction="2">None</dpad><!-- 方向パッド左POV -->
    <dpad direction="4">None</dpad><!-- 方向パッド下POV -->
    <dpad direction="8">None</dpad><!-- 方向パッド上POV -->
  </preset>
</preset_data>
```

## 起動と使い方
以下が起動画面です(私の環境ではなぜか上部が白くなってます)
![](https://hackmd.io/_uploads/SyeV2nnhee.png)

仮に1体1でキーボード2台での格闘ゲームの対戦を想定して設定します。
1. まずはキーボード2台必要ということで、左上のSlots countを2にしてください。最初4つあったスロットが2つになると思います。
2. 次に、Choose keyboardでどのキーボードを設定するか選ぶのですが、デフォルトのKeyboard_01といった名前ではどれがどのキーボードか区別がつきません。そこで、キーボードの名前の右隣りにある「..」をクリックすると「Waiting for keyboard input...」というウインドウが表示され、キーボード入力を待ち受けます。そこで使いたいキーボードから何でもいいので入力をすると、入力した使いたいキーボードが選択されます（名前は相変わらず見てもわからない数字です)。同様に、2スロット目のキーボードで2つ目の使いたいキーボードを認識させます。これで2つのキーボードが別々に認識されました。
3. あとはプリセットです。Preset:defaultとなっているところから、前項でxmlの内容を入れ替えて作ったBaseTemplateというpresetが選べることを確認します。BaseTemplateの名の通り、こちらは叩き台を意図していますので、自由に変更してもらって構いませんが、KeyboardSplitter画面からプリセットの編集や追加を行って保存すると、書き加えていたコメントが消失してしまいます。このコメントを維持したい場合はsplitter_presets.xmlファイルを直接編集しましょう。追加の場合、具体的には`<preset name="">～</preset>`をコピーして`</preset>`の下に貼り付け、コメントと照らし合わせながらキー入力を設定してください。name=""は入力が共通ならばゲーム名、独自の配置を使う場合プレイヤー名を入れておくことがお勧めです。終わったら上書き保存して、KeyboardSplitter再起動で反映です。
4. 2の手順でそれぞれのキーボードを認識させて、3で必要なpresetを設定し、指定し終わったら、いよいよ各キーボードを仮想Xboxコントローラ化します。右上のStartを押してください。これだけです。おめでとうございます！キーボード同士の対戦を成立させることができるようになりました！



## トラブルシューティング
- エラー「Slot is invalidated」
このエラーが出る場合、おそらくインストールされているSCP Busのバージョンが異なります。
バージョンは22.52.24.182でなければなりません。以下のようにデバイスマネージャのシステムデバイスからSCP Virtual Bus Driverを見つけて、プロパティを確認し、バージョンが異なる場合（新しいか古いかは関係なく）アンインストールしてください。以下は公式の説明画像引用です。
![公式ページからの画像引用](https://hackmd.io/_uploads/rkZHn3h3xe.png)

PCを再起動し、KeyboardSplitterを実行します。その後、ドライバをインストールするように指示されるはずです。
- キーボードが反応しない・又は押してない入力が発生する
壊れていなくても安価なキーボードでは仕組み上ありえるそうです。買い直しましょう。キーボードスペックにNキーロールオーバー、アンチゴーストと書かれていると安心できます。
- 起動時にエラーが出てpresetが読み込めない
splitter_preset.xmlファイルのエンコードがUTF-16LE以外になっていませんか？もしそうであれば、UTF-16LEに変更して下さい。エンコードの確認と変更については、[VisualStudioCode](https://code.visualstudio.com/)という高機能エディタで行うのがお勧めです。[解説記事](https://atmarkit.itmedia.co.jp/ait/articles/1806/01/news051.html)と併せれば解決できるでしょう。
- Dpadが動かない
古いゲームではDpadに対応していないものがあります。Xinputの方で設定しましょう。
- 設定したがゲーム起動中に何も反映されてないように見える
古いゲームなどでは、起動時にコントローラが刺さっていないとコントローラが認識されないことがあります。このツールはキーボードを仮想的なXboxコントローラに変えていることを思い出してください。
- 入力がおかしい
Slots countは必要最低限(使いたいキーボードの数)に設定しましたか？そうでない場合、同じキーボードに対して2種類以上のpreset設定が有効になり、おかしなことが起こっているかもしれません。Slots countは最小限にしましょう。

{%hackmd /@empengineer/footer %}