IIDXアケコンのキーボード化
先月からサービス開始しているbeatmania IIDX INFINITASですが、基本的にキーボード対応なので、専コンを使うのには、PS2コントローラのコンバーターとJoyToKeyかJoyadapterを組み合わせる必要があります。
これだと、遅延の発生(これは調整でなんとかなります)や判定のブレ(これは私の腕ではあまり実感できていませんが)がある上、オプションを呼び出す時にキーボードが必要だったりとちょっと不便な状態になります。
そこで、既に幾人か先人が専コンのキーボード化に成功していたので、自分も挑戦してみました。
darekasannetのブログ
http://darekasan.net/wordpress/archives/429
こちらのブログを参考に材料を集めて、Arduinoにスケッチを書き込んでみました。
ちなみに私の環境では、リンク先で紹介されているプルアップ抵抗は必須でした。
なお、スケッチはDP環境向けにちょっとアレンジしてみました。
1P側
#include "HID-Project.h"
#include <Psx.h>
#define dataPin 7
#define cmndPin 6
#define attPin 5
#define clockPin 4
#define SLCT KEY_TAB
#define STRT KEY_RETURN
#define SCR1 KEY_LEFT_CTRL
#define SCR2 KEY_LEFT_SHIFT
#define KEY1 'z'
#define KEY2 's'
#define KEY3 'x'
#define KEY4 'd'
#define KEY5 'c'
#define KEY6 'f'
#define KEY7 'v'
Psx Psx;
unsigned int data;
void setup()
{
NKROKeyboard.begin();
Psx.setupPins(dataPin, cmndPin, attPin, clockPin, 1);
}
void loop()
{
data = Psx.read();
if (data & psxSlct)NKROKeyboard.add(SLCT); else NKROKeyboard.remove(SLCT);
if (data & psxStrt)NKROKeyboard.add(STRT); else NKROKeyboard.remove(STRT);
if (data & psxDown)NKROKeyboard.add(SCR1); else NKROKeyboard.remove(SCR1);
if (data & psxUp)NKROKeyboard.add(SCR2); else NKROKeyboard.remove(SCR2);
if (data & psxSqu)NKROKeyboard.add(KEY1); else NKROKeyboard.remove(KEY1);
if (data & psxL1)NKROKeyboard.add(KEY2); else NKROKeyboard.remove(KEY2);
if (data & psxX)NKROKeyboard.add(KEY3); else NKROKeyboard.remove(KEY3);
if (data & psxR1)NKROKeyboard.add(KEY4); else NKROKeyboard.remove(KEY4);
if (data & psxO)NKROKeyboard.add(KEY5); else NKROKeyboard.remove(KEY5);
if (data & psxL2)NKROKeyboard.add(KEY6); else NKROKeyboard.remove(KEY6);
if (data & psxLeft)NKROKeyboard.add(KEY7); else NKROKeyboard.remove(KEY7);
NKROKeyboard.send();
}
2P側
#include "HID-Project.h"
#include <Psx.h>
#define dataPin 7
#define cmndPin 6
#define attPin 5
#define clockPin 4
#define SLCT KEY_BACKSPACE
#define STRT KEY_ESC
#define SCR1 KEY_RIGHT_CTRL
#define SCR2 KEY_RIGHT_SHIFT
#define KEY1 'b'
#define KEY2 'h'
#define KEY3 'n'
#define KEY4 'j'
#define KEY5 'm'
#define KEY6 'k'
#define KEY7 ','
Psx Psx;
unsigned int data;
void setup()
{
NKROKeyboard.begin();
Psx.setupPins(dataPin, cmndPin, attPin, clockPin, 1);
}
void loop()
{
data = Psx.read();
if (data & psxSlct)NKROKeyboard.add(SLCT); else NKROKeyboard.remove(SLCT);
if (data & psxStrt)NKROKeyboard.add(STRT); else NKROKeyboard.remove(STRT);
if (data & psxDown)NKROKeyboard.add(SCR1); else NKROKeyboard.remove(SCR1);
if (data & psxUp)NKROKeyboard.add(SCR2); else NKROKeyboard.remove(SCR2);
if (data & psxSqu)NKROKeyboard.add(KEY1); else NKROKeyboard.remove(KEY1);
if (data & psxL1)NKROKeyboard.add(KEY2); else NKROKeyboard.remove(KEY2);
if (data & psxX)NKROKeyboard.add(KEY3); else NKROKeyboard.remove(KEY3);
if (data & psxR1)NKROKeyboard.add(KEY4); else NKROKeyboard.remove(KEY4);
if (data & psxO)NKROKeyboard.add(KEY5); else NKROKeyboard.remove(KEY5);
if (data & psxL2)NKROKeyboard.add(KEY6); else NKROKeyboard.remove(KEY6);
if (data & psxLeft)NKROKeyboard.add(KEY7); else NKROKeyboard.remove(KEY7);
NKROKeyboard.send();
}
DPで2台使っている人は、これで1P側のセレクトキーでオプション、2P側のセレクトキーでオプション切替え、スタートキーがESCキーの役割を果たすようになるので、キーボードに触れる機会をだいぶ減らせると思います。
また、参考にしたリンク先では、スクラッチの方向に違和感があったので、割り当てを変更しています。お好みでCTRLキーとSHIFTキーを入れ替えて使ってください。
ちなみに、キー割り当ての参考にしたサイトは、以下の通りです。
https://www.arduino.cc/en/Reference/KeyboardModifiers
正直、遅延の軽減や判定ブレ等については実感できていない状態ですが、テンキー以外の機能をコントローラーでまかなえるようになったのが大きいですね。あと、USBコンバータはスリープからの復帰時に無効になっていたので、挿し直す必要があったのですが、これが不要になったのも地味に大きいです。
部品等を安く上げればやる価値があると思いますので、興味がある人は是非どうぞ。
最近のコメント