Home

V-ISE is a platform to provide automation of broadcast video systems using Windows PowerShell. Now that PowerShell 6/7 is open source and cross platform, I have to qualify this with “Currently requires MS Windows operating system” although I am in the early stages of a version that works on Mac and Linux.

PowerShell is an object-oriented automation engine and scripting language based on Microsoft .Net open source framework with an interactive command-line shell that Microsoft developed to help IT professionals configure systems and automate administrative tasks. MS has also embedded this console into VS Code which provides a cross platform development, debugging and execution platform for PowerShell scripts.
I have provided additional .Net components to extend the ability of PowerShell to automate Blackmagic Design products and other systems that use various protocols to allow sctript based automation.

V-ISE allows automation of many systems, in addition to the host operating system, including:

  • Blackmagic Design ATEM video switch’s
  • Other Blackmagic Hardware
  • CasparCG Open-source Playout Server
  • MIDI I/O
  • X-keys input
  • StreamDeck
  • OSC I/O
  • Arduino I/O (Using USB Firmata protocol)

This project is a work in progress but I’m using it on a regular basis at my church. New features are added as I need them or when I see interesting “how do I” questions on forums that I just can’t resist trying to solve.
Please consider donating if you find any of the content or applications usefull.

Donate Button with Credit Cards

For more details about the project, start at the V-ISE menu

If you haven’t heard of PowerShell I suggest you start with PowerShell

Using PowerShell should be second nature to anyone who is an IT Windows administrator. For others it may be a steep learning curve, but the alternative is probably just as hard (learning Python, Node.JS or LUA etc.)

