ATEM SuperSource Box configuration using PowerShell script

I finally sorted the code for enumerating the collection of super source boxes in the 2 M/E and tested it this weekend.

Download the latest version here…

add-type -path 'C:\Users\imorrish\Source\Workspaces\VISE_ATEMLib\SwitcherLib\bin\Debug\SwitcherLib.dll'

add-type -path 'documents\windowspowershell\SwitcherLib.dll'
$Global:atem = New-Object SwitcherLib.Switcher("192.168.10.240")
$atem.Connect()
$Global:ME = $atem.GetMEs()
$SuperSources=$atem.GetSuperSource()
$SuperSources[0].InputFill=2001
$SSBoxes=$Atem.GetSuperSourceBox()
#Display current box values
$SSBoxes | ft
#Assign each box to object
$Box1=$SSBoxes[0]
$Box2=$SSBoxes[1]
$Box3=$SSBoxes[2]
$Box4=$SSBoxes[3]
#set options for Box1
$box1.PositionX = -4
$box1.PositionY = 6
$box1.Size = .25
$Box1.InputSource=1
$Box1.Enable = 1
#Put SuperSource on-air
$ME[0].Preview=6000
$ME[0].Cut()

Output

PS C:\Users\imorrish> $SSBoxes | ft
Enabled InputSource PositionX PositionY Size Cropped CropTop CropBottom CropLeft CropRight
——- ———– ——— ——— —- ——- ——- ———- ——– ———
1       1           -8        4.5       0.25 0       0       0          0        0
1       2           8         4.5       0.5  0       0       0          0        0
1       3           -8        -4.5      0.5  0       0       0          0        0
1       4           8         -4.5      0.5  0       0       0          0        0

ATEM SuperSource Box Configuration UI

The software panel is a but cumbersome when it comes to making a lot of settings that involve size and position of effects.

I have provided a few examples of making adjustments to things like chroma key settings using a midi device but probably the ultimate in complexity is setting the super source parameters and option for the 2 M/E.

The following screenshot is more of a teaser as I don’t have a 2 M/E right now but will try and get a video of it working soon. I’ll also be publishing a new switcherlib for PowerShell that has a full implementation of the SuperSource Box configuration options.

Automating OBS from PowerShell Script

Open Broadcaster Software (OBS) is a great, open source, product that can be used to capture, record and stream a mixture of sources. With support for Decklink cards, it is easy to include the output of an ATEM vision mixer.

Using Windows PowerShell would let you automate OBS using XKeys or a Midi device and even coordinate switching ATEM inputs or playing out graphics from CasparCG at the same time (see my other PowerShell add-ons in https://ianmorrish.wordpress.com/v-ise/)

What you need:

Web Socket add-in for OBS https://obsproject.com/forum/resources/obs-websocket-remote-control-of-obs-studio-made-easy.466/download?version=1124

The following files in your Documents\WindowsPowerShell directory (remember to un-block them after downloading)

WebSocket-Sharp.dll https://1drv.ms/u/s!ApGpqMMpRLhijrNWU5eDhO1PzJZkAg

NewtonSoft.Json.dll https://1drv.ms/u/s!ApGpqMMpRLhijrNYgWt2nKGOqx2XGQ

OBS-WebSocket-Net.dll https://1drv.ms/u/s!ApGpqMMpRLhijrNXDV9u52u6CWbdbQ

Sample script

Add-Type -path ‘documents\WindowsPowerShell\obs-websocket-dotnet.dll’
$obs = new-object OBSWebsocketDotNet.OBSWebsocket
$obs.Connect(“ws://127.0.0.1:4444”, “password”)
$scenes = $obs.ListScenes()
$scenes
$obs.SetCurrentScene(“Intro”)
#Loop through each scene
$loop = $true; $i =1
Do{
$obs.SetCurrentScene($scenes[$i].Name)

if($i -eq $scenes.Count){$i=1}
   else{$i++}
Start-Sleep 5
}While($loop)
#Other commands
$obs.ToggleStreaming()
$obs.ToggleRecording()

All methods and properties for OBS Websocket:
OBSCommands

Panasonic PXW270 camera and AK-HRP200 CCU configuration

The last time I tried to get this combination of camera and Camera Control Unit (CCU/RCP) working it took almost a day of searching for the required configuration settings and firmware versions. After finally getting it to work I was sure I had documented it but when I had to do it again this week for a couple of new cameras and CCU unit I couldn’t find it anywhere and search for the answer did not return any decent results.

What you need:

Software from Panasonic, CCU firmware available after 2013.

https://eww.pass.panasonic.co.jp/pro-av/support/content/download/EN/ep2main/soft/upghrp200_e.htm

This page also provides links to the following software:

Easy IP – this lets you discover the AK-HRP200 unit and change its IP if you want. The default is 192.168.0.130
Just a tip with the Panasonic software, only have one HRP200 plugged into the network (or direct to your PC) if you want to change its configuration.

Smart Configuration Tool (ROP Setup Software)

Set the CCU and Cameras to be on the same network. The camera IP address is set by holding down the Menu button on the camera for more than 5 seconds, otherwise you only get the simple user menu settings.

The camera must be configured to allow remote control. This is in the network setting and there are two settings required to make it work.

[NETWORK SETUP] -> [NETWORK FUNCTION] -> [HTTP SERVER+REMOTE]

[NETWORK SETUP] -> [REMOTE] -> [ENABLED]

Set up a user name/password or use the default (guest p2guest)

Using the Smart Configuration Tool, you can tell the RCP about any cameras that it can control. The trick is to use the settings below:

Connection Mode: IP Mode

Camera Type: RemoteCamera

 

Camera Type: Camcorder IP

Camera Port No: 49152

 

Even if I have one CCU per camera, I always add the other cameras to each CCU just in case a CCU fails, you can hold down the Select button until the camera number flashes and then use the DATA SET up and down arrows to select another camera.

PowerShell serial monitor for Arduino

Just a simple option to monitor the USB serial communications from an Arduino.

$port= new-Object System.IO.Ports.SerialPort COM4,115200,None,8,one;
$port.open(); 

while ($port.IsOpen) {
    $port.ReadLine();
    if ($Host.UI.RawUI.KeyAvailable -and ([int]$Host.UI.RawUI.ReadKey‘AllowCtrlC,IncludeKeyUp,NoEcho’).Character) -eq 3) {
        $port.close();
        break;
#In ISE, use <Ctrl>Pause to exit
    }
}
$port.close();

Automate Behringer X32 mixers from PowerShell using OSC

Here is a simple example using the OSC DLL with Windows PowerShell to control the Behringer X32 range of audio mixers.

I have tried this with the XR12 but will also work with any of the X Air XR16, XR18 and X32 models.

Sample script showing some basic settings:

# Connection Behringer X32
add-type -path ‘C:\Users\imorrish\OneDrive\PowerShell\OSC\SharpOSC.dll’
$sender = new-object SharpOSC.UDPSender “192.168.1.66”, 10024

#Mute channels 1 – 5
1..5 |% {$message = new-object SharpOSC.OscMessage “/ch/0$($_)/mix/on”, 0;$sender.Send$message)}

