2012/1/1 日曜日

【お年玉企画?】Canopus JD-1用ドライバを自作してみた

新年一発目はコレ!

Canopus製のJog/Shuttleコントローラ『JD-1』。

JD-1 製品情報 – GRASSVALLEY
http://pro.grassvalley.jp/catalog/jogdisk/jd1_index.htm

動画編集でコマ単位の編集を行う際に便利なジョグダイヤルですが、こいつのドライバは対応しているソフト以外で動作せず、もうメーカーのサポート終了しているために、対応ソフトが増える望みも無い…

なら、自分でドライバを作ってしまおう!

というわけで、VB.netを使って作ってみました。

そして、同様に困っている同士の参考になればと思い、ソース等を公開します!お年玉だと思って活用して頂ければと思います!

JD-1の動作確認

まず、初めにJD-1がどのように動作するかを確認してみました。

Canopusの公式ドライバをインストールしていない状態で接続すると…

『HID準拠コンシューマー制御デバイス』として認識した。

さすがに、ハードウェアレベルからドライバ作成するとなると大変だなぁ~と思ってましたが、HIDで認識してくれているので、ここから送られてくるデータを解析して利用することにしました。

正確には『ドライバ』と呼んでいいのか微妙ですが、まぁ、細かいことは(゚ε゚)キニシナイ!!

HIDドライバから受けた信号を作成するドライバで読み込んで、その信号に応じたキーコードを仮想キーボードから送信する。送信するキーコードを使用するソフトウェアのショートカットキーに割り当てることで動作させる。

これなら、どのソフトウェアでも対応できる!

HIDからのデータを読み出す方法はこちらのサイトのコードを使わせていただきました。

ぬるり。: Raw Input(直訳:生入力)
http://hongliang.seesaa.net/article/18076786.html

上記サイトのコードでは『マウス』のデータを読み出すことを目的にしているので、これを『コンシューマ制御デバイス』のデータを読み出すようにしました。

HIDデバイスには目的に応じて[Page]と[Usage]が指定されており、『マウス』の場合は[Page : 1][Usage : 2]となっている。

USB.org – HID Tools
http://www.usb.org/developers/hidpage/

各デバイスに割り当てられているPageとUsageについてはUSB-IFが公開している一覧表『HID Usage Tables』で調べることができる。

今回用いる『コンシューマ制御デバイス』の場合は[Page : 13][Usage : 1]となっているので、ここを書き換えている。

上記コードから得られるHIDの生データを解析すると、ジョグダイヤルは1クリックするごとに1信号、ボタンは押した瞬間離した瞬間にそれぞれ1信号が送信されることが分かった。押した瞬間と離した瞬間を読み取ることで、押しっぱなしを検出できますが、今回は押した瞬間のみ用いました。

作成したドライバ

ドライバの作成はVisualBasic 2010を使用。

以前から、何度か書いているように、自分はプログラミングは大の苦手で正直「動けば何でもいい」と言う考えなので、基本的には上で紹介したソースコードに手を加えた程度となっています。VBも今回初挑戦!

で、実際に作成したドライバは…

[JogShuttleController.exe]と[settings.xml]の2ファイル構成。

JogShuttleController.exeを起動するとタスクバーの通知領域に常駐し、HID信号を監視します。

アイコンはWindows 7の通知領域と似たデザインになるようにしましたが、自分のセンスではこれが限界(^^;)

とりあえずアイコンが表示されれば起動完了。

JD-1からのデータを元にキーコードが送信されるようになる。

キーコード等の設定ですが、通知領域のアイコンを右クリックすると…

設定画面の項目が表示される。

設定画面はこんな感じ。設定内容はexeファイルと一緒に入っている[settings.xml]に保存されているんですが、自分にはxmlファイルを出力する方法が分からなかったので、細かい設定はxmlファイルを書き換えることで行うことになる。(気が向いたら実装するかも…)

この画面で設定できるので[動作モード][感度]およびそれらを切り替えるためのボタン設定。

まず[動作モード]ですが、複数のモードを登録することでアプリケーションごとに異なる動作をさせることができる。とりあえず、自分がよく使うソフトを5つほど登録してみました。

動作モードを増やすには[settings.xml]に追記を行うことで可能となっているが、その方法はxmlファイル内に書いてありますので、そちらを参照あれ。

もうひとつ、設定できるのが、[感度]。

[感度]はジョグダイヤルを1クリックさせると何回キーコードを送信するかを設定できる。動画編集でコマ単位の編集を行う際には不要な機能だが、Webブラウザでページをスクロールする際にはジョグダイヤルを回す回数が少なくて済むので手が疲れなくて便利だったりする。

