Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

This article is a Private article. Only a writer and users who know the URL can access it.
Please change open range to public in publish setting if you want to share this article with other users.

M5Stack StampS3でDMX512をArtNetに変換してgrandMA3 onPCに接続する

0
Last updated at Posted at 2025-12-11

M5Stack StampS3でDMX512をArtNetに変換してgrandMA3 onPCに接続する

はじめに

照明現場で使用しているDMXコンソールの出力を、grandMA3 onPC でリアルタイムにシミュレーション確認したい!

そこで、M5Stack StampS3 を使ってDMX512信号をArtNetに変換し、WiFi経由でPCに送信するブリッジデバイスを作成しました。

システム構成

[DMXコンソール] 
      │
      │ DMX512 (RS-485)
      ▼
[M5Stack StampS3 + RS-485モジュール]
      │
      │ WiFi (STA mode)
      ▼
[ルーター: STA-LIGHT-CONT]
      │
      │ LAN / WiFi
      ▼
[PC: 192.168.1.102]
      │
      ├── artnet_monitor_512.py (Pygame モニター)
      │
      └── grandMA3 onPC (シミュレーター)

必要な部品

部品 説明
M5Stack StampS3 ESP32-S3搭載の小型マイコン
RS-485モジュール DMX信号の受信用(MAX485など)
5V電源 USB-Cまたは外部電源
XLR 5pinまたは3pin DMX入力コネクタ

ハードウェア接続

StampS3 ピンアサイン

機能 GPIO 接続先
DMX RX 44 RS-485 RO
DMX TX 43 RS-485 DI (未使用)
DMX EN 46 RS-485 DE/RE
NeoPixel 21 内蔵LED

RS-485モジュール接続図

[DMX XLR]          [RS-485]           [StampS3]
  Pin1 ─── GND ─────┬─ GND ──────────── GND
  Pin2 ─── Data- ───┤─ A
  Pin3 ─── Data+ ───┤─ B
                    │─ RO ───────────── GPIO44 (RX)
                    │─ DI ───────────── GPIO43 (TX)
                    │─ DE/RE ─────────── GPIO46 (EN)
                    └─ VCC ──────────── 3.3V

image.png

ファームウェア開発

PlatformIO設定

platformio.ini:

[env:m5stack-stamps3]
platform = espressif32
board = m5stack-stamps3
framework = arduino
monitor_speed = 115200
upload_speed = 1500000
upload_port = COM46
monitor_port = COM46
lib_deps = 
    someweisguy/esp_dmx@^4.1.0
    fastled/FastLED@^3.6.0
    rstephan/ArtnetWifi@^1.5.1
build_flags = 
    -DARDUINO_USB_CDC_ON_BOOT=1
    -DARDUINO_USB_MODE=1

ソースコード(抜粋)

src/main.cpp:

#include <Arduino.h>
#include <WiFi.h>
#include <esp_dmx.h>
#include <FastLED.h>
#include <ArtnetWifi.h>

// WiFi STA設定
const char* WIFI_SSID = "STA-LIGHT-CONT";
const char* WIFI_PASS = "your_password";

// ArtNet送信先
const char* ARTNET_HOST = "192.168.1.255";  // ブロードキャスト
const int ARTNET_UNIVERSE = 1;              // Universe 1

// DMX設定(StampS3ポート)
#define DMX_TX_PIN      43
#define DMX_RX_PIN      44
#define DMX_EN_PIN      46
#define DMX_PORT        1

// NeoPixel LED設定
#define LED_PIN         21
#define NUM_LEDS        1
CRGB leds[NUM_LEDS];

ArtnetWifi artnet;
static uint8_t dmx_data[DMX_PACKET_SIZE];

void setup() {
    // NeoPixel初期化
    FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS);
    leds[0] = CRGB::Green;
    FastLED.show();
    
    // WiFi接続
    WiFi.mode(WIFI_STA);
    WiFi.begin(WIFI_SSID, WIFI_PASS);
    while (WiFi.status() != WL_CONNECTED) {
        delay(250);
    }
    leds[0] = CRGB::Blue;
    FastLED.show();
    
    // ArtNet初期化
    artnet.begin(ARTNET_HOST);
    artnet.setLength(512);
    artnet.setUniverse(ARTNET_UNIVERSE);
    
    // DMX初期化
    dmx_config_t dmx_config = DMX_CONFIG_DEFAULT;
    dmx_personality_t personalities[] = {};
    dmx_driver_install(DMX_PORT, &dmx_config, personalities, 0);
    dmx_set_pin(DMX_PORT, DMX_TX_PIN, DMX_RX_PIN, DMX_EN_PIN);
}

void loop() {
    dmx_packet_t packet;
    if (dmx_receive(DMX_PORT, &packet, 0)) {
        if (!packet.err) {
            dmx_read(DMX_PORT, dmx_data, packet.size);
            
            // LED赤(受信中)
            leds[0] = CRGB::Red;
            FastLED.show();
            
            // ArtNet送信
            for (int i = 0; i < 512; i++) {
                artnet.setByte(i, dmx_data[i + 1]);
            }
            artnet.write();
        }
    }
}

NeoPixel LED状態表示

状態
🟢 緑点滅 WiFi接続中
🔵 青 WiFi接続OK、DMX待機中
🔴 赤 DMX受信中(ArtNet送信中)
🟡 黄 WiFi未接続

