GVG-100 プロトコル

GVG-100 001

1960年代、Grass Valley Group により発売された Model 100 Video Switcher、通称GVG-100。

操作パネルとスイッチャー本体が分かれていて、その間を独自のプロトコルで通信していました。

そのプロトコルは現代でもBlackmagic Designを始めとする各種スイッチャーで対応しています。

 

実際の GVG-100 プロトコル

プロトコルに関して参考になる資料がこちらです。

 

GVG-100 Atem implementation

私は、ATEM Television Studio HD の RS-422ポートを「GVG100経由の外部コントロール」に設定した際の、詳細なプロトコル仕様に関して資料をBlackmagic Designに請求しました。

2018/11/12 時点でのATEMに実装されているコマンドの一覧です。

その際の資料を以下に示します。

 

CROSSPOINT COMMANDS

Command Code GVG Function Atem Function Valid value Effects Address
C1 Program BACKGROUND Bus Program input 0 is black, 9 is bkgd 1-8 are inputs 1 for M/E 1; 2 for M/E 2
C2 Preset BACKGROUND Bus Program input 0 is black, 9 is bkgd 1-8 are inputs 1 for M/E 1; 2 for M/E 2
C3 KEY BUS Key1 Fill Source 0 is black, 9 is bkgd 1-8 are inputs 1 for M/E 1; 2 for M/E 2
C4 KEY BUS 2 Key2 Fill Source 0 is black, 9 is bkgd 1-8 are inputs 1 for M/E 1; 2 for M/E 2

 

ANALOG CONTROLS

Control # Effects Address GVG Control Name Atem Control
8 0 DSK CLIP DSK 1 Clip
10 0 DSK MATTE HUE - - - Not Applicable - - -
11 0 DSK MATTE CHROMA - - - Not Applicable - - -
12 0 DSK MATTE LUM (Luminance) DSK 1 Gain
* * * *
0 1 Transition Lever Arm Tbar
10 1 EFFECTS KEYER CLIP Luma Key Clip
11 1 EFFECTS KEYER GAIN Luma Key Gain
17 1 POSITIONER (Vertical) Wipe Position Y
18 1 POSITIONER (Horizontal) Wipe Position X
20 1 BACKGROUND HUE Colour Generator 1 Hue
21 1 MASK/PRESET SIZE Pattern Key Size
23 1 CHROMA KEY HUE Chroma Key Hue
24 1 BORDER/EFF HUE Colour Generator 2 Hue
25 1 BORDER/EFF CHROMA Colour Generator 2 Sat
26 1 BORDER/EFF LUM Colour Generator 2 Lum
27 1 BACKGROUND LUM Colour Generator 1 Lum
28 1 ASPECT Wipe Symmetry
29 1 SOFT (Border) Wipe Border Softness
30 1 BORDER (Width) Wipe Border Width
31 1 BACKGROUND CHROMA Colour Generator 1 Sat

 

PUSH BUTTONS

