HORIの『初音ミク Project DIVA Future Tone DX』専用コントローラーを解析してみた話。
とりあえず以前作成したDS4-アケコンIFは90点くらいの満足度ではあるのだが、アーケードに比べて若干タッチスライダーの加速度(?)が少ない、という現象がある(アケのつもりでスライドするとMAX入らないことがまれにある)。
ホリの専コンモードはそんなことなく、アケと同じ感じで動くので、ホリの専コンモードで本物コンパネを繋ぎたいという話。
というわけで解析結果。
結論としては、DS4のアナログスティックはLX/LY/RX/RYの4chがそれぞれ8bitの値を持つので、計32bitの情報になるのだが、そこにタッチ情報を載せている形。
ch |
L | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | R |
LX bit | | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
LY bit | | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
RX bit | | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
RY bit | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 | |
bit7だけはタッチ状態で0、それ以外のbitはタッチ状態で1となる。
例:
| LX | LY | RX | RY |
全ch未タッチ | 0x80 | 0x80 | 0x80 | 0x80 |
ch0タッチ | 0x80 | 0x80 | 0x80 | 0x00 |
ch1タッチ | 0x80 | 0x80 | 0x80 | 0xc0 |
ch0+1タッチ | 0x80 | 0x80 | 0x80 | 0x40 |
ch16タッチ | 0x80 | 0x00 | 0x80 | 0x80 |
というわけで、DS4を乗っ取るならアナログ値を正確に制御しないとだめなので難しい。
JDM-030だとARMからBTチップの間のHCIのバスが平文かつアクセス可能な場所にパターンがあるので、そこでデータを差し替えればできそうな気がする。
ところで、最近DS4用の背面ボタンアタッチメントという、DS4の拡張端子からボタンを制御するというなかなか面白そうなデバイスが発売されて、少なくともL2ボタンなどをデジタル的に拡張端子から制御できるようなので、もしかしたらプロトコル上アナログスティックも外部制御できたりしないかなという期待もあったりして。
ちなみに、Switch用の専コンも同じくLX/LY/RX/RYに値が乗るようだ。
こちらについてはArduino MicroでSwitch用のUSBコントローラーが作れるので、専コンモードの実装も簡単。
でも、スライドが逆方向に誤検出するという問題がある。これはswitchのHORIコンでも発生するし、本物コンパネをswitchに繋いでも発生する。
HORIコンのスライダー自体のせいでは無いようだ。
PS4でもHORIコンを専コンモードで使うと、同様に誤検出は発生する。
ただ、以前作成した変換IFのようにタッチパッドを乗っ取ると、逆方向誤検出は全く発生しないので、ソフト側なのかコントローラー側なのかが判断に悩むところ。
ゲームプレイ中の誤検出したときのログ取らないと原因究明はできなさそう。
ソフト側の問題だと思うけどなあ。
質問はtwitter:@r_y_u_nへどうぞ。