46 thoughts on “Home”

  1. Hi Ian

    I have a streamdeck atem prod studio 4k and a mac

    Ive downloaded powershell but now i cannot work out what to donto get it working

    Would you have. Any suggestion as to where to look …. would really appreciate it

    Andrew

  2. hi! I m really happy to know that! It’s incrindible thing transform the old grasvalley into a new stuff for atem, let me know more about? Do you have a list of compatible spec using arduino?

  3. Hello Ian,
    First of all, thanks for the work and time you put into this project, I was able to get my ATEM up and running over midi. Question for you…Do you have any experience with ARCnet ?
    I have an really nice ForA control surface that runs on ARCnet (but the head end is long gone) curious if you knew of a way to get my ATEM to talk with my ForA surface… Thanks again for your time.

    1. Thanks for the feedback. I doubt you would find an ARCnet interface to anything these days. Personally I would rip out the internal CPU and figure out the switch/lamp circuit and interface an Arduino or Raspberry Pi in there. Big job though.

  4. Hello Ian,

    I’m using your Powershell examples to control my Atem. Everything is working great.
    But I also want to use a T-bar.
    Do you have a Poweshell example for using a T-bar with the Atem?

    With kind regard,
    Jan Hein

  5. Hi Ian,

    Thanks for your great work regarding the scripting engine. I’m currently a justmacros user, but as support is lacking for that at the moment it is good to know the alternatives. I just want to mention a broken link to you: the download link for your EDL from ATEM Cuts file creator tool is exactly the same and lands on the exact same spot as the videohub configuration document link.

  6. Tanks and just a question about using xtouch mini with Atem Mini. Is it possibile assign the macros, written on Atem Mini, to the xTouch Mini Buttons ?

    Thank yoi

    1. Yes, that is easy. The Json file can be updated to change a button command to $atem.RunMacro(0)
      You might also want to remove the button from the input monitoring section of the json file. See the documentation for button numbers and other commands.

  7. Hello, Ian.
    First of all I would like to congratulate you for the excellent work you do.
    I would like to know if the Linux version includes the RGB control option, through the Behringer CMD-DV1.
    Thank you very much for your attention.

  8. Hello Ian, great fan of your work. Do you have any news on your midi controller for Blackmagic ATEM Camera control?

  9. I would ask you for help.
    After using your Atem Studio HD control code (it’s really great),
    I can’t adjust the code to control the volume via turn the knobs.
    For now, it is set to turn on and off the sound coming through the embedded SDI cable,
    the desire is to use volume control as well.
    This is the code I use, can you add what is missing?

    {
    “keys”: [
    {
    “Mode”: “Script”,
    “KeyID”: 89,
    “Command”: ” “,
    “Script”: ” $me[0].Program=5″,
    “Caption”: “Auto Transition”,
    “Description”: “Cut 1”
    },
    {
    “Mode”: “Script”,
    “KeyID”: 90,
    “Command”: ” “,
    “Script”: ” $me[0].Program=6″,
    “Caption”: “Auto Transition”,
    “Description”: “Cut 2”
    },
    {
    “Mode”: “Script”,
    “KeyID”: 40,
    “Command”: ” “,
    “Script”: ” $me[0].Program=7″,
    “Caption”: “Auto Transition”,
    “Description”: “Cut 3”
    },
    {
    “Mode”: “Script”,
    “KeyID”: 41,
    “Command”: ” “,
    “Script”: ” $me[0].Program=8″,
    “Caption”: “Auto Transition”,
    “Description”: “Cut 4”
    },
    {
    “Mode”: “Script”,
    “KeyID”: 42,
    “Command”: ” “,
    “Script”: “$me[0].Program=3”,
    “Caption”: “Auto Transition”,
    “Description”: “Cut 5”
    },
    {
    “Mode”: “Script”,
    “KeyID”: 43,
    “Command”: ” “,
    “Script”: “$me[0].Program=4”,
    “Caption”: “Auto Transition”,
    “Description”: “Cut 6”
    },
    {
    “Mode”: “Script”,
    “KeyID”: 44,
    “Command”: ” “,
    “Script”: “$me[0].Program=3010”,
    “Caption”: “Auto Transition”,
    “Description”: “Cut 7”
    },
    {
    “Mode”: “Script”,
    “KeyID”: 45,
    “Command”: ” “,
    “Script”: “$me[0].Program=3020”,
    “Caption”: “Auto Transition”,
    “Description”: “Cut 8”
    },
    {
    “Mode”: “Script”,
    “KeyID”: 85,
    “Command”: ” “,
    “Script”: “$me[0].cut()”,
    “Caption”: “Cut”,
    “Description”: “Cut”
    },
    {
    “Mode”: “Script”,
    “KeyID”: 84,
    “Command”: ” “,
    “Script”: “$me[0].AutoTransition()”,
    “Caption”: “Autotransition”,
    “Description”: “Auto Transition”
    },
    {
    “Mode”: “Script”,
    “KeyID”: 87,
    “Command”: ” “,
    “Script”: “$me[0].Preview=5”,
    “Caption”: “Preview 5”,
    “Description”: “Set Preview bus to input 5”
    },
    {
    “Mode”: “Script”,
    “KeyID”: 88,
    “Command”: ” “,
    “Script”: “$me[0].Preview=6”,
    “Caption”: “Preview 6”,
    “Description”: “Set Preview bus to input 6”
    },
    {
    “Mode”: “Script”,
    “KeyID”: 91,
    “Command”: ” “,
    “Script”: “$me[0].Preview=7”,
    “Caption”: “Preview 7”,
    “Description”: “Set Preview bus to input 7”
    },
    {
    “Mode”: “Script”,
    “KeyID”: 92,
    “Command”: ” “,
    “Script”: “$me[0].Preview=8”,
    “Caption”: “Preview 8”,
    “Description”: “Set Preview bus to input 8”
    },
    {
    “Mode”: “Script”,
    “KeyID”: 86,
    “Command”: ” “,
    “Script”: “$me[0].Preview=3”,
    “Caption”: “Preview 3”,
    “Description”: “Set Preview bus to input 3”
    },
    {
    “Mode”: “Script”,
    “KeyID”: 93,
    “Command”: ” “,
    “Script”: “$me[0].Preview=4”,
    “Caption”: “Preview 4”,
    “Description”: “Set Preview bus to input 4”
    },
    {
    “Mode”: “Script”,
    “KeyID”: 94,
    “Command”: ” “,
    “Script”: “$me[0].Preview=3020”,
    “Caption”: “Preview 1”,
    “Description”: “Set Preview bus to input 1”
    },
    {
    “Mode”: “Script”,
    “KeyID”: 95,
    “Command”: ” “,
    “Script”: “$me[0].Preview=3010”,
    “Caption”: “Preview 2”,
    “Description”: “Set Preview bus to input 2”
    },

    {
    “Mode”: “Script”,
    “KeyID”: 32,
    “Command”: ” “,
    “Script”: “toggleAudio 5 48”,
    “Caption”: “Audio 5”,
    “Description”: “Audio 5”
    },
    {
    “Mode”: “Script”,
    “KeyID”: 33,
    “Command”: ” “,
    “Script”: “toggleAudio 6 49”,
    “Caption”: “Audio 6”,
    “Description”: “Audio 6”
    },
    {
    “Mode”: “Script”,
    “KeyID”: 34,
    “Command”: ” “,
    “Script”: “toggleAudio 7 50”,
    “Caption”: “Audio 7”,
    “Description”: “Audio 7”
    },
    {
    “Mode”: “Script”,
    “KeyID”: 35,
    “Command”: ” “,
    “Script”: “toggleAudio 8 51”,
    “Caption”: “Audio 8”,
    “Description”: “Audio 8”
    },
    {
    “Mode”: “Script”,
    “KeyID”: 36,
    “Command”: ” “,
    “Script”: “toggleAudio 1 52”,
    “Caption”: “Audio 1”,
    “Description”: “Audio 1”
    },
    {
    “Mode”: “Script”,
    “KeyID”: 37,
    “Command”: ” “,
    “Script”: “toggleAudio 2 53”,
    “Caption”: “Audio 2”,
    “Description”: “Audio 2”
    },
    {
    “Mode”: “Script”,
    “KeyID”: 38,
    “Command”: ” “,
    “Script”: “toggleAudio 3 54”,
    “Caption”: “Audio 3”,
    “Description”: “Audio 3”
    }
    ,
    {
    “Mode”: “Script”,
    “KeyID”: 39,
    “Command”: ” “,
    “Script”: “toggleAudio 4 55”,
    “Caption”: “Audio 4”,
    “Description”: “Audio 4”
    }
    ],

    “Mapping”: [
    {
    “Key”: 89,
    “Input”: 5
    },
    {
    “Key”: 90,
    “Input”: 6
    },
    {
    “Key”: 40,
    “Input”: 7
    },
    {
    “Key”: 41,
    “Input”: 8
    },
    {
    “Key”: 42,
    “Input”: 1
    },
    {
    “Key”: 43,
    “Input”: 2
    },
    {
    “Key”: 44,
    “Input”: 3
    },
    {
    “Key”: 45,
    “Input”: 4
    },
    {
    “Key”: 87,
    “Input”: 5
    },
    {
    “Key”: 88,
    “Input”: 6
    },
    {
    “Key”: 91,
    “Input”: 7
    },
    {
    “Key”: 92,
    “Input”: 8
    },
    {
    “Key”: 86,
    “Input”: 1
    },
    {
    “Key”: 93,
    “Input”: 2
    },
    {
    “Key”: 94,
    “Input”: 3
    },
    {
    “Key”: 95,
    “Input”: 4
    }
    ],
    “EncoderVolume”: [
    {
    “Encoder”: 20,
    “Input”: 5
    },
    {
    “Key”: 21,
    “Input”: 6
    },
    {
    “Key”: 22,
    “Input”: 7
    },
    {
    “Key”: 23,
    “Input”: 8
    },
    {
    “Key”: 16,
    “Input”: 1
    },
    {
    “Key”: 17,
    “Input”: 2
    },
    {
    “Key”: 18,
    “Input”: 3
    },
    {
    “Key”: 19,
    “Input”: 4
    }
    ]
    }

    Thank you

    1. Hi, that looks like an older version of the program. Audio only worked on some ATEM’s like the TVS and Production Studio’s. New units like the Mini and Pro4k use Fairlight Audio which is different. I updated the program to support Fairlight audio and also enable the encoders to be used for other things as well as audio (like changing media pool slot or position picture in picture window). This required a change to the format of the Json file.
      I just found a bug in the volume level setting which I’ll fix tomorrow and release an update that works with standard or Fairlight audio ATEMs.

  10. Hi Ian, great job you are doing… My question is if you have a solution to use an old tricaster surface control (LiveControl LC-11/USB port) with Atem Television
    Thank you very much for your attention

      1. Hi Ian – looking at attempting a Pi setup tonight. Is it in a functional state for that?

      2. Hi, yes, all the set commands seem to be working. I have been running it under vscode on a pi 4 to control 2 atem’s at the same time. Been slamed with other work this year so haven’t made any progress on a solution to support get commands.

  11. Hi,

    I am really an armature in Code and stuff, Can you please help me in configuring the Behringer Xtouch to the Atem Software control,
    I have tried but not understand how to do it,
    I would really appreciate you help on this,

    Thank you

  12. Hi Ian,
    Thanks for all the effort you’ve put into the Atem macro scripts.
    I’m using them to help with our church service streaming, but I’ve had a couple of problems that I was wondering if you or anybody else has seen before:
    I get occasional issues where my Atem mini doesn’t respond to the output of your macro script. It’s being controlled over a wired network, so doesn’t seem to be a network issue.

    I was going to look at atemmacro.exe to see if I get better performance from that, but I get an error when I try to run that – “method not found system.string switcherlib.switcher.get_macrostatus”. Tried adding the path to environment variables in case it couldn’t find the DLL, but didn’t seem to improve things.

    All running on Win8.1.
    I’d be very grateful for any assistance with this (while accepting that I’m not due any form of support!)

    1. Thanks for the feedback. I have tested the switcherlib for more then a month with other ATEM models, but only for a few days with the Mini.
      I don’t use macros all that much and only ever tested with simple 2 or 3 step macros (I use the equivalent PowerShell commands natively in functions which replaces the need for macros) so I’ll do a bit more testing.
      atemmacro.exe uses an older version of switcherlib that is not compatible with the mini. You can just copy the atemmacro.exe (without the switcherlib.dll) into you directory that has working PowerShell and it might work.

  13. Hello,

    Are there any bits of code in this that could get the xKey 124 T-bar to automate this in DaVinci Resolve application:

    https://drive.google.com/file/d/1W7xLKw4FsEekt6M_v2bCRBTV4Pu5a21Z/view?usp=sharing

    Resolve’s wipe function places two images over each other in the exact same spot in the GUI. You can then “switch” between the two images just like you would “switch” between two live video feeds in a control room. Just inside the app. This is also output through video hardware to your broadcast monitor.

    When you initiate the wipe function, a visible line appears, splitting the two images in half. You can then click, hold, and drag a mouse or pen tablet, and drag either way to reveal more or less of each image. Effectively cropping the image your are dragging over and revealing more of the image you are dragging from.

    If you have BM’s $30k Black Magic Advanced panel T-bar, you can use it’s T-bar to wipe between the images. I’m assuming BM’s DaVinci Resolve uses the same code for their Advanced Panel T-bar, as BM’s ATEM uses for the a T-bar on an external controller. So technically Resolve should be “listening” for a T-bar

    The physical wiping of the line itself could be a “left mouse button down and hold” but assigned to the T-bar instead of the mouse.

    Thanks!

    1. Hi,
      I started adding the code for T-Bar but didn’t get it tested as I don’t have a unit. I have not looked at any automation of Resolve although I understand it supports keyboard shortcuts but that is a very clunky way of automating, especially for something like a fader value. I don’t know if there is an API that would allow similar integration that BMD do with their hardware panels?

  14. Hi Ian

    I have read all of this and also looked at GitHub – great work!

    I am running a Mac and I really would like to be able to remap the knobs on my x-touch mini to control the volume in the ATEM mini pro ISO.

    Do you have any ideas of how to achieve this on a Mac? I can open files and change codes etc – I would prefer a GUI. If not, I would like to know where the files are that I need to adjust.

    Thanks for your hard work!

    Best Regards
    Johan Niklasson

  15. Hi Ian,
    first of, i used your Atem xTouch Controller quite a while and love it. Nice Work.

    A few days ago there was a Windows update and now i’m unable to start the exe file…i got a notification, that the files contains a virus and can’t be executed. Also Chrome is blocking the download from your onedrive.

    Any plans on an update, or is there a workaround?

    best regards,
    dave

  16. Hello,
    I have managed:
    $atem.RunMacro(1) ;method which works well
    Rather than run a macro. I would prefer $atem.Program = 1 ;to switch from program 2 to program 1.
    If I Use: $me | get-member -Name Program ;This method works well in PS_ISE, but errors in PS when run direct from the ps1 file.

    Have you any thoughts how to switch from one program to another program via PS commad-line (by running a simple ps1 file?

    1. Hi,
      Create a function in your ps1 file and then call the script like this from the command line
      powershell -command “& { . \script1.ps1; set-atemprog 1 }”

      function set-atemprog($input){
      $atem.program = $input
      start-sleep -m 10 #may be needed so API has time to get command sent before program exits
      }

  17. It doesn’t work
    The cmd gives: the property ‘program cannot’ be found on this object.
    Is isn’t part of the $atem object, but a memebr of the MEs? (Mixer effect)

  18. Ok Ian, GOT IT!!

    $MEs = $ATEM.GetMEs()
    $me = $MEs[0]
    Start-Sleep -Milliseconds 50
    $me[0] .Program = 1

    😉

  19. Hi Ian, can you help me in pointing me in right direction how to interface arduino with echolab mvs-3 controller? I would like to convert it to midi controller. Is that simple as just replacing microcontroller or is there something more to do. I have Teensy 3.2, but I can get anything that lets me convert the connection to usb. Thans in advance.

    1. Hi, mvs-3 circuit needs to be reverse engineered. I started doing this a few years ago but can’t find this information at the moment. There would be a lot of effort to get this working and I don’t have the time at the moment sorry.

  20. Hi Ian! Thanks again for all the work you put into using, developing, and (more than anything) answering questions here!!

    I’m wanting to understand the ATEM input numbering in relation to this controller (xTouch Mini for me). With the Atem 1M/E Production Studio 4K, input 1 is the only HDMI option. As such I will be using it for my keyer (lower thirds via RaspberryPi), but I want to push it to the end of the multiview so that my camera numbers match my switcher panel buttons better (Cam 1 = button 1 = multiview position 1). On to my question:
    Does the xTouch Mini powershell “input 1” correspond to the physical input, regardless of the Multiviewer configuration? And so on? So if I wanted Camera 1 to be my “first” input button on the xTouch controller I would need to update the script to be “input 2” as well as updating my multiviewer to put input 2 in slot 1? And then all physical inputs would all be offset by +1 from their multiviewer position – since I’ll be dropping the key (HDMI input 1) to the last channel (8) in my multiview?

    Hope that makes sense – thanks!

  21. Hi, The X-Touch buttons are controlled by the json file. The input ID’s are the ATEM physical input numbers, not related to multi-view position.
    So if you moved input 1 (HDMI) in your multi-view to the 8th window, you could change the X-Touch via the json file so that ATEM input 1 was on the 8th button.
    You should be able to see the pattern of commands in the json file for program and preview input assignment. There is also a mapping section in the json file that defines the input that the led for each button is mapped to.
    Let me know if you have any issue changing this.

  22. Great thanks! Planning ahead for a transition from an OLD TVStudio and wanting to find the right mix of utility and simplicity. This is very helpful – thanks!

  23. Hi Ian,

    First off al compliments for the great tools!
    One question about the behringer mini tool: is it possible to pre-set the ip so I don’t first have to start bmd control software?
    I see something for that in the multi version but I only have to control one 😉

    1. Hi, thanks for the feedback. You don’t have to run the BMD software before starting the tool so long as you had set the BMD software to use IP address not device name in the connection settings.
      It is only when you have multiple ATEM’s and want the XTouch to control a different one than the BMD software that you can set the ip address on the command line of the tool (in a desktop shortcut for example).

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google photo

You are commenting using your Google account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.