PB/L Number GVG Read Function GVG Write Function ATEM Write Function
0 Program Bus Crosspoint 0 Program Bus Crosspoint 0 M/E1 Program Black
1 “ “ “ 1 “ “ “ 1 M/E1 Program Cam1
2 “ “ “ 2 “ “ “ 2 “ “ Cam2
3 “ “ “ 3 “ “ “ 3 “ “ Cam3
4 “ “ “ 4 “ “ “ 4 “ “ Cam4
5 “ “ “ 5 “ “ “ 5 “ “ Cam5
6 “ “ “ 6 “ “ “ 6 “ “ Cam6
7 “ “ “ 7 “ “ “ 7 “ “ Cam7
8 “ “ “ 8 “ “ “ 8 “ “ Cam8
9 “ “ “ 9 “ “ “ 9 “ “ Cam9
10 Pgm. Bus High/Low Tally - - - Not Applicable - - - - - - Not Applicable - - -
11 AUTO TRANS AUTO TRANS AUTO (Transition)
12 DSK MIX DSK MIX DSK 1 AUTO
13 DSK ON DSK ON DSK 1 ON AIR (cut)
14 WIPE WIPE WIPE
15 MIX MIX MIX
16 Preset Bus Crosspoint 0 Preset Bus Crosspoint 0 M/E1 Preview BLACK
17 “ “ “ 1 “ “ “ 1 M/E1 Preview Cam1
18 “ “ “ 2 “ “ “ 2 “ “ Cam2
19 “ “ “ 3 “ “ “ 3 “ “ Cam3
20 “ “ “ 4 “ “ “ 4 “ “ Cam4
21 “ “ “ 5 “ “ “ 5 “ “ Cam5
22 “ “ “ 6 “ “ “ 6 “ “ Cam6
23 “ “ “ 7 “ “ “ 7 “ “ Cam7
24 “ “ “ 8 “ “ “ 8 “ “ Cam8
25 “ “ “ 9 “ “ “ 9 “ “ Cam9
26 Pst. Bus High/Low Tally - - - Not Applicable - - - - - - Not Applicable - - -
27 ASPECT ON ASPECT ON - - - Not Applicable - - -
28 POSITIONER On POSITIONER On - - - Not Applicable - - -
29 REVERSE Wipe REVERSE Wipe Toggle Wipe Revese
30 DSK PVW (Preview) DSK PVW Toggle DSK Tie Button
31 FADE TO BLACK FADE TO BLACK FTB (Fade to Black)
32 KEY BUS Crosspoint 0 KEY BUS Crosspoint 0 USK 1 Fill Source list item 1
33 “ “ “ 1 “ “ “ 1 “ “ “ “ “ 2
34 “ “ “ 2 “ “ “ 2 “ “ “ “ “ 3
35 “ “ “ 3 “ “ “ 3 “ “ “ “ “ 4
36 “ “ “ 4 “ “ “ 4 “ “ “ “ “ 5
37 “ “ “ 5 “ “ “ 5 “ “ “ “ “ 6
38 “ “ “ 6 “ “ “ 6 “ “ “ “ “ 7
39 “ “ “ 7 “ “ “ 7 “ “ “ “ “ 8
40 “ “ “ 8 “ “ “ 8 “ “ “ “ “ 9
41 “ “ “ 9 “ “ “ 9 “ “ “ “ “ 10
42 KEY BUS High/Low Tally - - - Not Applicable - - - - - - Not Applicable - - -
43 OUTLINE OUTLINE - - - Not Applicable - - -
44 DROP SHADOW DROP SHADOW USK 1 DVE Enable Shadow
45 BORDERLINE BORDERLINE USK 1 DVE Border
46 DSK MATTE FILL DSK MATTE FILL - - - Not Applicable - - -
47 DSK EXT VIDEO FILL DSK EXT VIDEO FILL - - - Not Applicable - - -
48 Horizontal Wipe Horizontal Wipe Horizontal Wipe
49 Vertical Wipe Vertical Wipe Vertical Wipe
50 Horizontal Split Wipe Horizontal Split Wipe Horizontal Split Wipe
51 Vertical Split Wipe Vertical Split Wipe Vertical Split Wipe
52 Left Corner Wipe Left Corner Wipe Left Corner Wipe
53 Right Corner Wipe Right Corner Wipe Right Corner Wipe
54 Diagonal Wipe Diagonal Wipe Diagonal Wipe
55 Box Wipe Box Wipe Box Wipe
56 Diamond Wipe Diamond Wipe Diamond Wipe
57 Circle Wipe Circle Wipe Circle Wipe
58 BACKGROUND Generator - - - Not Applicable - - - - - - Not Applicable - - -
59 DSK MATTE Generator - - - Not Applicable - - - - - - Not Applicable - - -
60 BORDER/EFF Matte Generator - - - Not Applicable - - - - - - Not Applicable - - -
61 FADE TO BLACK Rate - - - Not Applicable - - - - - - Not Applicable - - -
62 DSK MIX Rate - - - Not Applicable - - - - - - Not Applicable - - -
63 AUTO TRANS Rate - - - Not Applicable - - - - - - Not Applicable - - -
64 DSK KEY INVERT DSK KEY INVERT Toggle DSK 1 Invert Key
65 DSK KEY MASK DSK KEY MASK Toggle DSK 1 Mask
66 DSK EXT SOURCE DSK EXT SOURCE - - - Not Applicable - - -
67 DSK KEY BUS SOURCE DSK KEY BUS SOURCE - - - Not Applicable - - -
68 EFFECTS KEYER KEY INVERT EFFECTS KEYER KEY INVERT Luma Key Invert
69 EFFECTS KEYER KEY MASK EFFECTS KEYER KEY MASK Luma Key Mask
70 EFF MATTE FILL EFF MATTE FILL - - - Not Applicable - - -
71 EFFECTS KEYER KEY BUS FILL EFFECTS KEYER KEY BUS FILL - - - Not Applicable - - -
72 BKGD BKGD Toggle BKGD (Next Trans)
73 KEY KEY Toggle KEY1 (Next Trans)
74 - - - Not Applicable - - - CUT Toggle ON AIR 1 (Next Trans)
75 PST PTN (Preset Pattern) PST PTN Set pattern Key
76 EFFECTS KEYER KEY BUS SOURCE EFFECTS KEYER KEY BUS SOURCE - - - Not Applicable - - -
77 EFF EXT SOURCE EFF EXT SOURCE - - - Not Applicable - - -
78 CHROMA KEY CHROMA KEY Set chroma Key
79 EDITOR ENABLE - - - Not Applicable - - - - - - Not Applicable - - -
80 Lever Arm Limit Low - - - Not Applicable - - - - - - Not Applicable - - -
81 Lever Arm Limit High - - - Not Applicable - - - - - - Not Applicable - - -
82 KEY ON KEY ON USK1 ON AIR

 

