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
ファームウェア開発
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表示
- 設定の保存/復元
使い方
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が別のインターフェースを使用していた
解決策:
- grandMA3 → Menu → Setup → Network
- MA-Net Interface で正しいIP(192.168.1.102)を選択
トラブル2: Universe設定
最初はUniverse 0で設定していたが、grandMA3との互換性のためUniverse 1に変更。
const int ARTNET_UNIVERSE = 1; // Universe 1に変更
接続成功!
artnet_monitor_512.pyとgrandMA3 onPCの両方でDMX信号を同時受信できました。
grandMA3 onPC 動作映像
秋田MA3Verup確認20251211
https://youtu.be/Ffe3z1hL97E

同時受信の仕組み
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ドライブから読み込み
-
.showファイルをUSBメモリのルートにコピー - grandMA3 → Backup 画面を開く
- 右上の 「Internal」 → 「USB」 に切り替え
- ファイルを選択して 「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画面で器具情報を確認
- Menu → Patch を開く
- パッチされた器具の一覧が表示される
- 各器具の DMXアドレス、ユニバース、チャンネル数 を確認
2. DMXシートでリアルタイム値を確認
- Menu → More → DMX Sheet を開く
- Universe を選択
- 各チャンネルの現在値がリアルタイムで表示される
3. 3Dビューで器具位置を確認
- Menu → More → 3D を開く
- 器具の物理的な配置を視覚的に確認
- 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.c の fixtures[] 配列を手動で修正する必要があります。
自動化計画
[grandMA3 ショーファイル (.show)]
│
│ エクスポート (XML/CSV)
▼
[Pythonスクリプト: extract_fixture_positions.py]
│
│ パース&変換
▼
[fixtures.h 自動生成]
│
│ ビルド
▼
[EyeTrack ERA300 ファームウェア更新]
実装予定の機能
-
grandMA3 データエクスポート
- 器具のPosition (X, Y, Z)
- Rotation情報
- DMXアドレス割り当て
-
Pythonスクリプトで変換
- grandMA3の座標系 → EyeTrackの座標系
- 基準Pan角度の自動計算
-
Cヘッダファイル自動生成
// fixtures_auto.h - 自動生成ファイル #define NUM_FIXTURES 4 float fixtures[NUM_FIXTURES+1][4] = { // 自動生成データ }; -
ビルド&フラッシュの自動化
- VS Code タスクから一発実行
現場フィールド対応手順
新しい会場でEyeTrack ERA300を設置する際の手順をまとめます。
Step 1: grandMA3で器具情報を確認
- Patch画面を開く: Menu → Patch
-
各器具の情報を記録:
- 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: 会場別設定ファイルを作成
-
既存ファイルをコピー:
fixtures_banq1.h→fixtures_新会場名.h - 以下の項目を編集:
// 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) | 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: 動作確認&調整
- grandMA3 3D ビューで器具の動きを確認
- 問題があれば調整:
| 症状 | 対処 |
|---|---|
| 器具の向きが逆 | Pan基準角度を180°反転 |
| 左右が逆 | JOY_DIR_X = -1 |
| 上下が逆 | JOY_DIR_Y = -1 |
| グループ分けが違う |
VR_JOY_SEL を変更 |
| 移動範囲が狭い/広い | 部屋範囲 Xmin/Xmax/Ymin/Ymax を調整 |
- 再ビルド&フラッシュして確認を繰り返す
チェックリスト
- grandMA3 Patchから器具位置を記録
- DMXアドレス順で器具配列を作成(FID順ではない!)
- Pan基準角度を正しく変換
- 操作位置に合わせてJOY_DIR_X/Y を設定
- VR_JOY_SELでグループ分けを設定
- 移動範囲を会場に合わせて設定
- ビルド&フラッシュ成功
- grandMA3 3Dで動作確認OK
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) | 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_DIRECTION と JOY_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)で配列を定義します。
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画面から手動転記(推奨)
最もシンプルで確実な方法です。
- grandMA3 → Menu → Patch を開く
- 器具一覧で以下を確認:
- DMX Address: Universe.Address形式
- Pos X, Y, Z: 3D位置(メートル)
- Rot X: 回転角度
-
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操作)
- Menu → Patch を開く
- Export をクリック(右上のメニューバー)
- MVR Export を選択
- ダイアログで設定:
-
File Name: 任意の名前(例:
MINAMIAOYAMA_ERA300)
-
File Name: 任意の名前(例:
- 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) | 0° | 270° or -90° |
| 器具が右向き (X>0) | 90° | 0° |
| 器具が左向き (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 | 0° |
| ERA300P 4 | 64 | 5000 | 4000 | 3400 | 0° |
現在の 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 | 0° | 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分〜 |
メモ ファイルの場所
📝 2025/12/12 13:15 更新 - MVR実証完了、自動化方針策定









