モブ沢工房

プログラミングとかLinux関連(特にOSSのグラフィックツール関連)とかレトロゲームとか3Dプリンタやら日曜大工等、色々。

LinuxにおけるDualshock3(PS3) & DualShock4(PS4) とMednafen向け設定について

(正確にはDualshock3ではなくホリの「ホリパッド3ターボプラス」なのですが、DualShock4の方は正真正銘のPS4のDualShock4です。)

このDS4をXubuntu 16.04のPCにUSBケーブルで差し込んだ所…(当たり前なのでしょうが)普通にジョイパッドとして認識しました。 面白いことにタッチパッドも対応しています。すごい!! このDS4タッチパッド、jstestで見ると、どうも絶対座標のデバイスとして認識している模様。

それで欲が出て、DualshockエミュレータのMednafenで使えないか?と思ったのですね。まぁ、とりあえず連射機能のあるホリパッドのほうを。眠らせておくのもアレですし。

なんでDualshockをつなげておきたいかというと、いつの日か、両スティックを移動と射撃に利用した今風スタイルの360度シューターで、SNKの「怒」とか洋ゲーの「Smash TV」をインスパイアしたのを作ってみたいという壮大な野望があったりするからでして、まぁ、いつになるかは不明ですが(^^;

さて、Mednafenはユニバーサルなエミュレーターで、将来的には手持ちのROMカセットを全部吸いだしてプレイしたい所(^o^)ですが、現在そんなものがなくてもフリーで公開されているHomebrewなファミコン(NES)ゲームがいくつかありまして、これがまた完成度が高い!のでした。

一方、残念ながらDS3/DS4には十字キーとアナログスティックを切り替える方法が無いようです。いやあるかもですが、とりあえずワタクシは知らない。何も設定しないままだと、アナログスティックでの代用でもっさりなプレイをすることになる…

さてそこで気づいたのですが、必死になって「この十字キーのハットスイッチをmednafenで方向キーに使えないか?」と思ったのですが、よくよくjstestの出力を見てみると、今までハットスイッチと思い込んでいたこのDS3/DS4の十字キー実はハットスイッチではない

他の軸のデバイなのですね。axis 0/1が左スティック、axis 2/3が右スティックで、 axis 4/5が方向キーです。

注:しかし、何故かopenmsxではaxis4/5ではなくhat0として認識する模様…

あとDS4は面白いことに、L2/R2を押すと、専用のアナログ軸と同時にボタンとしてもON/OFFされます。

ともかく、かなり時間を無駄にしてしまいましたが…

Mednafen側から設定も出来るようですが、物凄くわかりづらいUIだったので~/.mednafen/mednafen-09x.cfgを手動設定しました。

;nes, Port 1, Gamepad: A
nes.input.port1.gamepad.a joystick 0cb8f90ec3ed0f96 00000003

;nes, Port 1, Gamepad: B
nes.input.port1.gamepad.b joystick 0cb8f90ec3ed0f96 00000000

;nes, Port 1, Gamepad: DOWN ↓
nes.input.port1.gamepad.down joystick 0cb8f90ec3ed0f96 00008005

;nes, Port 1, Gamepad: LEFT ←
nes.input.port1.gamepad.left joystick 0cb8f90ec3ed0f96 0000c004

;nes, Port 1, Gamepad: Rapid A
nes.input.port1.gamepad.rapid_a joystick 0cb8f90ec3ed0f96 00000002

;nes, Port 1, Gamepad: Rapid B
nes.input.port1.gamepad.rapid_b joystick 0cb8f90ec3ed0f96 00000001

;nes, Port 1, Gamepad: RIGHT →
nes.input.port1.gamepad.right joystick 0cb8f90ec3ed0f96 00008004

;nes, Port 1, Gamepad: SELECT
nes.input.port1.gamepad.select joystick 0cb8f90ec3ed0f96 00000008

;nes, Port 1, Gamepad: START
nes.input.port1.gamepad.start joystick 0cb8f90ec3ed0f96 00000009

;nes, Port 1, Gamepad: UP ↑
nes.input.port1.gamepad.up joystick 0cb8f90ec3ed0f96 0000c005

ジョイスティックは/dev/input/js1のような変わりうるノードではなく、GUIDで設定できるので極めて便利です。 GUIDはコンソールからmednafenを起動した時に一覧が表示されるため、そこからコピペすればよいです。

つーか、この方式ならば、余ってる昔のシンプルなUSBパッドをDualshockと同時挿しで全く問題ないわけで、極めて便利でナイスな設計ですが、それをやったら今回のエントリの意味が完全に消失してしまうのでこのまま参ります。

Mednafen特有の方向キーの設定がミソで 00008004 というのは、「jstestで見える4番目の軸が正方向の値の時」と言う意味で、 0000c004とは、「jstestで見える4番めの軸が負方向の値の時」という意味だそうです。

その他は、jstestで見えるボタン番号となります。

f:id:dothiko:20161009000314j:plain

Bladebusterが動いてるっ! 楽しいィィィッ!

それはともかく、MednafenはLYNXにも対応しているのです。 なんとかしてATARI LYNXのカートリッジのイメージを吸い取りたいところです…

ていうかコレ、PCEngineにも対応してるんですね? ライザンバー2とか駿河屋で買ってきてDVD-Rドライブから即プレイ出来たりしたら嬉しいのですが…

MednafenとPulseaudioでの問題

書き忘れていましたがどうも、Pulseaudio環境下ではalsaがbusyということで音が鳴らないっぽいです。この解決方法はいくつかありまして

  • -sounddevice sdl オプションで起動する
  • mednafen-09x.cfgのsound.driverエントリをsdlにする
  • sound.driverはdefaultもしくはalsaのままにして、pasuspenderコマンドを利用する

しかし、sdlは非推奨とのことです。内部的な処理の問題か?CPUにどれだけ余裕があってもsdlオプションだと描画がもたつく場合があるっぽいです。

そこで、Pulseaudioのpasuspenderコマンドを利用して、

pasuspender mednafen ~/roms/bladebuster.zip

のように起動すると、その時だけpulseaudioがサスペンドされmednafen実行終了とともに復帰します。このため、alsaで問題なく動くようです。

なお、pasuspenderでは、たとえばAudaciousなどのアプリで音楽を鳴らしていると、pasusupender実行中は音楽が停止します。この方が便利でよいかもしれない…