[動作モード]と[感度]の切り替えは変更ボタンを登録しておくことで、設定画面を出さずに行うことも可能。

設定したボタンを押すとこんな感じでバルーンが表示されて変更された内容を知ることができる。

ダウンロード

とまぁ、作成したドライバですが、JD-1が肥やしになってしまっている方もいるかと思いますので公開しておきます。一応、Windows 7 64bit版とWindows XPにて動作することは確認してあります。

Canopus-JD1-JogShuttle-Controller.zip

なお、参考にさせてもらったソースコードを公開しているサイトさんが「改変、再頒布可」としていますので、VBプロジェクトも公開しておきます。使いやすいように改変したり、他のHID機器用のドライバ作成の参考になればと思います。

JogShuttle_Controller_VBProject.zip

お約束

お約束なので書いておきますが、使用して何らかの損害を被っても私は知りません(`・ω・´)キリッ 自己責任でお使いくださいな。ただ、おかしな挙動を示した場合には報告をいただければ今後の改善に役立つかと思いますので、この記事のコメントにでもお願いします。

あと、完全に趣味で作っているものなのでCanopus(現グラスバレー)さんへ問い合わせるとかはおやめ下さいな。

2 Comments »

  1. ハイジんブルーさんのプログラムを利用して別のジョグコントローラー(PCDA-J1というものでこちらも公式ソフトウェアの更新が停止しています)のソフトウェアの作成を試みている者です。
    JD-1の実機を購入し解読を進めているのですが、UsagePageとUsageの値がどうしても分かりません。
    JD-1と同じ UsagePage 12(ソース内では&HCと記されていますが) と Usage 1 では信号の受信ができていないようです。
    もちろんusb.orgの対応表は拝見しておりますが、PCDA-J1がどれに当てはますのかがさっぱりです。
    どのようにして導き出したのか教えていただけないでしょうか?

    Comment by ビギナー — 2017/9/16 土曜日 @ 2:34:59

  2. >>1
    通りすがりの者ですが、発言をお許しください。
    UsagePageとUsageの値は「Device Monitoring Studio」を
    使えば簡単に判明します。
    以下にPCDA-J1の情報を貼り付けます。
    Usage: 0 (Unknown)
    Collection
    Report ID: 1
    Usage Page: 7 (Keyboard)
    Usages (224-231): Control Left, Shift Left, Alt Left, GUI Left, Control Right, Shift Right, Alt Right,
    GUI Right
    Logical Minimum: 0
    Logical Maximum: 1
    Report Size: 1
    Report Count: 8
    Input: 2 (Data,Variable,Absolute,No Wrap,Linear,Preferred State,No Null Position)

    Report Count: 5
    Report Size: 1
    Usage Page: 8 (LEDs)
    Usages (1-5): NumLock, CapsLock, Scroll Lock, Compose, Kana
    Output: 2 (Data,Variable,Absolute,No Wrap,Linear,Preferred State,No Null Position,Non Volatile)

    Report Count: 1
    Report Size: 3
    Output: 1 (Constant,Array,Absolute,No Wrap,Linear,Preferred State,No Null Position,Non Volatile)

    Report Count: 6
    Report Size: 8
    Logical Minimum: 0
    Logical Maximum: 255
    Usage Page: 7 (Keyboard)
    Usages (0-255): No Event, Keyboard ErrorRollOver, Keyboard POSTfail, Keyboard Error Undefined, A,
    B, C, D, E, F, G, H, I, J, K, L, M, N, O, P, Q, R, S, T, U, V, W, X, Y, Z,
    1 and ! (One and Exclamation), 2 and @ (2 and at), 3 and # (3 and Hash), 4 and $ (4 and Dollar Sign),
    5 and % (5 and Percent Sign), 6 and ^ (6 and circumflex), 7 and & (Seven and Ampersand),
    8 and * (Eight and asterisk), 9 and ( (Nine and Parenthesis Left), 0 and ) (Zero and Parenthesis Right),
    Return (Enter), Escape, Delete (Backspace), Tab, Space Bar, – and _ (Minus and underscore),
    = and + (Equal and Plus), [ and { (Bracket and Braces Left), ] and } (Bracket and Braces Right),
    \ and | (Backslash and Bar), # and ~ (Hash and Tilde, Non-US Keyboard near right shift),
    ; and : (Semicolon and Colon), メ・and ” (Accent Acute and Double Quotes), ` and ~ (Accent Grace and Tilde),
    , and (Period and Greater), / and ? (Slash and Question Mark),
    Caps Lock, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, Print Screen,
    Scroll Lock, Pause, Insert, Home, Page Up, Delete Forward (without Changing Position),
    End, Page Down, Right Arrow, Left Arrow, Down Arrow, Up Arrow, Num Lock and Clear,
    Keypad / (Division Sign), Keypad * (Multiplication Sign), Keypad – (Subtraction Sign),
    Keypad + (Addition Sign), Keypad Enter, Keypad 1 and END, Keypad 2 and Down Arrow,
    Keypad 3 and Page Down, Keypad 4 and Left Arrow, Keypad 5 (Tactilei Raised),
    Unknown, Keypad 6 and Right Arrow, Keypad 7 and Home, Keypad 8 and Up Arrow,
    Keypad 8 and Page Up, Keypad . (decimal delimiter) and Delete, \ and | (Backslash and Bar, UK and Non-US Keyboard near left shift),
    Keyboard Application (Windows Key for Win95 or Compose), Power (not a key),
    Keypad = (Equal Sign), F13, F14, F15, F16, F17, F18, F19, F20, F21, F22, F23,
    F24, Execute, Help, Menu, Select, Stop, Again, Undo, Cut, Copy, Paste, Find,
    Mute, Volume Up, Volume Down, Locking Caps Lock, Locking Num Lock, Locking Scroll Lock,
    Keypad Comma, Keypad Equal Sign (AS/400), International 1 (PC98), International 2 (PC98),
    International 3 (PC98), International 4 (PC98), International 5 (PC98), International 6 (PC98),
    International 7 (Toggle Single/Double Byte Mode), International 8, International 9,
    LANG 1 (Hangul/English Toggle, Korea), LANG 2 (Hanja Conversion, Korea), LANG 3 (Katakana, Japan),
    LANG 4 (Hiragana, Japan), LANG 5 (Zenkaku/Hankaku, Japan), LANG 6, LANG 7,
    LANG 8, LANG 9, Alternate Erase, SysReq/Attention, Cancel, Clear, Prior, Return,
    Separator, Out, Open, Clear/Again, CrSel/Props, ExSel, Unknown, Unknown, Unknown,
    Unknown, Unknown, Unknown, Unknown, Unknown, Unknown, Unknown, Unknown, Unknown,
    Unknown, Unknown, Unknown, Unknown, Unknown, Unknown, Unknown, Unknown, Unknown,
    Unknown, Unknown, Unknown, Unknown, Unknown, Unknown, Unknown, Unknown, Unknown,
    Unknown, Unknown, Unknown, Unknown, Unknown, Unknown, Unknown, Unknown, Unknown,
    Unknown, Unknown, Unknown, Unknown, Unknown, Unknown, Unknown, Unknown, Unknown,
    Unknown, Unknown, Unknown, Unknown, Unknown, Unknown, Unknown, Unknown, Unknown,
    Unknown, Unknown, Control Left, Shift Left, Alt Left, GUI Left, Control Right,
    Shift Right, Alt Right, GUI Right, Unknown, Unknown, Unknown, Unknown, Unknown,
    Unknown, Unknown, Unknown, Unknown, Unknown, Unknown, Unknown, Unknown, Unknown,
    Unknown, Unknown, Unknown, Unknown, Unknown, Unknown, Unknown, Unknown, Unknown,
    Unknown
    Input: 0 (Data,Array,Absolute,No Wrap,Linear,Preferred State,No Null Position)

    End Collection
    Usage Page: 1 (Generic Desktop Controls)
    Usage: 2 (Mouse)
    Collection
    Report ID: 2
    Usage: 1 (Pointer)
    Collection
    Usage Page: 9 (Buttons)
    Usages (1-3): Button 1 (Primary), Button 2 (Secondary), Button 3 (Tertiary)
    Logical Minimum: 0
    Logical Maximum: 1
    Report Count: 3
    Report Size: 1
    Input: 2 (Data,Variable,Absolute,No Wrap,Linear,Preferred State,No Null Position)

    Report Count: 1
    Report Size: 5
    Input: 1 (Constant,Array,Absolute,No Wrap,Linear,Preferred State,No Null Position)

    Usage Page: 1 (Generic Desktop Controls)
    Usage: 48 (Direction-X)
    Usage: 49 (Direction-Y)
    Usage: 56 (Wheel)
    Logical Minimum: -127
    Logical Maximum: 127
    Report Size: 8
    Report Count: 3
    Input: 6 (Data,Variable,Relative,No Wrap,Linear,Preferred State,No Null Position)

    End Collection
    End Collection

    Comment by robocat — 2018/3/23 金曜日 @ 17:57:58

RSS feed for comments on this post. TrackBack URL

Leave a comment

HTML convert time: 0.648 sec. Powered by WordPress