PCモニターアプリ作成

Pygameを使用した512chフルモニターを作成しました。

特徴

  • 512ch全チャンネル表示(スクロール対応)
  • 列数可変(4〜64列)
  • Universe切り替え(0〜15)
  • 受信周波数・FPS表示
  • 設定の保存/復元

スクリーンショット 2025-12-11 173029.png

使い方

cd tool
python artnet_monitor_512.py
キー 機能
+/- 列数変更
↑↓ スクロール
ESC 終了

grandMA3 onPC への接続

ネットワーク確認

まず、PCのIPアドレスを確認:

ipconfig
イーサネット アダプター イーサネット 2:
   IPv4 アドレス . . . . . . . . . . . .: 192.168.1.102

StampS3と同じ 192.168.1.x ネットワークであることを確認。

トラブル1: artnet_monitor_512.pyでは受信できるがgrandMA3で受信できない

原因:

  • PCに複数のネットワークアダプタがあり、grandMA3が別のインターフェースを使用していた

解決策:

  1. grandMA3 → Menu → Setup → Network
  2. MA-Net Interface で正しいIP(192.168.1.102)を選択

grandMA3 Network設定.png

トラブル2: Universe設定

最初はUniverse 0で設定していたが、grandMA3との互換性のためUniverse 1に変更。

const int ARTNET_UNIVERSE = 1;  // Universe 1に変更

接続成功!

artnet_monitor_512.pyとgrandMA3 onPCの両方でDMX信号を同時受信できました。

grandMA3 DMXシート.png

grandMA3 onPC 動作映像

秋田MA3Verup確認20251211
https://youtu.be/Ffe3z1hL97E
スクリーンショット 2025-12-11 201047.png

同時受信の仕組み

Pythonスクリプトで SO_REUSEADDR を設定しているため、複数のアプリケーションが同じUDPポート(6454)を共有できます。

self.sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

まとめ

完成した構成

項目
StampS3 WiFi SSID STA-LIGHT-CONT
ArtNet送信先 192.168.1.255 (ブロードキャスト)
Universe 1
送信レート 約40Hz
PC IP 192.168.1.102

動作確認

DMXコンソール → StampS3 → WiFi → artnet_monitor_512.py ✅
                              → grandMA3 onPC ✅

これで、現場のDMXコンソール出力をgrandMA3 onPCでリアルタイムにシミュレーション確認できるようになりました!

参考リンク

おまけ: grandMA3 ショーファイルのインポート

現場で作成したショーファイルをgrandMA3 onPCで読み込む方法:

USBドライブから読み込み

  1. .show ファイルをUSBメモリのルートにコピー
  2. grandMA3 → Backup 画面を開く
  3. 右上の 「Internal」「USB」 に切り替え
  4. ファイルを選択して 「Load」

フォルダに直接コピー

ショーファイル保存場所:

C:\ProgramData\MALightingTechnology\gma3_library\datapools\shows\

このフォルダに .show ファイルをコピーして、grandMA3を再起動すればリストに表示されます。

⚠️ 管理者権限について

C:\ProgramData\ フォルダへの書き込みには管理者権限が必要な場合があります。

  • エクスプローラーでコピー: 「管理者としてエクスプローラーを実行」するか、コピー時に管理者権限の確認ダイアログで「続行」をクリック
  • コマンドラインでコピー: 管理者として実行したPowerShell/コマンドプロンプトを使用
# 管理者権限でPowerShellを開いて実行
Copy-Item "D:\Backup\MyShow.show" "C:\ProgramData\MALightingTechnology\gma3_library\datapools\shows\"

読み込みオプション

オプション 説明
Show Data ショーデータ本体
Local Settings ローカル設定
Output Stations 出力設定
DMX Protocols ArtNet等のプロトコル設定

ソースコード

GitHub: (リポジトリURLを記載)


応用編: 現場のムービングライト制御システムとの連携

現在のシステム構成

この画面では、EyeTrack ERA300 というムービングライト制御システムからDMX出力を行っています。

[EyeTrack ERA300 コントローラ]
      │
      │ DMX512 出力
      ▼
[M5Stack StampS3] ──WiFi──> [grandMA3 onPC]
      │
      ▼
[ムービングライト器具 x4]

grandMA3 で器具配置・パラメータを確認する方法

1. Patch画面で器具情報を確認

  1. MenuPatch を開く
  2. パッチされた器具の一覧が表示される
  3. 各器具の DMXアドレスユニバースチャンネル数 を確認

2. DMXシートでリアルタイム値を確認

  1. MenuMoreDMX Sheet を開く
  2. Universe を選択
  3. 各チャンネルの現在値がリアルタイムで表示される

3. 3Dビューで器具位置を確認

  1. MenuMore3D を開く
  2. 器具の物理的な配置を視覚的に確認
  3. Pan/Tilt の動きをシミュレーション確認

プログラムパラメータとの比較確認方法

EyeTrack ERA300 のソースコード(main.c)で定義されている器具配置:

// 各器具の位置と基準角度を配列で定義 (x, y, z, 基準Pan角度)
float fixtures[NUM_FIXTURES+1][4] = {       
    {-12.500f , -9.500f ,12.500f , 9.500f  },  // 部屋 Xmin Ymin Xmax Ymax
    {-10.055f , -5.490f , 6.000f ,  90.0f  },  // 器具1の位置と基準Pan角度
    {-10.055f ,  5.490f , 6.000f , 270.0f  },  // 器具2の位置と基準Pan角度
    { 10.055f , -5.490f , 6.000f ,  90.0f  },  // 器具3の位置と基準Pan角度
    { 10.055f ,  5.490f , 6.000f , -90.0f  }   // 器具4の位置と基準Pan角度
};

確認手順

項目 EyeTrack (main.c) grandMA3 (3D/Patch)
器具1 X座標 -10.055m Patch → Position X
器具1 Y座標 -5.490m Patch → Position Y
器具1 高さ 6.000m Patch → Position Z
器具1 基準Pan 90.0° Patch → Rotation
Pan最大角度 540° Fixture Profile
Tilt最大角度 240° Fixture Profile

今後の目標: 器具配置変更の自動化

現在は器具の配置が変更になった場合、main.cfixtures[] 配列を手動で修正する必要があります。

自動化計画

[grandMA3 ショーファイル (.show)]
      │
      │ エクスポート (XML/CSV)
      ▼
[Pythonスクリプト: extract_fixture_positions.py]
      │
      │ パース&変換
      ▼
[fixtures.h 自動生成]
      │
      │ ビルド
      ▼
[EyeTrack ERA300 ファームウェア更新]

実装予定の機能

  1. grandMA3 データエクスポート

    • 器具のPosition (X, Y, Z)
    • Rotation情報
    • DMXアドレス割り当て
  2. Pythonスクリプトで変換

    • grandMA3の座標系 → EyeTrackの座標系
    • 基準Pan角度の自動計算
  3. Cヘッダファイル自動生成

    // fixtures_auto.h - 自動生成ファイル
    #define NUM_FIXTURES 4
    float fixtures[NUM_FIXTURES+1][4] = {
        // 自動生成データ
    };
    
  4. ビルド&フラッシュの自動化

    • VS Code タスクから一発実行

現場フィールド対応手順

新しい会場でEyeTrack ERA300を設置する際の手順をまとめます。

Step 1: grandMA3で器具情報を確認

  1. Patch画面を開く: Menu → Patch
  2. 各器具の情報を記録:
    • DMXアドレス(Universe.Address)
    • Position X, Y, Z(器具の物理位置)
    • Rotation(器具の向き)
例: MINAMIAOYAMA会場
┌─────────────┬─────────┬───────────────────┬─────────┐
│ DMX Address │ FID     │ Position (X,Y,Z)  │ Rot X   │
├─────────────┼─────────┼───────────────────┼─────────┤
│ 1.1-21      │ 12      │ -5.0, -5.5, 3.4   │ 180°    │
│ 1.22-42     │ 14      │ -5.0,  4.0, 3.4   │   0°    │
│ 1.43-63     │ 13      │  5.0, -5.5, 3.4   │ 180°    │
│ 1.64-84     │ 15      │  5.0,  4.0, 3.4   │   0°    │
└─────────────┴─────────┴───────────────────┴─────────┘

Step 2: 会場別設定ファイルを作成

  1. 既存ファイルをコピー: fixtures_banq1.hfixtures_新会場名.h
  2. 以下の項目を編集:
// 1. 会場名・バージョン
#define VENUE_NAME      "新会場名"
#define VENUE_VERSION   "YYYY/MM/DD"

// 2. 部屋の移動範囲(ビームが当たる範囲)
{ Xmin, Ymin, Xmax, Ymax },

// 3. 器具位置(DMXアドレス順に記述!)
{ X, Y, Z, Pan基準角度 },  // 器具1: DMX 1-21
{ X, Y, Z, Pan基準角度 },  // 器具2: DMX 22-42
...

// 4. コントロール設定
#define VR_JOY_SEL      2     // グループ分け
#define JOY_DIR_X       (1)   // X方向: 1=正方向, -1=反転
#define JOY_DIR_Y       (1)   // Y方向: 1=正方向, -1=反転

Step 3: Pan基準角度を設定

grandMA3の Rot X から EyeTrackの Pan基準角度への変換:

器具の向き grandMA3 Rot X EyeTrack Pan基準
手前向き (Y<0) 180° 90°
奥向き (Y>0) 270° または -90°

Step 4: fixtures.h で会場を選択

#define VENUE_SELECT    3   // 新会場の番号

#elif VENUE_SELECT == 3
    #include "fixtures_新会場名.h"
    #define fixtures fixtures_新会場名

Step 5: ビルド&フラッシュ

VS Code タスク使用(推奨):

  • Ctrl+Shift+B → 「Build+Flash (uVision)」

コマンドライン:

# ビルドのみ
.\tools\run_build_only.bat

# フラッシュのみ(ST-Link)
.\tools\run_flash.bat

# ビルド&フラッシュ
.\tools\run_build_flash.bat

Step 6: 動作確認&調整

  1. grandMA3 3D ビューで器具の動きを確認
  2. 問題があれば調整:
症状 対処
器具の向きが逆 Pan基準角度を180°反転
左右が逆 JOY_DIR_X = -1
上下が逆 JOY_DIR_Y = -1
グループ分けが違う VR_JOY_SEL を変更
移動範囲が狭い/広い 部屋範囲 Xmin/Xmax/Ymin/Ymax を調整
  1. 再ビルド&フラッシュして確認を繰り返す