OTHER COMMANDS

* * Write Implemented Read Implemented
Wipe Pattern Command Implemented all GVG100 and
any compatible GVG300 wipe types
Yes Yes
Transition Mode Command Sets the Next Transition Background,
key1 and key2 buttons as a bitmask
Yes Yes
Transition Rate Command Yes Yes
Command Code GVG function * *
CC AUTO TRANS Rate Yes Yes
CD DSK MIX Rate Yes Yes
FD FADE TO BLACK Rate Yes Yes
Pushbutton Select Command Simulates pushing the button Yes - - - Not Applicable - - -
Software Version Command * * *
Returns the GVG software version
given as an example in the manual
- - - Not Applicable - - - Yes
Field Mode Command Turn on or off field (frame) marks Yes - - - Not Applicable - - -
Status Update Command Turn on or off status updates Yes - - - Not Applicable - - -
All Stop Command Stops transitions and FTB etc Yes - - - Not Applicable - - -
Lamp Status Map Command Read the status of the lamps - - - Not Applicable - - - Yes
Learn E-MEM Command No - - - Not Applicable - - -
Recall E-MEM Command No - - - Not Applicable - - -
Transfer E-MEM Command No - - - Not Applicable - - -
Key Memory Command No No

 

ArduinoでのATEM Television Studio HD制御実装

Arduino Mega2560 R3を使用してATEM Television Studio HDをコントロールしたコードを紹介します。

RS422での接続になっています。

そのため、ArduinoのシリアルポートにRS422のトランシーバを接続しています。

14番ピンをTX3 (RX422 TX)、15番ピンをRX3 (RS422 RX)として使用。

 

Akizuki Denshi RS232 Extension Cable 1.8m Pin Assign

使用した秋月電子のRS232Cケーブルのケーブル色についてのメモですが、ロットによって変更になる可能性もあるので以下の情報は参考程度にしてください。

PinNo Name Color
1 DCD Black
2 RxD Brown
3 TxD Red
4 DTR Orange
5 GND Yellow
6 DSR Green
7 RTS Blue
8 CTS Purple
9 RING Gray
FG NC *Bare wire

 

ATEM RS422 D-Sub Connector Pin Assign

ATEM Television Studio HD のコネクタを参考にしています。

PinNo Name Description
1 FG ATEM -> GND
2 TX- ATEM -> RX-
3 RX+ ATEM -> TX+
4 SG ATEM -> GND
5 NC NC
6 SG ATEM -> GND
7 TX+ ATEM -> RX+
8 RX- ATEM -> TX-
9 FG FG? NC?

 

ADM2587E Pin Assign

RS422での通信になるので、受信側に終端抵抗を入れる必要があります。

RX+とRX-の間に抵抗を1本いれます。

