2017年12月10日

ツナイデント4PROとDJMAX RESPECT

きっかけはDJMAX RESPECTを購入して、なんとか専用コントローラで遊べないかと考えたところから。
以前にK-Shoot MANIA用コントローラを自作したのでこいつを使えないかといろいろ試してみた。

参考文献 おなかすいたWiki! USBデバイス開発
http://wiki.onakasuita.org/pukiwiki/?USB%E3%83%87%E3%83%90%E3%82%A4%E3%82%B9%E9%96%8B%E7%99%BA

まず、俺のK-Shoot自作コンはASOOVU USBというPICマイコンモジュールを使ってます。これはツマミ部分をアナログで読み込ませたかったのと、K-Shoot MANIAの一部メニュー操作がキーボードなのとキーコンフィグの手間を省くためにキーボードとパッドの複合デバイスにするためでした。

PS4では通常のUSBパッドは使えないので変換器が必要です。制作にかかる手間とコストで考えたらGIMXがいいんでしょうけど、動作にPCが必要です。個人的には単体で繋いで動作するものが欲しかったので、評価も悪くないツナイデント4PROを購入。

まず複合デバイスの状態だとほぼ間違いなくムリなのでパッド単体として動作するようにPICを書き換えましたが認識せず。元々自社製品のみサポートと書いてあるのと、ネットレビューでも対応パッドに随分バラツキがあるようなので想定内。

まずは正しく動作するパッドを試してみる。兄貴から借りたPC用ホリパッド3を借りて動作を確認。usbviewで各種Descriptorを、Linuxを使ってReport Descriptorを、Microsoft Message AnalyzerでReportのキーアサインを調べて自作コンに書いてみるも動作せず。

USBディスクリプタ解析ツール usbview
http://www.infinitegra.co.jp/blog/?p=57
Linuxカーネルモジュールを作った話(調査編)
https://qiita.com/uskf/items/1170728d1c5c83432c6e
Microsoft Message AnalyzerでUSB解析
http://faster-than-the-sol.blogspot.jp/2015/04/microsoft-message-analyzerusb.html


ここでツナイデント4PROの説明書に「DS4のPSボタンを押して、使用パッドのPSボタンを押す」という部分が気になったので、自作コンのボタンひとつにPSボタンに該当する13番ボタンを割り当ててみてもダメだった。
どうもPSボタンを押すことによる認証かなんかがあるらしい。実際にPC用ホリパッド3のReport DescriptorにFeatureの項目があるのでこれでやり取りしてるっぽい。

これについてネットで徘徊しまくった。日本語での情報が少なすぎるので海外メインで探してたらここを見つけた。

ps3-teensy-hid
http://git.slashdev.ca/ps3-teensy-hid/commit/

TeensyというARMマイコンボードをPS3パッドにするためのソースコードのようだ。この文末近くに各種クラスリクエストが来たときの挙動が書かれているのだが、HID_GET_REPORTが来たときにmagic_init_bytesを使って応答している。

magic_init_bytesの中身
0x21, 0x26, 0x01, 0x07, 0x00, 0x00, 0x00, 0x00

MCHPFSUSBではusb_function_hid.cに各種クラスリクエストの応答が書かれている。ここのcase GET_REPORT:にmagic_init_bytesを送るコードを追加。

これのお陰で自作コンが認識されるようになった。試しにDJMAXの4Bモードでプレイ、特に問題なし。


その後Report Descriptorについても軽く検証。その結果ツナイデント4PROが認識するパッドの条件として

・13ボタン4軸
・以下のPS3固有転送データ
  Usage Page (Vendor-defined FF00h)
  ・各ボタンのアナログ値12個
    Usage (20h~2Bh)
  ・ジャイロセンサー10bit4軸(Sizeは16)
    Usage (2Ch~2Fh)
  ・FeatureレポートとOutputレポート
    Usage (2621h)
    Report Size(8)
    Report Count(8)
・ホストからのGET REPORTに対し上記の8バイトを返す

こんな感じでしょうか。Xbox360コントローラ側は規格そのものがしっかりしてるのでXInputなら反応しそう。残念ながらXInput対応パッドを持ってないのでなんとも言えませんが。

以下に自作コンでのReportのアサインも載せときます。というよりPC用ホリパッド3の流用。順番は下位ビットから。
自作コンでは念のためボタンアナログ値も送ってます。ジャイロは検証してないし使わないのでよくわからん。

[ 0] □, ×, 〇, △, L1, R1, L2, R2
[ 1] select, start, L3, R3, PS, (3bit padding)
[ 2] hat, (4bit padding)
[ 3] X
[ 4] Y
[ 5] Z
[ 6] Rz
  (ここから各ボタンのアナログ値)
[ 7] hat R
[ 8] hat L
[ 9] hat U
[10] hat D
[11] △
[12] 〇
[13] ×
[14] □
[15] L1
[16] R1
[17] L2
[18] R2
  (ここからジャイロセンサー)
[19] ~[26]


これからDJMAX RESPECT専用コントローラの自作に取り掛かろうと思ってるんですが、せっかく作るならBMSにも流用したいし9keysも遊べるようにしたいとか考えてたらEZMAXという素晴らしいお手本が出てきたじゃないですか。やるしかねぇ。


nitrodead at 18:23コメント(1) この記事をクリップ!

2017年11月09日

BeatorajaスキンのimagesetとReferenceID

ある程度スキン開発に携わった人向けです。

