01要旨
付属 USB メディアのドライバーを 2 本とも入れる。USBDMX WIM7-64.exe が Jungo WinDriver 6 の本体、Martin Universal USB-DMX DriverInstall.exe がデバイス用 INF。片方だけでは付け替わらない。
デバイス INF(2006 年・R&D International NV 製)に署名が無い。そのため導入時だけドライバー署名の強制を解除する必要がある。これは Windows 11 固有の話ではなく、Windows 10 x64 でも同じ。
LightJockey 2.110.5 / Elation 2.200 は Demo mode。WIBU のライセンスドングルが無く、DMX ハードウェアの行が全てグレーアウトする。ライセンス不要で動くのは 2.7 系まで——そしてその 2.7 が実際に動いた(10 章)。
DMX が出た。LightJockey を一度も起動せず、自作の 32bit プログラムから純正 usbdmx.dll の Dmxbox() を呼んで、任意のチャンネルに任意の値を出力できた(送出 860 回成功・失敗 0)。09 章に手順。
USB のバイト列を当てにいくのをやめたこと。WinUSB で直接書く方法は書き込みが 799 回すべて成功するのに DMX が 1 ch も変化しなかった——箱が受け取って捨てていた。総当たりは 2 回の故障を生んだ道なので、正解を持っている純正 DLL を呼ぶ側に回った。
この資料の前の版の「入出力の向きは USB の alternate setting で決まる」は誤り。alt 1 に切り替えて 120 秒保持しても両ポートとも出力し続けた。向きを決めているのは alt ではない。他にも自分の想定を 3 つ実測で潰している(09 章)。
LightJockey 2.7 本体からも出た。Windows 11・ドングル無し・Detect DMX Hardware 抜きで、両ポートへショーの DMX を出力(10 章)。直したのは Hardware.Ini の TXD=11 の 1 行だけ。同じ機体で メディアプレイヤーの差し替えシムも通り、音まで出た。残る未達は DMX 入力(向きの切り替え方法が未解明)のみ。
02機器の同定
WinUSB 経由でディスクリプタを直接読んだ実測値。確定
Product "Martin Universal USB-DMX2"
Manufacturer "R&D International NV" <- 実際の設計元(Martin の OEM 元)
VID / PID 11BE / F0A8
bcdDevice 0212 USB 1.10 Class 255 (vendor specific)
MaxPower 480 mA bNumInterfaces 1
公式ヘルプ上の呼び名は Universal USB/DMX interface。5 ピン XLR を 2 口持つツインポート機で、1024 ch 出力(2 ユニバース)または512 ch 出力 + 512 ch 入力のどちらかに構成できる。最大 3 台まで繋いで 2048 out + 512 in。DMX 入力は 1 台目の 2 番(左)ポート固定で、入力に設定するとそのポートの LED が緑になる。
03動くドライバー
以下は「何が起きているか」の記録である。実際に別の PC へ入れるだけなら、ここに書いた手順を実行できる形にした配布物がある——MartinUSB-DMX_Win11導入キット(12.7 MB)。ドライバー 3 本と 2010 年版 usbdmx.dll を同梱してあるので、インストール CD を探す必要はない。
check.cmd は何も変更せず、「いま何が足りないか」だけを 6 項目の [OK] / [NG] で出す。困ったらいつでも実行してよい。詳しくは項目18の導入キット取扱説明書を参照。
ここがこの資料の本題。過去に Windows 10 で差し替えて動かした実績はあったが、どれを入れたかの記録が残っていなかった。今回 検証機 で実測して確定させた。
2 本セットで入れる — 役割が違う
USBDMX WIM7-64.exe
Jungo WinDriver 6 の本体+Martin 純正ツール。Win7 64bit 版(32bit 機は lUSBDMX WIN7.exe)
- サイズ
- 4,667,952 B
- 日付
- 2012-07-21
- SHA-1
- 47CCB8EC28C07E2D80FB6E5E7527AF06728E7625
Martin Universal USB-DMX DriverInstall.exe
デバイス用 INF(VID_11BE&PID_F0A8 を WinDriver に結び付ける)。C:\WINDOWS\inf\ に置くだけで、登録は別途必要
- サイズ
- 486,399 B
- 日付
- 2010-07-17(中の INF は 2006)
- SHA-1
- DA787B772C56450AAB477DE3512973A690C7B32C
どちらも付属 USB メディアの \LightJockey\HardwareDrivers\Universal USBDMX\ にある。
CD 同梱の ReadMeFirst.txt は 2010 年版を「Win 9x/2000/XP 用」と読める書き方をしており、当初それを鵜呑みにして 2 本目を不要と判断した。実際は 役割が違う 2 本で、両方要る。1 本目だけでは Jungo のランタイムが入るだけで、デバイスは古いドライバーに紐づいたままになる。
1 本目が入れるもの 確定
| 種別 | 内容 |
|---|---|
| ドライバー | oem110.inf = windrvr6.inf プロバイダー Jungo / クラス Jungo / v10.1.0.0 (2009-09-02) / 署名 Jungo LTD |
| カーネル | C:\Windows\System32\drivers\windrvr6.sys 254,464 B |
| 前提条件 | Microsoft Visual C++ 2005 SP1 (x86) 再頒布 8.0.59193 インストーラーが自動で要求する |
| アプリ登録 | Martin Universal USB-DMX v2.2.364.0 |
| 同梱ツール | dmx_box_test.exe (95,632 B) USB_DMX_config.exe (75,152 B) Manual USB-DMX.pdf (170,481 B) |
dmx_box_test.exe は LightJockey を使わずに DMX を出せる Martin 純正アプリ。ライセンス(WIBU ドングル)は要らない。まずこれで「出る」を確定させてから自作アプリに進むのが最短。
32bit 機と旧 Windows
- 32bit の Windows なら同じ場所の
lUSBDMX WIN7.exe(8,206,592 B / SHA-1 CE2EE5E4652CB7E47ACB31B7F94F8EF92B19891E) Martin Universal USB-DMX DriverInstall.exe(486,399 B・2010・Inno Setup)は Win 9x/2000/XP 用の旧版。Win10 / Win11 では使わない
手順
- インストーラーを昇格して実行する
- 前提条件 Visual C++ 8.0 (x86) Redist の
Install→ EULA のYes - 本体ウィザードの
Next >→Install - 「Windows セキュリティ」(発行元 Martin Professional の信頼確認)で
インストール
ここは人の判断。自動で押すべきではない - USB を抜いて、同じポートに挿し直す
ファイルが入っただけではServiceはWINUSBのまま。既存デバイスを Jungo 側へ付け替えるには再列挙が要る
UIPI。昇格したインストーラーの窓へ、非昇格プロセスからの合成入力(BM_CLICK・マウス)は Windows が黙って捨てる。エラーも出ない。操作する側も昇格させること。
合成マウスクリックでは動かないダイアログがある。SendMessage(dlg, WM_COMMAND, MAKEWPARAM(id, BN_CLICKED), hBtn) が確実だった。
ボタン文字列には & と後置記号が付く(&Next > &Install &Yes)。正規表現を末尾固定にすると当たらない。そして「インストールしない」を必ず弾くこと — ^インストール だけで拾うと誤爆する。
★ 最大の関門 — 署名なし INF
2 本目が置く INF は C:\WINDOWS\inf\Martin Universal USB-DMX2.inf(1,985 B)。中身はこう:
; Copyright (c) 2006 R&D International NV
Signature="$CHICAGO$" DriverVer=04/05/2006, 8.0.1
[DeviceList.NTamd64]
"Martin Universal USB-DMX" = Install, USB\VID_11BE&PID_F028
"Martin Universal USB-DMX2" = Install, USB\VID_11BE&PID_F0A8
[Install.NT.Services]
Addservice = WinDriver6
ServiceBinary = %10%\System32\Drivers\windrvr6.sys
CatalogFile= の行が無い = 署名されていない。そのため素のままでは弾かれる。
> pnputil /add-driver "C:\WINDOWS\inf\Martin Universal USB-DMX2.inf" /install
ドライバー パッケージを追加できませんでした:
サードパーティの INF にデジタル署名情報が含まれていません。
この制約は Windows 10 x64 でも全く同じ。販売元の手順書も「win10 システムは、まずドライバー署名強制機能を無効にする必要があります」と明記している。Windows 11 が特別に厳しいわけではない。
重い方(2009 年製の Jungo カーネルドライバー windrvr6.sys)は署名強制を切らずにそのまま読み込まれた。Jungo LTD の正規署名が効いているため。引っかかるのは 2006 年のデバイス INF 1 枚だけ。
署名強制を 1 回だけ解除する
設定 → 回復 → PC の起動をカスタマイズする(今すぐ再起動)→ トラブルシューティング → 詳細オプション → スタートアップ設定 → 再起動 → 7 番。
pnputil /add-driver ではなく、デバイス直接インストールの経路を使う。前者はドライバーストアへの登録なので、署名強制を切っても署名を要求して失敗し続ける。
UpdateDriverForPlugAndPlayDevices(
NULL,
"USB\VID_11BE&PID_F0A8", // HardwareId
"C:\WINDOWS\inf\Martin Universal USB-DMX2.inf", // INF
INSTALLFLAG_FORCE, &rebootRequired);
-> 戻り値 True / err = 0 ★成功
これは Device Manager の「ドライバーの更新 → コンピューターを参照 → ディスク使用」と同じ経路。
結果 確定
| 時点 | Status | Service | Class |
|---|---|---|---|
| 差し替え前 | OK | WINUSB | USBDevice |
| 差し替え後 | OK | WinDriver6 | MEDIA |
そして Martin 純正の設定ツール USB_DMX_config.exe がデバイスを掴んだ:
Universal USB DMX configuration tool
USB devices:
Martin universal USB DMX v02.12 A:1 B:2
Universe settings: [OUT] [OUT] [Update] [Clear config]
USB_DMX_config.exe の実画面。箱の実物図に、左が B(ユニバース 2)、右が A(ユニバース 1)と描かれ、それぞれの下に OUT ボタンが付く。◀ ▶ でユニバース番号を変え、Update で機器へ書き込む。v02.12 は USB ディスクリプタの bcdDevice=0212 と一致。LightJockey を介さずに、ライセンスも要らずに、機器の設定まで届いた。
公式ヘルプは「DMX 入力は 1 台目の 2 番(左)ポート」と書いている。USB ディスクリプタの alt 1 は「0x02 OUT + 0x88 IN」で、ポート 2 が入力側だと示していた。そして設定ツールの実物図は、左に B(ユニバース 2)を描いている。
ドキュメント・USB の実測・純正ツールの画面 — 独立した 3 つが、同じポート対応に収束した。これで OUT ボタンをどちらに押せば何が起きるかを、迷わず決められる。
dmx_box_test.exe のほうは Not connected と赤い ✕ を出すが、これは画面に書かれているとおり ポート A と B をケーブルで繋ぐループバック自己診断のことで、機器が見えていないという意味ではない。
042 つの世代
同じ機器に対して、まったく別系統のドライバーが 2 つ存在する。ここを取り違えると「デバイスは正常に動いているのに、ソフトから掴めない」という状態になる。
| 2017 年版(既定で入る) | 2012 年版(付属メディア) | |
|---|---|---|
| .inf | martincontroller.inf v18.9.33.584 | windrvr6.inf v10.1.0.0 |
| ドライバーモデル | WinUSB(Windows 標準) | Jungo WinDriver 6 |
| 署名 | Martin Professional ApS | Jungo LTD |
| 使う LightJockey | 2.110.5 / Elation 2.200 | 2.7 系 |
| その DLL | MartinDuoDMX.dll WIBU 保護・ライセンス必須 | usbdmx.dll 保護なし・解析可 |
| ライセンス | ドングル必須 | 不要 |
今回発生した症状は、この食い違いそのものだった。検証機 には 2017 年の WinUSB ドライバーが入っていたのに、動かそうとしていた LightJockey は 2006 年の usbdmx.dll。あの DLL は WD_UTILS.dll(Jungo WinDriver)を import しており、それがマシン上のどこにも無かった。DLL がロードすらできないので、LightJockey は「インターフェースが 1 台も無い」と判断していた。
05USB 実測
ドライバーを差し替える前に、WinUSB 状態のまま自作プローブでディスクリプタを読んだ。インターフェースは 1 本だが alt setting が 4 つあり、それが 4 つの入出力構成そのものだった。確定
| alt | エンドポイント | 意味 |
|---|---|---|
| 0 | 0x81 IN Int(4B) / 0x02 OUT Bulk / 0x04 OUT Bulk | 2 ポートとも DMX 出力 |
| 1 | 0x81 IN Int(4B) / 0x02 OUT Bulk / 0x88 IN Bulk | ポート1 = 出力 / ポート2 = 入力 |
| 2 | 0x81 IN Int(4B) / 0x04 OUT Bulk / 0x86 IN Bulk | ポート1 = 入力 / ポート2 = 出力 |
| 3 | 0x81 IN Int(4B) / 0x86 IN Bulk / 0x88 IN Bulk | 2 ポートとも DMX 入力 |
ここからポート対応が確定する — ポート1 = OUT 0x02 / IN 0x86、ポート2 = OUT 0x04 / IN 0x88。alt 1 が公式ヘルプの「DMX 入力は 2 番(左)ポート」という記述と一字一句合う。
全 alt に共通の 0x81(4 バイト Interrupt IN・Interval=1)は、旧 usbdmx.dll の「送れるか?」問い合わせに相当するとみられる。推定
電源投入時の既定は alt 0(両ポート出力)で、ソフトが何も繋がっていなくても 全 ch 0 のフレームを 37 Hz で送出し続ける。DMX モニターで両ポートに信号が見えるのはこのため。異常ではない。
06ライセンスの壁
検証機 には LightJockey が既に 3 本入っていた。新しい方を使えば解決すると考えたが、そこで止まった。
Protection device not found or drivers not installed (Errorcode 0x00000001)
LightJockey License: Not found (Demo mode only)
USB Interface 1 / 2 / 3 の行が全てグレーアウト。Port A / Port B のコンボも操作不可。Demo mode では DMX ハードウェアを一切扱えない。
LightJockey 2 系(2.100 以降)は WIBU の保護デバイスを要求する。歴史的には、古い世代では DMX インターフェース自体がライセンスキーを兼ねていたが、後の版で別売ドングルへ移行した。推定
ただし、大きな手がかりがあった
2.110.5 が使う MartinDuoDMX.dll(1,684,992 B・2017-08-31・32bit)のエクスポートを見ると、旧 usbdmx.dll と同じ関数が出ている。
?Dmxbox@@YGKKEHPAX@Z <- 旧 usbdmx.dll と完全に同一
?GetSignature@@YGKPAE00@Z <- 新規(用途未確認)
つまり Dmxbox(cmd, iface, n, buf) という API はそのまま生きている。USB の生プロトコルを解読する必要はない。ただし MartinDuoDMX.dll 自体は WIBU AxProtector で暗号化されており(セクションが __wibu00〜__wibu07)、静的な逆アセンブルはできない。確定
07壊しかけた記録
ドライバー差し替えに至る前に、WinUSB 直叩きで DMX を出そうとして デバイスを 2 回、USB バスから落とした。2 回とも抜き挿しで復帰し、恒久的な損傷は無い。同じことを繰り返さないための記録。
| # | 条件 | 結果 |
|---|---|---|
| 1 | 単ポート・40 Hz・25 秒・固定フレーム・状態パイプを毎周期ドレイン | 正常 799/799 成功・失敗 0 |
| 2 | 両ポート同時・40 Hz・40 秒・ドレインは 2 回/秒 | 異常 各ポート 成功 430 / 失敗 846 |
| 3 | 同上で再実行 | 脱落 デバイスがバス上から消滅 |
| 4 | 単ポート・30 Hz・毎周期ドレイン・連続失敗 20 で自動中止 | 脱落 成功 289 → 13.5 秒で err=31 → 赤 LED・DMX 停止 |
原因 推定
当初は「デバイスの実測 37 Hz を超えて投げたレート超過」と診断したが、これは外れだった。#4 で単ポート・30 Hz という控えめな条件に落としても同じように壊れたため、レートは原因ではない。
真の原因は、ベンダー固有の初期化シーケンスを 1 つも実行しないまま、バルクエンドポイントへデータを流し込んだこととみられる。本来の順序は 0x33 検出 → 0x37 インターフェース照会 → 0x01 オープン → その後にようやく 0x04/0x05 の送出ループ。前半 3 つは EP0 のベンダー制御転送で、それを飛ばしていた。開いてもいないインターフェースにフレームが溜まり、誰も掃き出さないまま溢れてファームがエラーに落ちた、と考えると挙動と整合する。
未知のハードウェアは、初期化手順が判るまで書き込まない。「エンドポイントが見えた」「1 回書けた」はプロトコルを理解したことにならない。ディスクリプタは完全に読めて公式仕様との対応も取れていたのに、初期化を飛ばしていたという一点で 2 回壊した。
1 回成功しただけの条件を「安全な条件」と呼ばない。#1 の 799/799 を根拠に安全だと考えたが、#4 で同条件系でも壊れた。n=1 は再現性ではない。
早すぎる根本原因の断定をしない。観測が 1 回しかない時点で「レート超過」と断定して対策まで作り、#4 で全部書き直しになった。
失敗カウンタは「積み上げる」のでなく「止める」ために使う。連続失敗での自動中止は #4 で実際に効いた(846 まで積み上がった #2 と違い 20 で停止)。
実機の目視情報は桁違いに強い。「LED が赤くなって DMX 停止」の一言で、こちらの書き込みがデバイスの送出状態そのものを壊したことが即座に確定した。リモートから数字だけ見ていた間は誤診から抜け出せていなかった。
08買うべきか
並行して、通販サイトに出ている同種のインターフェースを検討した。結論から言えば、いま買う必要はない。
| 項目 | 内容 |
|---|---|
| 商品名 | Original Martin Light Jockey USB 2.95 DMX-Schnittstelle 1024-Kanal-Software USB DMX PC 3D-Bühnenbeleuchtungscontroller WIN7 WIN10 |
| 価格 | ¥12,514 |
| 売り | 1024 チャンネル / LightJockey 2.95 ソフト付属 / Win7・Win10 対応 |
読み取れること
- 「2.95」という版数が本質。LightJockey 2.9x は WIBU ドングルを要求しない最後の世代。この出品が「ソフト付きで動く」と言えるのは、ライセンス機構が無い版だから
- 「Original Martin」の表記は額面どおりには取れない。純正の Universal USB/DMX インターフェースは本来この価格帯ではない。Martin が LightJockey II で新しい USB ドングルを導入したのは模倣品対策だったと記録されている 推定
- 付属ソフトの配布形態にも不明点が残る
純正機を既に持っている。今日、その機体に正しい世代のドライバー(2012年版・Jungo WinDriver)を入れ終えた。残っているのは USB の挿し直しと動作確認だけ。
しかも同じインストーラーが dmx_box_test.exe を置いていく。ライセンス不要で DMX を出せる純正ツールがもう手元にある。
まず挿し直して、そのツールで出力を確認する。そこで出れば、買う理由は消える。
予備機やもう 1 ユニバースが必要になった場合は、この出品ではなく 同じ付属メディアが使える純正中古を探す方が確実。今回の記録があれば、どの機体でも同じ手順で立ち上げられる。
09DMX が出た
LightJockey を一度も起動せず、自作の 32bit プログラムから実機の DMX を任意の値で出力できた。送出コマンドは 860 回連続成功・失敗 0。デバイスは一度も落ちなかった。
捨てた道 — バイト列を当てにいくこと
WinUSB でバルク OUT へ直接書く方法は、書き込みが 799 回すべて成功するのに DMX が 1 ch も変化しなかった。WinUsb_WritePipe の成功は「デバイスが受け取った」ことしか意味せず、箱はフレームを解釈できずに捨てていた。
ここでフレーム形式を総当たりする誘惑があったが、同じやり方で既に 2 回デバイスを落としている(07 章)。当てにいくのをやめ、正解を持っている純正 DLL を自分から呼ぶ方に切り替えた。これが正解だった。
鍵は 7 月に残っていたログだった
過去のセッションが usbdmx.dll の偽物(シム)を作り、LightJockey がそれをどう呼ぶかを記録していた。コマンド番号と引数がそのまま残っていた。
| cmd | 引数 | 意味 |
|---|---|---|
| 0x33 | b=3, n=VID, buf=PID | デバイス登録。buf はポインタではなく PID の数値 |
| 0x37 | buf[0..1] | 接続済みデバイスを 1 個取り出す |
| 0x1A | b=デバイス添字 | 開始 |
| 0x04 | n=ポート番号 | 「送れるか」問い合わせ |
| 0x05 | n=ポート番号, buf=512 B | DMX 送出 |
第 3 引数はポート番号だった(0 / 1)。ポート当たり約 31 ms 周期 = 32 Hz で、実測の 36〜37 Hz とよく合う。
依存 DLL を実測して版を選んだ 確定
usbdmx.dll | 組む WinDriver DLL | 検証機 での有無 |
|---|---|---|
| 2006 年版 53,248 B | WD_UTILS.dll | 有(2005-03-21) |
| 2010 年版 91,520 B | WDAPI921.dll | 有(2008-07-04) |
2010 年版が使う WDAPI921.dll は、実際に動いている USB_DMX_config.exe と同じものだった。だから 2010 年版を選んだ。前提として、デバイスは oem111.inf で WinUSB から WinDriver へ付け替える(純正 DLL は WinDriver 経由でしかデバイスを見ない)。
★ 自分の想定を 3 つ潰した
どれも「もっともらしい読み」だったが、実測すると違った。1 つでも信じたまま進んでいたら詰んでいた。
| 思っていたこと | 実際 | どう確かめたか |
|---|---|---|
0x33 が 0 を返す = デバイス検出成功 |
0 に意味は無い。「この VID/PID を探すよう登録した」だけ | 対照実験。存在しない VID DEAD / PID BEEF を渡しても 0x00000000 が返った |
0x37 はインターフェース番号を指定した照会 |
「接続済みデバイスを 1 個取り出す」操作。番号は入力ではなく置き場所 | 順序を 1,2,3,4 にすると iface 1 が成功。4,4,4,4 でも 1 回目だけ成功。番号に関係なく最初の 1 回だけ通る |
後続コマンドのデバイス添字は b = 0 |
b = 1 |
0x1A を b=0..3 で総当たり。b=1 だけが成功 |
7 月のログで b=0 に見えたのは、当時のシムが偽物で全部 0 を返していたため。LightJockey は嘘の応答に合わせて動いていた。偽物の応答から本物の仕様を推定してはいけない。実機で必ず検算する。
結果 確定
[0x33] 戻り値 = 0x00000000 ← この 0 に意味は無い
[0x37] iface 1 0x00000000 buf → 01 01 … ← 取り出し成功
[0x1A] b=0 エラー / b=1 成功 / b=2 エラー / b=3 エラー
→ デバイスの添字 b = 1
[0x05] 成功 860 / 失敗 0 ← 40 秒 / 25 Hz
| port | DMX モニター | 確認に使った値 |
|---|---|---|
| 0 | ユニバース 5 | ch001 = 255 |
| 1 | ユニバース 4 | ch005 = 200 / ch512 = 42 |
ch512 まで届くこと、そして送っていない側のポートが全 0 のままであることも確認した。
両ポート同時も通った 確定
0x04→0x05 をポート 0 / 1 交互に回す形 —— LightJockey 本体がやっているのと同じ手順 —— で、両ポートから同時に出せた。180 秒で 7,712 回成功・失敗 0。
確認用に、ch001 に 1 秒 1 段のカウンター、ch512 にポート番号を載せた。どちらのポートを見ているかが画面だけで判る。
| ユニバース 4 | ユニバース 5 | |
|---|---|---|
ch001 | カウンター | カウンター(左と常に一致) |
ch512 | 002(ポート1) | 001(ポート0) |
| その他 510 ch | 全 0 | 全 0 |
| 受信 | 38 Hz | 38 Hz |
ch512 = 002/ポート1)、右=ユニバース 5(ch512 = 001/ポート0)。両方の ch001 が 116 で揃っている——同じカウンターが同じ瞬間に両ポートへ届いている証拠である。他の 510 チャンネルは全て 000、受信はどちらも 38Hz。この 1 枚に、ポートの取り違えが無いこと・2 系統が同期していること・余計なチャンネルを触っていないことが同時に写っている。この日の午前、両ポート同時出力を安全のため封印していた。だがそれは MartinUsbSend(WinUSB でバルクへ直接書く経路)での話で、デバイスを 2 回落としたのもそちらである。純正 DLL 経由のこの手順は本来の使い方なので封印しない。
「両ポート同時が危ない」ではなく「直書きが危なかった」が正しい。経路が違えば危険性の評価も変わる。安全弁(30 Hz 上限・連続失敗 20 で自動中止・指定 ch 以外は必ず 0・終了時に全 0 復帰)は同じだけ掛けてある。
DMX モニターの Web UI は ws://<ip>/ws で全チャンネルを JSON 配信していた。これを読む小さな道具を書いたので、「送る → 自分で読んで確かめる」が閉じた。以後、実機確認のたびに人を呼ばなくてよい。
192.168.1.50 universe=4 hz=38 0 でない ch: ch512=42
192.168.1.52 universe=5 hz=38 全0
10LightJockey も動いた
LightJockey 2.7 が Martin Universal USB-DMX2 を掴み、両ポートへ実際のショーの DMX を出力した。Windows 11 上で、ドングル無しで、Detect DMX Hardware を一度も実行せずに。
原因 — 午前に自分で壊していた
[HARDWARE]
TXD=0 ← None(USB を一切見に行かない)
TXD=11 ← Universal USB-DMX(usbdmx.dll を使う) ★これに戻すだけ
この日の午前、Setup > Hardware Setup を開いて OK を押した。それだけで TXD が 11 から 0 に落ち、LJ は以後 USB を一度も見に行かなくなっていた。「Type: None」と表示されていたのはその結果である。
2026-08-02 の exe 解析が既にこう結論していた —— 「Hardware Setup を開いて OK を押すだけで TXD が現在値で保存され、一致しない方の USB 設定キーは消える」。書き込みルーチンが TXD を見て、一致しない側を DeleteKey する作りになっている。
この窓は Cancel で閉じること。画面カタログ採取のように「全部の窓を開けて回る」作業では、ここだけ除外する。
揃っている必要があった条件 確定
| 条件 | 値 | 外すとどうなるか |
|---|---|---|
| デバイスの割り当て | WinDriver6(oem111.inf) | WinUSB のままだと純正 DLL から見えない |
LJ_run\usbdmx.dll | 2010 年版(WDAPI921 と組む) | 2006 年版で通るかは未検証 |
Hardware.Ini | TXD=11 | USB を見に行かない |
実測 確定
LJ のプロセスがロードした DLL —— 私たちが通したのと同じ経路である。
usbdmx.dll E:\…\LJ_run\usbdmx.dll
WDAPI921.dll C:\WINDOWS\SYSTEM32\WDAPI921.dll
窓: TLJMainForm のみ。警告ダイアログは出ない
DMX モニターの実測値。ショーの実データである(128 = 中央値に置かれた Pan/Tilt 等)。
ユニバース4: ch001-004=128 ch012-015=128 ch023-026=128 ch034-037=128
ch045-048=128 ch056-059=128 ch072=8 ch115=128 ch151=8
ユニバース5: 同様に 128 が並び、さらに 76 本
LJ 起動中に自作プログラムで attach を試すと 0x37 が 0xD0000000 を返す。LJ がデバイスを排他的に握っている——つまり、たまたま箱が自走しているのではなく、LJ 本体が出している。
「Unsupported OS」は起動時ロードには効かない 確定
7 月に行き止まりだと思われた Detected Platform: Unsupported OS(LightJockey.exe には W2K Detected と W9X Detected しか無く、Windows 11 はどちらでもない)は、Detect DMX Hardware を止めるだけだった。TXD に従って起動時に DLL をロードする経路は通る。
XP SP3 互換モードは不要。今回は検出を一度も実行していない。
音も出た — メディアプレイヤーの差し替えシム 確定
DMX が出るようになったので、前日に作ってあった LJMediaPlayer.exe の差し替えシムを同じ機体に入れた。本物は 1998 年製で、映像表示面を作るのに DirectShow の IBasicVideo を要求し、Windows 11 の wmpdxm.dll がそれを E_NOINTERFACE で拒むため Delphi 例外で落ちる。LJ 本体・ショーデータ・操作手順を一切変えず、この 1 本だけ差し替えて迂回する。
LJMediaPlayer_orig.exe 505,344 B 2002-11-20 ← 本物(退避)
LJMediaPlayer.exe 67,535,995 B 2026-08-23 ← 差し替え版
Load → Play → 1 秒ごとの再生位置報告 → Stop まで、全段が往復した。
WM_COPYDATA dwData=0x191 "…\MediaPlayerSettings\<音源>.wav"
MCI open OK type=waveaudio length=299233 ms
-> Ack 3 を LJ へ -> play
位置報告 1105ms → 2086ms → 3079ms …(実時間で進行)
-> stop / Ack 3
シム単体を検証しようとして Stop-Process -Force を実行したが、そのとき LJ は実際に再生中だった(1 分 22 秒の地点で切れた)。ログを見て初めて気づいた。
実機の常駐プロセスを止める前に、それが使用中でないか確認する。今回は状態出力ファイルを先に読めば「位置報告が 1 秒ごとに進んでいる=再生中」と即座に判った。状態を外から見える場所へ出す仕組みは、自分が壊す前に読むためにもある。
11次の手順
この資料の前の版に「入出力の向きは USB の alternate setting で実行時に選ぶ」と書いたが、実測で否定された。alt 0 → 1(ポート B を入力に)へ切り替えて 120 秒保持しても、GetCurrentAlternateSetting は 1 を返すのに両ポートとも DMX を出し続けた。向きを決めているのは alt ではない。ディスクリプタ上の対応(05 章の表)は事実だが、それが向きの操作方法だという読みが誤りだった。
- 入力(DMX IN)の実現方法を
Dmxbox側で探す
向きは純正 DLL のコマンドで切り替わる可能性が高い。0x01〜0x3Dのうち固有ハンドラを持つ 10 個が候補 - Art-Net → この箱、の中継を作る
ここまで来れば、既存の Art-Net 資産をそのまま実 DMX に出せる - LightJockey 本体から出したいなら
usbdmx.dllの検出問題を別途詰める
ただし自作アプリで DMX を出すだけなら LightJockey は要らなくなった
以前、WinDriver の API(WDU_Init ほか)を自作アプリから直接呼んで試したが、WDU_Init は Success を返すのにデバイスが 1 台も割り当てられなかった。WDU_Init はライセンス文字列を引数に取り、こちらは空文字を渡していたためである。
Jungo WinDriver のライセンスはベンダーごとの再頒布契約で、Martin の製品に付随して Martin の製品のためにある。そのキーを自作ソフトに流用することはしない——技術的に可能かどうかとは別の話として。
いま動いている経路はそれとは違う。Martin 純正の usbdmx.dll を、Martin のハードウェアを動かすために、そのまま呼んでいる。ライセンスは DLL の中で完結しており、こちらは何も取り出していない。これは想定された使い方である。
署名強制を切った起動は最初の一度きりで済む。oem111.inf としてドライバーストアに登録済みなので、以後は通常起動のまま oem35.inf(WinUSB)と oem111.inf(WinDriver)を自由に付け替えられる。再起動しても両方の状態が維持される。
WDAPI921.dll は 32bit なので、呼ぶ側も x86 必須。検証機 の x86 ランタイムは 7.0 までなので net7.0-windows で作る。