チェックリスト

  • grandMA3 Patchから器具位置を記録
  • DMXアドレス順で器具配列を作成(FID順ではない!)
  • Pan基準角度を正しく変換
  • 操作位置に合わせてJOY_DIR_X/Y を設定
  • VR_JOY_SELでグループ分けを設定
  • 移動範囲を会場に合わせて設定
  • ビルド&フラッシュ成功
  • grandMA3 3Dで動作確認OK

スクリーンショット 2025-12-12 084627.png
器具の方向が合わない
image.png
合いました
image.png


2025/12/12 会場別器具設定ファイルの分離

課題

従来は main.c 内に器具配置パラメータがハードコードされており、会場が変わるたびに #define BANQ 1 などを変更してリビルドが必要でした。

解決策: 設定ファイルの分離

器具配置パラメータを会場別のヘッダファイルに分離し、fixtures.h で切り替えるアーキテクチャを導入しました。

ファイル構成

src/
├── fixtures.h           # 会場選択マスターファイル
├── fixtures_banq1.h     # AKITA BANQ1 会場
├── fixtures_banq2.h     # AKITA BANQ2 会場
├── fixtures_aoyama.h    # 南青山 会場(新規)
└── main.c               # #include "fixtures.h" で切替

fixtures.h(会場選択)

#define VENUE_SELECT    3   // 1=BANQ1, 2=BANQ2, 3=MINAMIAOYAMA

#if VENUE_SELECT == 1
    #include "fixtures_banq1.h"
    #define fixtures fixtures_banq1
#elif VENUE_SELECT == 2
    #include "fixtures_banq2.h"
    #define fixtures fixtures_banq2
#elif VENUE_SELECT == 3
    #include "fixtures_aoyama.h"
    #define fixtures fixtures_aoyama
#endif

fixtures_aoyama.h(南青山会場)

grandMA3 Patch画面からのデータを元に作成:

#define VENUE_NAME      "MINAMIAOYAMA"
#define VENUE_VERSION   "2025/12/12"
#define NUM_FIXTURES    4

static const float fixtures_aoyama[NUM_FIXTURES + 1][4] = {
    /* 部屋範囲: Xmin, Ymin, Xmax, Ymax */
    { -6.000f, -6.000f, 6.000f, 5.000f },
    
    /* 器具1-4: X, Y, Z(高さ), 基準Pan角度 */
    { -5.000f, -5.500f, 3.400f,  90.0f },   // 左手前
    {  5.000f, -5.500f, 3.400f,  90.0f },   // 右手前
    { -5.000f,  4.000f, 3.400f, 270.0f },   // 左奥
    {  5.000f,  4.000f, 3.400f, -90.0f },   // 右奥
};

Pan基準角度の考え方

grandMA3の Rot X と EyeTrackの「基準Pan角度」は意味が異なります:

器具位置 grandMA3 Rot EyeTrack Pan基準 説明
手前側 (Y<0) 180° 90° 部屋中央を向く
奥側 (Y>0) 270° / -90° 部屋中央を向く

ビルド&フラッシュツール

ST-Link用のフラッシュスクリプトを追加:

tools/
├── run_build_flash.bat      # ビルド&フラッシュ(一発実行)
├── run_build_only.bat       # ビルドのみ
├── run_flash_stlink.bat     # ST-Link フラッシュ
└── run_flash_jlink.bat      # J-Link フラッシュ(予備)

実行例:

ST-LINK SN: 16004A002933353739303541
Device: STM32F405xx/F407xx (1024KB Flash)
Memory programmed in 1s and 922ms
Verification...OK

ジョイスティック方向設定(2025/12/12 更新)

会場によってジョイスティックの操作方向が直感と逆になる場合があります。
JOY_DIRECTIONJOY_SWAP_XY を設定するだけで、X/Y方向が自動計算されます。

設定パラメータ

/*  ジョイスティック方向設定(操作者の向き)*/
#define JOY_DIRECTION   90      /**< 操作者の向き: 0, 90, 180, 270 */
#define JOY_SWAP_XY     1       /**< X/Y軸入れ替え: 0=そのまま, 1=入れ替え */

JOY_DIRECTION 設定図

┌─────────────────────────────────────┐
│            高砂 (Y+)                │
│              180°                   │
│                                     │
│   左側      ┌───────┐      右側    │
│   (X-)      │ Stage │      (X+)    │
│   270°      └───────┘       90°    │
│                                     │
│             PA (Y-)                 │
│               0°                    │
└─────────────────────────────────────┘

設定組み合わせ

JOY_DIRECTION JOY_SWAP_XY 操作位置 結果
0 0 PA側から高砂を向く 標準
90 0 右側から左を向く 90°回転
180 0 高砂からPAを向く 180°回転
270 0 左側から右を向く 270°回転
90 1 右側から左(XY入替) AOYAMA会場

AOYAMA会場設定(2025/12/12確定値)

#define JOY_DIRECTION   90      // 操作者の向き
#define JOY_SWAP_XY     1       // X/Y軸入れ替え有効

これにより:

  • 上に倒す → 上(画面奥)に動く
  • 右に倒す → 右に動く

器具グループ設定 (VR_JOY_SEL)