Beatorajaのjsonスキンにはimagesetという機能があり、複数枚の画像パーツを一纏めにしてReferenceIDをもとに表示画像を切り替えるというものです。
中身としてはSRC_BUTTONのパーツを一つ一つ個別に定義できる、と言ったほうが分かる人には分かるのではないでしょうか。ReferenceIDも中身はbutton_typeですし。
本体同梱のデフォルトプレイスキンではこれを利用してキー押しレーザーのPERFECT色変えやボムのfast/slow表示を分けたりしてます。
これらは既存のLR2skinでもdst_opを使えば似たような挙動ができるのですが、都度その時点でのfast/slow状況によって全表示が切り替わってしまう問題がありました。この機能を使えば各レーン毎に表示を分離させることができます。
LR2skinでも使えるようにしたかったので2種類定義を追加しました。

#IMAGESET,(null),gr,x,y,w,h,divx,divy
IMAGESETで使う画像パーツを登録します。#IMAGEと同じように登録した順から番号が振られていきます。
#IMAGEの後に必要な画像パーツすべて書いてください。#IMAGEの手前だと元画像が読めずに無視されてしまいます。
cycle、timerは使いません。書いても無視されます。

#SRC_IMAGESET,cycle,timer,ref,len,pr,pr...
cycle、timerは通常の使い方と同じです。refにはReferenceIDを指定します。
lenに画像パーツを使う数を指定します。prに登録した画像パーツの番号を指定します。prはlenで指定した枚数分書いてください。
#DST_IMAGEは通常と同じ書き方でOKです。
以下に1Pスクラッチボムの定義例を載せておきます。

...
#IMAGE,.hoge/bomb.png  //6
#IMAGE,.hoge/fast.png  //7
#IMAGE,.hoge/slow.png  //8
...
//IMAGESET定義,(null),gr,x,y,w,h,divx,divy
#IMAGESET,0,6,0,0,2896,192,16,1, //0 PERFECT  詳細は以下の参照先で
#IMAGESET,0,7,0,0,2896,192,16,1, //1 fastGREAT
#IMAGESET,0,8,0,0,2896,192,16,1, //2 slowGREAT
...
//SRC_IMAGESET定義,cycle,timer,ref,len,pr,pr...
#SRC_IMAGESET,251,50,500,4,0,0,1,2
//DST定義,(null),time,x,y,w,h,acc,a,r,g,b,blend,filter,angle,center,loop,timer,op1,op2,op3,
#DST_IMAGE,0,0,-40,238,181,192,0,255,255,255,255,2,0,0,0,-1,50,0,0,0,
#DST_IMAGE,0,250,-40,238,181,192,0,255,255,255,255,2,0,0,0,,,,,,
...

ReferenceIDの参照先と出力は以下のようになってます。ほぼbutton_typeと同じです。
ただし17/11/09時点の内容なので今後のアップデートで変更される可能性があります。

11  MODE
 null, 7keys, 7keysDP, 9keys, 5keys, 5keysDP, 24keys, 24keysDP
12  SORT
 name, level, clear, score, misscount

15  PLAY
16  AUTOPLAY
315 PRACTICE
17  READTEXT
19  REPLAY
316 REPLAY2
317 REPLAY3
318  REPLAY4
 ボタン機能のみ

40  GAUGE_1P
41  GAUGE_2P
 ASSIST EASY, EASY, NORMAL, HARD, EX-HARD, HAZARD
42  RANDOM_1P
43  RANDOM_2P
 OFF, MIRROR, RANDOM, R-RANDOM, S-RANDOM, SPIRAL, H-RANDOM, ALL-SCR, RANDOM-EX, S-RANDOM-EX
54  DPOPTION
 OFF, FLIP, BATTLE
55  HSFIX
 OFF, START bpm, MAX bpm, MAIN bpm, MIN bpm
72  BGA
 ON, AUTO, OFF
301 ASSIST_EXJUDGE
 OFF, ON (EXPAND JUDGE > 100)
302 ASSIST_CONSTANT
303 ASSIST_JUDGEAREA
304 ASSIST_LEGACY
305 ASSIST_MARKNOTE
306 ASSIST_BPMGUIDE
307 ASSIST_NOMINE
 OFF, ON
308 LNMODE
 LN, CN, HCN
500~509 VALUE_JUDGE_1P
(500 スクラッチ 〜 507 7番キーという具合)
510~519 VALUE_JUDGE_2P
 未指定, PERFECT, fastGREAT, slowGREAT......以下slowMISSまで

各項目で先頭以外の画像が指定されたときに#SRC_IMAGESETでその部分の画像が定義されていなければ先頭の画像で代替されます。
デフォルトスキンのキー押しレーザーでは未指定とPERFECTのみ定義されているので、PERFECT以外の判定では未指定の画像が使われています。


また、jsonskinでのimageではlenという数字を使って画像定義を分ける機能があります。
これもSRC_BUTTONに追加して使えるようにしました。
例えば、上記のような4つ分のボム画像を一纏めにしてボム定義した場合です。

//SRC定義,(null),gr,x,y,w,h,div_x,div_y,cycle,timer,type,click,panel,plusonly,len
#SRC_BUTTON,0,6,0,0,2896,768,16,4,251,50,500,0,0,0,4

divx16*divy4=合計64枚の画像をlen4で割って、手前から16枚ずつ別画像という扱いで分けてます。
IMAGESETを使わずBUTTON定義のみでdiv分割アニメーションが動きます。lenに数字が入ってなければ今まで通りアニメーション不可、cycle,timerは使われないので互換性も確保されています。



nitrodead at 18:13コメント(0) この記事をクリップ!
beatoraja 

はじめに

ツイッターで書ききれない内容やメモ書きをここに書いていく予定。

左上のカウンターは過去の状態からそのまま使ってるので軽い詐欺ですw


nitrodead at 09:50コメント(0) この記事をクリップ!
Counter
Profile

逝きたい窒素 nitr...

QRコード
QRコード
最新コメント
月別アーカイブ