PinNo Name Description
1 GND1 GND
2 VCC 5V
3 GND1 GND
4 RxD Arduino RX3 (15)
5 R\E\
6 DE
7 TxD Arduino TX3 (14)
8 VCC 5V
9 GND1 GND
10 GND1 GND
11 GND2 GND2
12 VISOOUT to VISOIN
13 Y TX+ (to Dsub 3pin)
14 GND2 GND2
15 Z TX- (to Dsub 8pin)
16 GND2 GND2
17 B RX- (to Dsub 2pin) 120ohm
18 A RX+ (to Dsub 7pin) 120ohm
19 VISOIN to VISOOUT
20 GND2 GND2

 

gvg100.h

#ifndef GVG100_H
#define GVG100_H

class gvg100 {
  private:
    void SendGVGheader();
  public:
    void Begin();
    void FTBToggle();
    void PGMBlack();
    void PGMCam1();
    void PGMCam2();
    void PGMCam3();
    void PGMCam4();
    void PGMCam5();
    void PGMCam6();
    void PGMCam7();
    void PGMCam8();
};

#endif

 

gvg100.cpp

#include "gvg100.h"
#include <Arduino.h>

void gvg100::SendGVGheader() {
  // Send Break Character
  // 1 bit time (26us@38.4kbps)
  Serial3.end();
  pinMode(14, OUTPUT);
  // Spacing Data (17 to 20 bit times)
  // (26us*17=442us ~ 26us*20=520us Low)
  digitalWrite(14, LOW);
  delayMicroseconds(500);
  // Marking Data (2 or more bit times)
  // (26us*2=52 ~)
  digitalWrite(14, HIGH);
  delayMicroseconds(52);
  // Send Address Byte
  Serial3.begin(38400, SERIAL_8O1);
  Serial3.write(0x30);
}

void gvg100::Begin() {
  Serial3.begin(38400, SERIAL_8O1);
}

void gvg100::FTBToggle() {
  // FTB_ON 0301C61F
  SendGVGheader();
  byte data[5] = {0x03, 0x01, 0xC6, 0x1F, 0x84};
  Serial3.write(data, 4);
}

void gvg100::PGMBlack() {
  // PGM
  SendGVGheader();
  byte data[5] = {0x03, 0x01, 0xC1, 0x00, 0x84};
  Serial3.write(data, 4);
}

void gvg100::PGMCam1() {
  // PGM
  SendGVGheader();
  byte data[5] = {0x03, 0x01, 0xC1, 0x01, 0x84};
  Serial3.write(data, 4);
}

void gvg100::PGMCam2() {
  // PGM
  SendGVGheader();
  byte data[5] = {0x03, 0x01, 0xC1, 0x02, 0x84};
  Serial3.write(data, 4);
}

void gvg100::PGMCam3() {
  // PGM
  SendGVGheader();
  byte data[5] = {0x03, 0x01, 0xC1, 0x03, 0x84};
  Serial3.write(data, 4);
}

void gvg100::PGMCam4() {
  // PGM
  SendGVGheader();
  byte data[5] = {0x03, 0x01, 0xC1, 0x04, 0x84};
  Serial3.write(data, 4);
}

void gvg100::PGMCam5() {
  // PGM
  SendGVGheader();
  byte data[5] = {0x03, 0x01, 0xC1, 0x05, 0x84};
  Serial3.write(data, 4);
}

void gvg100::PGMCam6() {
  // PGM
  SendGVGheader();
  byte data[5] = {0x03, 0x01, 0xC1, 0x06, 0x84};
  Serial3.write(data, 4);
}

void gvg100::PGMCam7() {
  // PGM
  SendGVGheader();
  byte data[5] = {0x03, 0x01, 0xC1, 0x07, 0x84};
  Serial3.write(data, 4);
}

void gvg100::PGMCam8() {
  // PGM
  SendGVGheader();
  byte data[5] = {0x03, 0x01, 0xC1, 0x08, 0x84};
  Serial3.write(data, 4);
}

 

使用方法

#include "gvg100.h"
gvg100 atem;

void setup() {
  atem.Begin();
  // ATEM Default
  atem.PGMCam5();
}

などとして使用します。

 

ArduinoでのATEM Television Studio HD制御実験

実際に制御を行ったときの動画です。