WiiリモコンでCLIP STUDIO TABMATEもどきを自作する(ソフト編)

前回ではWiiリモコンのペアリング方法を採り上げました。今回はゲームパッドコンバーターで各種お絵かきアプリにカスタマイズしてみます。

FreePIEのプロジェクトサイトよりMSIインストーラーをダウンロードして、パソコンに導入します。
これがFreePIEの基本画面です。Fileよりスクリプトファイルを読み込み「Script->Run Script」でスクリプトを実行するのが基本的な流れです。スクリプトで用いられる言語はPython(Python 2)ですが、通常のPythonスクリプトとは若干挙動が異っています。

mathをはじめとする標準ライブラリーはあらかじめ組み込まれているため、import宣言しなくてもこれらを利用できます。

FreePIEでは、スクリプトが最終行まで実行されると、再び先頭行からスクリプトを繰り返し実行します。「starting」というグローバル変数があらかじめ定義されており、初回のループではこの値がTrueになっています。つまり、デバイスの検索や変数の初期化はこの値で判断することになります。
starting.py
if starting:
	klist = [None] * 32
	initKeys(klist)
	
	diagnostics.debug("Hello!")
ゲームコントローラーの入力値を取得するタイミングは機器によって異なります。通常はループ内で都度値を取得しますが、Wiiリモコンではupdateイベントによるコールバック関数から値を取得します。デバイスは配列として格納されているため、複数のゲームコントローラーを接続しているとインデックスがずれることもあるでしょう。

専用のデバッグ命令を使えば値を目視できます。「diagnostics.debug()」でアプリのコンソールにメッセージを表示し、「diagnostics.watch()」では、指定した値をリアルタイムに監視することができます。
event.py
def update():
	# ヌンチャクスティックの位置を取得
	global n
	sx = n.stick.x
	sy = n.stick.y

if starting:
	n = wiimote[0].nunchuck
	n.update += update
ボタンが押されているかどうかを知るにはWiiリモコンなら「n.buttons.button_down(NunchuckButtons.C)」、ゲームパッドなら「joystick[0].getDown()」のように用います。ボタンの番号は0から始まるので、ゲームパッドに「5」と刻印されたボタンを調べるなら「stick.getDown(4)」を実行します。

キーボードの入力を実行するには「keyboardクラス」を使います。「keyboard.setKey(Keys.A, True)」と「keyboard.setKeyDown(Keys.A)」は同じです。「keyboard.setPressed()」では、押して放すを一度に行います。なお、Keys列挙子の値はC#(.NET Core)における値を参考にしたとのことです。

キーストロークの連続入力についてですが、FreePIEではオブジェクトを共有しているためか、スクリプトを止めてもサブスレッドが機能し続けるなどの問題があるため、thread.Timerはあまり活用できません。そのため、ループごとに逐一タイムカウントを調べることで対処しました。

以上を踏まえた、Wiiリモコンをキーボード入力に変換するスクリプトをGitHubにて公開しています。ファイル一覧より「wiimote.py」のテキストをFreePIEで開いて実行すると、スティックを押した方向と押したボタンの組み合わせによって、異なるキーをパソコンに送信できるようになります。


スクリプトを修正すれば、好みのショートカットを簡単に構成できます。なお、Dualshock4やVRリモコンなどの汎用ゲームパッドに対応したバージョンはPixiv Fanboxでダウンロードできます。
2020/04/09