#Mute group 1
$message = new-object SharpOSC.OscMessage “/config/mute/1”, 0;
$sender.Send($message)

#Label channel name
$message = new-object SharpOSC.OscMessage “/ch/04/config/name”, “Lead Singer”
$sender.Send($message)

#fade up from 0 (0-1024 max)
1..200 | % {$message = new-object SharpOSC.OscMessage “/ch/04/mix/fader”, ($_ *4); sender.Send($message);Start-Sleep -Milliseconds 1}

It would be easy to use the faders on a midi device like my demo for controlling the ATEM audio levels.

See the following link for all OSC commands that are supported.
http://behringerwiki.music-group.com/index.php?title=OSC_Remote_Protocol#Client_initiated_messages_.28client_.E2.86.92_X32_console.29

And Channel specific controls http://behringerwiki.music-group.com/index.php?title=Channel_(/ch)_data

Snapshot ATEM Mixer settings with PowerShell

This is a work in progress and will be added to ISE as a standard menu to provide selective backup/restore of ATEM settings like the BMD Software Panel but using JSON format rather than XML.

Example snippet of code for the ME properties:

add-type -path ‘C:\Users\imorrish\Documents\WindowsPowerShell\SwitcherLib.dll’
$atem = New-Object SwitcherLib.Switcher(“192.168.1.8”)
$atem.Connect()
$ME = $atem.GetMEs()
$me1SnapShot = $me[0] |select-object -property * -ExcludeProperty “me” | ConvertTo-Json

Which produces the following:

{
    “Program”: 1,
    “Preview”: 1,
    “TransitionStyle”: “Mix”,
    “NextTransitionStyle”: “Mix”,
    “InTransition”: false,
    “TransitionFramesRemaining”: 25,
    “TransitionPosition”: 0,
    “FadeToBlackRate”: 25,
    “InFadeToBlack”: false,
    “FadeToBlackInTransition”: null,
    “FadeToBlackFullyBlack”: false,
    “PreviewLive”: false,
    “PreviewTransition”: false,
    “TransitionSelection”: 1,
    “MixRate”: 25,
    “WipeBorderSize”: 0,
    “WipeBorder”: 2001,
    “WipeReverse”: 0,
    “WipeFlipFlop”: 0,
    “WipeSoftness”: 0,
    “WipeSymmetry”: 0.5,
    “WipeHorizontalOffset”: 0.5,
    “WipeVerticalOffset”: 0.5,
    “TransitionWipePattern”: “DiamondIris”,
    “DVERate”: 25,
    “DVELogoRate”: 25,
    “DVEeReverse”: 0,
    “DVEFlipFlop”: 0,
    “DVETransitionStyle”: “PushRight”,
    “DVEInputFill”: 3010,
    “DVEInputCut”: 3011,
    “DVEEnableKey”: 1,
    “DVEClip”: 0.5,
    “DVEGain”: 0.7,
    “DIPRate”: 25,
    “DIPInput”: 2001,
    “index”: 1
}

I still have to sort out some inconsistencies with properties that should be Boolean and making the internal class private.