GVG-100 プロトコル
1960年代、Grass Valley Group により発売された Model 100 Video Switcher、通称GVG-100。
操作パネルとスイッチャー本体が分かれていて、その間を独自のプロトコルで通信していました。
そのプロトコルは現代でもBlackmagic Designを始めとする各種スイッチャーで対応しています。
- TV Tech - Production switchers
- Interfacing a Grass Valley control surface
- How It All Began
- Grass Valley Group
- Grass Valley Group Catalog 1991 (PDF)
- Index of /pdf/Grass_Valley
- GitHub - tonsofpcs / gvg110
- GRASS VALLEY GVG110 (100) PANEL MODIFICATIONS FOR STANDALONE OPERATION by Baz Leffler
- Grass Valley Group GVG-100 Production Editing Video Switch Controller 8 Input
実際の GVG-100 プロトコル
プロトコルに関して参考になる資料がこちらです。
- Grass Valley - Documentation Library - Discontinued & Supported (LTPS) SD Switcher Line - Model 100 Switcher (A75-087614-00)
- (ミラー)Model 100 Video Switcher Serial Interface Protocol (A75-087614-00)
- Grass Valley - Documentation Library - Discontinued & Supported (LTPS) HD Switcher Line - Kalypso HD Video Production Center - Switcher Products Protocols Manual (071-8063-08)
- (ミラー)Switcher Products Protocols Manual (071-8063-08)
- Thomson Grass Valley GVG 100 (protocol) PDF
- GV Grass Valley® Editor Protocols
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制御実験
実際に制御を行ったときの動画です。