ジョイスティック、フェーダ、カラー、高さ、アイリススイッチの左右グループ分けを会場ごとに設定できます。

設定パラメータ

/*  ジョイスティック/フェーダ/アイリス グループ設定 */
#define VR_JOY_SEL      3       /**< 1=左:1&3/右:2&4, 2=左:1&2/右:3&4, 3=左:3&4/右:1&2 */

グループ設定一覧

VR_JOY_SEL 左側 (Joy/Fader/Iris) 右側 (Joy/Fader/Iris)
1 器具1 & 3 器具2 & 4
2 器具1 & 2 器具3 & 4
3 器具3 & 4 器具1 & 2

会場別設定例

会場 VR_JOY_SEL グループ分け
MINAMIAOYAMA 2 左:1&2 / 右:3&4
AKITA BANQ1 1 左:1&3 / 右:2&4
AKITA BANQ2 1 左:1&3 / 右:2&4

DMXアドレスと器具配列の対応

重要: EyeTrackの器具配列順序は、DMXアドレス順に合わせる必要があります。

/**
 * grandMA3 Position → EyeTrack器具番号(DMXアドレス順):
 *   DMX 1-21  = 器具1: ERA300P 1 (FID 12) X=-5.000, Y=-5.500
 *   DMX 22-42 = 器具2: ERA300P 3 (FID 14) X=-5.000, Y= 4.000
 *   DMX 43-63 = 器具3: ERA300P 2 (FID 13) X= 5.000, Y=-5.500
 *   DMX 64-84 = 器具4: ERA300P 4 (FID 15) X= 5.000, Y= 4.000
 */

grandMA3のFID順(12,13,14,15)ではなく、DMXアドレス順(1,22,43,64→器具1,2,3,4)で配列を定義します。

image.png


MINAMIAOYAMA会場 現場調整記録(2025/12/12)

部屋サイズと移動範囲

部屋サイズ: 19m × 12.5m

移動範囲 器具位置 備考
X -9.5m ~ +9.5m ±5.0m 器具から4.5m外側まで
Y -6.5m ~ +7.5m -5.5m / +4.0m PA側1m、高砂側3.5m外側

器具配置詳細

        Y+(高砂側)+7.5m ← 移動上限
         ↑
         │     器具2         器具4
         │   (-5, +4)       (+5, +4)  ← Y=+4.0m
         │       ★             ★
    ─────┼───────────────────────────→ X+
  -9.5m  │     (0,0)                   +9.5m
         │       ★             ★
         │   (-5, -5.5)     (+5, -5.5) ← Y=-5.5m
         │     器具1         器具3
         ↓
        Y-(PA側)-6.5m ← 移動下限

最終設定値

/* 部屋範囲: Xmin, Ymin, Xmax, Ymax */
{ -9.500f, -6.500f, 9.500f, 7.500f },

/* 器具配置(DMXアドレス順) */
{ -5.000f, -5.500f, 3.400f,  90.0f },   // 器具1: DMX 1-21
{ -5.000f,  4.000f, 3.400f, 270.0f },   // 器具2: DMX 22-42
{  5.000f, -5.500f, 3.400f,  90.0f },   // 器具3: DMX 43-63
{  5.000f,  4.000f, 3.400f, -90.0f },   // 器具4: DMX 64-84

/* コントロール設定 */
#define VR_JOY_SEL      2       // 左:1&2 / 右:3&4
#define JOY_DIR_X       (-1)    // 左右反転(高砂から操作)
#define JOY_DIR_Y       (-1)    // 上下反転(高砂から操作)

EyeTrack ERA300 ジョイスティック方向設定

EyeTrack ERA300コントローラでは、設置向きに応じてジョイスティックの方向を4方向から選択できます。

設定パラメータ

fixtures_xxx.h で以下を設定:

// ジョイスティック方向設定(0, 90, 180, 270度)
#define JOY_DIRECTION   90

// X/Y軸入れ替え(0:通常, 1:入れ替え)
#define JOY_SWAP_XY     1

方向設定図

         JOY_DIRECTION = 0
              ▲ +Y
              │
    ◄─────────┼─────────►
   -X         │         +X
              │
              ▼ -Y

JOY_DIRECTION = 90   →  時計回り90度回転
JOY_DIRECTION = 180  →  180度回転
JOY_DIRECTION = 270  →  反時計回り90度回転

AOYAMA会場の設定(確認済み)

#define JOY_DIRECTION   90   // 90度回転
#define JOY_SWAP_XY     1    // X/Y軸入れ替え

📝 2025/12/12 追加 - 現場での動作確認済み


📝 2025/12/12 11:48 更新


器具種類変更時のパラメータ設定

ERA300以外のムービングライトを使用する場合、以下のパラメータを調整します。

器具固有パラメータ

/*===========================================================================*/
/*  Pan/Tilt 角度制限(器具仕様に合わせて変更)                               */
/*===========================================================================*/
#define PAN_MAX         540.0f  /**< パン(ヨー)の最大角度 */
#define TILT_MAX        240.0f  /**< ティルト(ピッチ)の最大角度 */

主要機種のPan/Tilt仕様

機種 PAN_MAX TILT_MAX DMX ch数 備考
Martin ERA 300 540° 240° 21ch Extended mode
Martin ERA 400 540° 240° 21ch Extended mode
Martin ERA 600 540° 240° 21ch Extended mode
Martin MAC Viper 540° 270° 36ch Standard mode
Robe Robin 600 540° 270° 34ch Mode 1
Clay Paky Sharpy 540° 250° 16ch Standard mode
ETC Source Four LED - - 7ch 固定器具

DMXチャンネル割り当て

器具によってDMXチャンネルの構成が異なります。main.cで以下を調整:

/* ERA300 Extended Mode (21ch) */
#define DMX_CH_PAN_COARSE     1   // Pan粗
#define DMX_CH_PAN_FINE       2   // Pan細
#define DMX_CH_TILT_COARSE    3   // Tilt粗
#define DMX_CH_TILT_FINE      4   // Tilt細
#define DMX_CH_DIMMER         5   // ディマー
#define DMX_CH_SHUTTER        6   // シャッター
// ... 以下器具仕様書参照

#define DMX_CHANNELS_PER_FIXTURE  21  // 1器具あたりのch数

新規器具追加時のチェックリスト

  • 器具仕様書でPan/Tilt角度を確認
  • DMXチャンネル構成を確認
  • PAN_MAX, TILT_MAX を更新
  • DMXチャンネル割り当てを更新
  • grandMA3で器具プロファイルを追加
  • 3Dビューで動作確認

grandMA3からのデータ受け渡し方法

方法1: Patch画面から手動転記(推奨)

最もシンプルで確実な方法です。

  1. grandMA3 → Menu → Patch を開く
  2. 器具一覧で以下を確認:
    • DMX Address: Universe.Address形式
    • Pos X, Y, Z: 3D位置(メートル)
    • Rot X: 回転角度
  3. fixtures_xxx.h に手動で記入

⚠️ ショーファイル形式について

grandMA3のショーファイル (.show) は独自バイナリ形式です。

ファイルヘッダ: GMA3....(マジックナンバー)
形式: 独自バイナリ(ZIP/XMLではない)
# 確認結果
PS> $bytes = [IO.File]::ReadAllBytes("*.show") | Select -First 8
PS> [Text.Encoding]::ASCII.GetString($bytes)
GMA3....

XMLエクスポートは非対応のため、以下の方法でデータを取得します。

方法2: grandMA3 MVRエクスポート(推奨)

grandMA3からMVR形式でエクスポートすると、ZIP形式でXMLファイルが取得できます。
これが最も簡単で確実なデータ抽出方法です。

エクスポート手順(GUI操作)

  1. Menu → Patch を開く
  2. Export をクリック(右上のメニューバー)
  3. MVR Export を選択
  4. ダイアログで設定:
    • File Name: 任意の名前(例: MINAMIAOYAMA_ERA300
  5. Export をクリック

Note: 設定はデフォルトのままでOK。全ての器具が出力されます。

エクスポート手順(コマンドライン)

# grandMA3 Command Line
Export MVR "MyVenue"

# 特定のショー名でエクスポート
Export MVR "MINAMIAOYAMA_ERA300"

エクスポート先フォルダ

C:\ProgramData\MALightingTechnology\gma3_library\mvr\

Note: バージョンによらず gma3_library\mvr\ フォルダに出力されます。

MVRファイルの構造

MVRファイル (.mvr) はZIP形式で、解凍すると以下の構造:

MyVenue.mvr (実体はZIP)
│
├── GeneralSceneDescription.xml   ← メイン:器具位置・DMXアドレス
├── fixtures/                      ← GDTF器具定義(オプション)
│   └── Martin@ERA 300 Profile@.gdtf
└── textures/                      ← 3Dテクスチャ(オプション)

MVRファイルの確認方法

# 1. MVRファイルを解凍(.mvrは.zipと同じ)
Expand-Archive -Path "MINAMIAOYAMA_ERA300.mvr" -DestinationPath "mvr_temp" -Force

# 2. XMLの内容を確認
Get-Content "mvr_temp\GeneralSceneDescription.xml" | Select-Object -First 100

# 3. 器具情報を抽出(簡易確認)
Select-String -Path "mvr_temp\GeneralSceneDescription.xml" -Pattern "Fixture|Matrix|Address"

XMLの読み方

GeneralSceneDescription.xml には以下の情報が含まれます:

要素 内容
<Fixture name="..."> 器具名 ERA300P 1
<Matrix> 4x4変換行列(位置・回転) {1,0,0,-5}{0,1,0,-5.5}...
<GDTFSpec> GDTF器具型番 Martin@ERA 300 Profile@
<Address break="0"> DMXアドレス 1
<Addresses> 複数アドレス対応 Universe.Address形式

Matrix解釈:

{1,0,0,X}{0,1,0,Y}{0,0,1,Z}{0,0,0,1}
         ↑         ↑         ↑
       X座標     Y座標     Z座標

方法3: CSVで手動記録

Patch画面を見ながらExcelやスプレッドシートに記録:

DMX FID Name Pos X Pos Y Pos Z Rot X
1.1 12 ERA300P 1 -5.000 -5.500 3.400 180
1.22 14 ERA300P 3 -5.000 4.000 3.400 0
1.43 13 ERA300P 2 5.000 -5.500 3.400 180
1.64 15 ERA300P 4 5.000 4.000 3.400 0

方法4: MVRファイルから自動抽出(将来実装予定)

MVR (My Virtual Rig) ファイルはZIP形式で解析可能:

MyVenue.mvr (ZIP形式)
├── GeneralSceneDescription.xml  ← 器具位置情報
├── fixtures/                     ← GDTF器具データ
└── textures/                     ← テクスチャ
# MVRファイルを解凍
Expand-Archive -Path "MyVenue.mvr" -DestinationPath "mvr_extracted"

# XML確認
Get-Content "mvr_extracted\GeneralSceneDescription.xml"

MVR XML例

<Fixture name="ERA300P 1" uuid="...">
    <Matrix>{1,0,0,-5.0}{0,1,0,-5.5}{0,0,1,3.4}{0,0,0,1}</Matrix>
    <GDTFSpec>Martin@ERA 300 Profile@</GDTFSpec>
    <Addresses>
        <Address break="0">1</Address>
    </Addresses>
</Fixture>

変換スクリプトの例(Python)

import xml.etree.ElementTree as ET
import zipfile
import re

def extract_from_mvr(mvr_file, output_header):
    with zipfile.ZipFile(mvr_file, 'r') as z:
        xml_content = z.read('GeneralSceneDescription.xml')
    
    root = ET.fromstring(xml_content)
    fixtures = []
    
    for fixture in root.findall('.//Fixture'):
        matrix = fixture.find('Matrix').text
        # Matrix から位置を抽出: {1,0,0,X}{0,1,0,Y}{0,0,1,Z}{0,0,0,1}
        values = re.findall(r'{[^}]+,([^}]+)}', matrix)
        x, y, z = float(values[0]), float(values[1]), float(values[2])
        
        addr = fixture.find('.//Address')
        dmx = int(addr.text) if addr is not None else 0
        
        fixtures.append({'x': x, 'y': y, 'z': z, 'dmx': dmx})
    
    # DMXアドレス順にソート
    fixtures.sort(key=lambda f: f['dmx'])
    
    # Cヘッダファイル生成
    generate_header(fixtures, output_header)

座標系の変換

grandMA3とEyeTrackでは座標系が同じですが、回転角度(Rot X)の解釈が異なります:

条件 grandMA3 Rot X EyeTrack Pan基準
器具が手前向き (Y<0) 180° 90°
器具が奥向き (Y>0) 270° or -90°
器具が右向き (X>0) 90°
器具が左向き (X<0) -90° 180°

変換式:

// grandMA3 Rot X → EyeTrack Pan基準
pan_base = 90.0f - rot_x;  // 基本変換
if (pan_base < -180.0f) pan_base += 360.0f;
if (pan_base > 180.0f) pan_base -= 360.0f;

データ受け渡しフロー

┌─────────────────────────────────────────────────────┐
│ grandMA3                                            │
│  ┌──────────────┐                                   │
│  │ Patch画面    │ ──→ 位置(X,Y,Z), 回転(Rot X)     │
│  │ 3D View      │ ──→ 視覚的に確認                 │
│  │ DMX Sheet    │ ──→ アドレス確認                 │
│  │ Export MVR   │ ──→ MVRファイル出力              │
│  └──────────────┘                                   │
└─────────────────────────────────────────────────────┘
          │
          │ 手動転記 or MVR解析スクリプト
          ▼
┌─────────────────────────────────────────────────────┐
│ fixtures_xxx.h                                      │
│  - 部屋範囲 (Xmin, Ymin, Xmax, Ymax)               │
│  - 器具位置 (X, Y, Z, Pan基準)                     │
│  - コントロール設定 (JOY_DIR, VR_JOY_SEL)           │
└─────────────────────────────────────────────────────┘
          │
          │ ビルド&フラッシュ
          ▼
┌─────────────────────────────────────────────────────┐
│ EyeTrack ERA300 コントローラ                        │
│  - DMX出力                                          │
│  - StampS3経由でgrandMA3に送信                     │
│  - 3Dビューで動作確認                               │
└─────────────────────────────────────────────────────┘

📝 2025/12/12 12:45 更新 - ショーファイル形式を修正(独自バイナリ)


MVRエクスポート実証と自動化方針(2025/12/12)

実証結果: MVRファイルと設定ファイルの比較

grandMA3から実際にMVRエクスポートを行い、現在の fixtures_aoyama.h と比較しました。

MVRファイル情報

ファイル: 20251114_MINAMIAOYAMA_ERA300_2P.mvr
場所: C:\ProgramData\MALightingTechnology\gma3_library\mvr\
サイズ: 3.6 KB

MVR XML から抽出したデータ

器具名 DMX X (mm) Y (mm) Z (mm) Matrix回転
ERA300P 1 1 -5000 -5500 3400 180°
ERA300P 2 43 5000 -5500 3400 180°
ERA300P 3 22 -5000 4000 3400
ERA300P 4 64 5000 4000 3400

現在の fixtures_aoyama.h

static const float fixtures_aoyama[NUM_FIXTURES + 1][4] = {
    { -9.500f, -6.500f, 9.500f, 7.500f },  // 部屋範囲
    { -5.000f, -5.500f, 3.400f,  90.0f },  // 器具1: DMX 1
    { -5.000f,  4.000f, 3.400f, 270.0f },  // 器具2: DMX 22
    {  5.000f, -5.500f, 3.400f,  90.0f },  // 器具3: DMX 43
    {  5.000f,  4.000f, 3.400f, -90.0f },  // 器具4: DMX 64
};

比較結果 ✅

項目 MVR fixtures_aoyama.h 一致
器具1 位置 -5.0, -5.5, 3.4 -5.000, -5.500, 3.400
器具2 位置 -5.0, 4.0, 3.4 -5.000, 4.000, 3.400
器具3 位置 5.0, -5.5, 3.4 5.000, -5.500, 3.400
器具4 位置 5.0, 4.0, 3.4 5.000, 4.000, 3.400
DMXアドレス 1, 22, 43, 64 1, 22, 43, 64

座標データは完全一致。 MVR自動解析が実用可能であることを確認。

自動化に必要な変換処理

1. 座標変換(単位)

MVR: ミリメートル (mm) → EyeTrack: メートル (m)
変換: value / 1000.0

2. 回転角度変換

MVRの<Matrix>から回転情報を抽出し、Pan基準角度に変換:

MVR Matrix:
  {-1,0,0,...} = 180°回転 → Pan基準 90°(手前向き)
  {1,0,0,...}  = 0°回転   → Pan基準 270°(奥向き)
Matrix[0][0] Matrix[1][1] grandMA3 Rot EyeTrack Pan
-1 -1 180° 90°
1 1 270° or -90°

3. DMXアドレス順ソート

MVRは器具名順(ERA300P 1, 2, 3, 4)で出力されるが、EyeTrackはDMXアドレス順で配列を構成:

MVR出力順:  1 → 2 → 3 → 4
DMX順:      1 → 43 → 22 → 64
EyeTrack順: 1 → 22 → 43 → 64 (ソート後)

自動化スクリプト仕様

入力

  • MVRファイル: *.mvr(ZIP形式)
  • 会場名: コマンドライン引数

出力

  • fixtures_xxx.h: Cヘッダファイル

処理フロー

1. MVRファイルを解凍
2. GeneralSceneDescription.xml を解析
3. 各Fixtureから以下を抽出:
   - name: 器具名
   - Matrix: 位置・回転
   - Address: DMXアドレス
4. DMXアドレス順にソート
5. 座標をメートルに変換 (mm → m)
6. 回転をPan基準角度に変換
7. fixtures_xxx.h を生成

手動設定が必要な項目

以下はMVRに含まれないため、手動設定が引き続き必要:

項目 理由
部屋範囲 (RANGE_*) ビーム移動範囲は器具位置とは別
VR_JOY_SEL 操作グループ分けは会場運用次第
JOY_DIR_X/Y 操作位置による方向感覚

今後の実装計画

Phase 1: PowerShellスクリプト(簡易版)

# mvr_to_fixtures.ps1
param([string]$MvrFile, [string]$VenueName)

$temp = "$env:TEMP\mvr_extract"
Expand-Archive -Path $MvrFile -DestinationPath $temp -Force

[xml]$xml = Get-Content "$temp\GeneralSceneDescription.xml"
$fixtures = @()

foreach ($f in $xml.SelectNodes("//Fixture")) {
    $matrix = $f.Matrix
    # 位置を抽出 (mm → m)
    $x = [regex]::Match($matrix, '\{[^}]+,([^}]+)\}').Groups[1].Value / 1000
    # ... 以下続く
}

Phase 2: Pythonスクリプト(完全版)

# tools/mvr_to_fixtures.py
def main():
    mvr_file = sys.argv[1]
    venue_name = sys.argv[2]
    
    fixtures = parse_mvr(mvr_file)
    header = generate_header(fixtures, venue_name)
    
    output = f"src/fixtures_{venue_name.lower()}.h"
    with open(output, 'w') as f:
        f.write(header)
    
    print(f"Generated: {output}")

Phase 3: VS Code タスク統合

{
    "label": "Generate fixtures from MVR",
    "type": "shell",
    "command": "python",
    "args": ["tools/mvr_to_fixtures.py", "${input:mvrFile}", "${input:venueName}"]
}

運用フロー(自動化後)

┌─────────────────────────────────────────────────────┐
│ 1. grandMA3 で器具配置を設定                        │
│    Patch画面で Position/Rotation を設定             │
└─────────────────────────────────────────────────────┘
          │
          │ Export MVR
          ▼
┌─────────────────────────────────────────────────────┐
│ 2. MVRファイル出力                                   │
│    C:\ProgramData\...\gma3_library\mvr\会場名.mvr   │
└─────────────────────────────────────────────────────┘
          │
          │ python mvr_to_fixtures.py
          ▼
┌─────────────────────────────────────────────────────┐
│ 3. fixtures_xxx.h 自動生成                          │
│    ※部屋範囲・JOY_DIR等は手動確認                   │
└─────────────────────────────────────────────────────┘
          │
          │ fixtures.h で会場選択
          │ ビルド&フラッシュ
          ▼
┌─────────────────────────────────────────────────────┐
│ 4. 動作確認                                          │
│    grandMA3 3Dビューで確認                          │
└─────────────────────────────────────────────────────┘

期待効果

項目 従来(手動) 自動化後
器具位置入力 5分/会場 0分(自動)
DMXアドレス確認 手動でPatch確認 自動抽出
入力ミス 発生しやすい なし
会場変更対応 15分〜 5分〜

メモ ファイルの場所

image.png
image.png

📝 2025/12/12 13:15 更新 - MVR実証完了、自動化方針策定

0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?