Elgato Stream Deck as Production Controller

A few months ago, I picked up this nifty device called a Stream Deck made by Elgato Gaming. It’s a 15-button USB keyboard with LCD buttons. It’s primarily marketed towards gamers who live stream so they can have quick access to commands and functions as they stream. The programmer in me couldn’t resist trying it out to help us with our production setup.

elgato-strream-deck-boxshot-tecs
The Stream Deck sells for about $140.

Using the base software provided, I was able to fairly quickly implement a workflow to allow volunteers to have easy access to buttons that then fire commands on our Ross Dashboard Production Control ecosystem. If you’ve not used Dashboard before, you can read about how we use it at my church here. It’s fairly easy to set up a custom panel in Dashboard that runs an HTTP web server at a specific port, which in turns allow you to “click” a button on the panel by calling that button’s trigger ID remotely via a specific URL.

Using the “URL” method provided in the base software, we are able to make web calls to the Dashboard custom panels to fire the commands. All the logic/code remains in Dashboard, and this just becomes a method of executing those commands remotely via an HTTP request.

Screen Shot 2018-05-01 at 8.16.41 PM
Here is a screenshot of the base software provided by Elgato. It’s very functional as is.

We used the base software for a few months without issue, however quickly realized the limitation of not being able to have bi-directional communication between our Dashboard Production Control and the individual Stream Decks. For example, several of our commands act as “toggles”, meaning we can have a few different state options that represent the current status of a device. If I only had one person making changes or operating the system, it wouldn’t be a huge issue. That person would hopefully remember what button they pressed last. However, when there are a lot of moving parts and multiple people controlling systems, the ability to update status on all devices becomes very helpful.

Enter NodeJS. People smarter than me took the time to write a base NodeJS library to control the Stream Deck. I hadn’t written in NodeJS before, but being a programmer, I was ready to learn something new. I downloaded and installed all the necessary libraries, IDE, etc. and quickly whipped up some code using the base library to control our stream decks. In just a few hours, I had something operational and started running it from the command line. I then spent a couple of weeks refining it and now we have a fully functional, self contained app that can run on Mac, Windows or Linux. It’s packaged using the Electron libraries made freely available with the Node platform.

1024x1024
This was the quick icon I whipped up for the software.

My controller software uses a base JSON file which defines the button structure of the stream deck. This makes it very flexible and expandable as our needs grow as I can just modify the JSON file to change the button structure.

Screen Shot 2018-05-01 at 8.25.25 PM
Here’s an example screenshot of one of my button files, written in JavaScript Object Notation. This allows me to add or remove buttons very easily and also programmatically.

The software then parses that JSON and builds the buttons on the Stream Deck in real time. If a button has a trigger action assigned, the command is sent to the corresponding device. I’ve written support for several protocols, including the Dashboard Web Call, RossTalk (good for sending messages to your Ross equipment), OSC, VideoHub routing, and more. You can even do internal stuff like jumping from one button page to another, changing button images during actions, etc. Each button can support an unlimited number of button actions, which I called triggers.

Screen Shot 2018-05-01 at 8.17.40 PM
The app runs completely in the tray with a simple context menu.

It also supports defining a set of devices, so if there’s a device you want to send messages to often, you can define the device in a separate file along with its host, port, type, etc. and then only refer to that device in the button structure. That way, if any of those related variables change,  you only have to change it in one place.

The software also runs a basic TCP listener server on a specific port, and this is where the bi-directional communication comes into play. Anytime a command is run on the master Dashboard Custom Panel Production Control, it relays a message to the remote Stream Deck via the TCP listener and updates the state of the button.

screen-shot-2018-05-01-at-8-18-05-pm.png
The settings menu allows you to choose the button/device files you want to use as well as whether the TCP listener service and notifications are turned on.
Screen Shot 2018-05-01 at 8.18.13 PM
A sample notification that can appear when a button is pressed. You can determine which triggers sent notifications.

This means that we can run commands from any originating location, whether it is the web-based production control (that I’m still developing), one of the remote Dashboard panels that connects to Production Control, one of the Stream Decks (we currently have 2 of them, one in each control room), or even the Master Control panel and every device will receive an updated status.

I also added a “Virtual Deck” option, which allows you to operate the software with or without having a physical Stream Deck attached. You can also choose to have the Virtual Deck operate independently of your physical Stream Deck, so it’s like having two decks in one!

Screen Shot 2018-05-01 at 8.17.26 PM
Here is a screenshot of the Virtual Deck in action.
Screen Shot 2018-05-01 at 8.18.26 PM
Here is what some buttons that have been toggled look like on the Virtual Deck. It’s very clear to see the current state of those buttons!

I am making this software freely available to anyone who can benefit from it. My hope is that the local church can make use of this to allow their volunteers to more easily operate tech equipment during services.

It’s currently up on GitHub here: https://github.com/josephdadams/StreamDeckProductionController

I’ve only built a Mac binary, but you can easily package it for Windows or Linux if needed.

I am working on an Editor function right now that will allow you to add/edit buttons without having to write them in JSON, but until then, you’ll have to make do with that option. Here’s a good tutorial on learning JSON if you need help: https://www.codecademy.com/courses/javascript-beginner-en-xTAfX/0/1

If I can help you out along the way, don’t hesitate to reach out!

Controlling BlackMagic VideoHub from Ross Dashboard

Here’s a quick post to share how to control your BlackMagic VideoHub from a Ross Dashboard Custom Panel.

If you have any BlackMagic VideoHub router, it comes with software that allows you to make routing changes over the network. It’s pretty simple and easy to use.

What you may not know is that it can also accept telnet commands by default over port 9990. This means you can control it from a command line, or by sending TCP messages.

Ross Dashboard has a built in function, rosstalk.sendMessage which is designed for sending simple TCP messages. Combine these two things together, and now you can have a button on your own custom panel where you can make a video route easily.

In Dashboard, create a new custom panel, and add a button to that panel.

Screen Shot 2018-04-30 at 2.54.39 PM

Under Tasks, click “Add”, and type in this code:


var command = "VIDEO OUTPUT ROUTING:\r\n";

var videoHub_address = "192.168.1.100";

var destination = 5;
var source = 25;

command = command + (destination -1) + " " + (source - 1) + "\r\n\r\n";

rosstalk.sendMessage(videoHub_address, 9990, command, null);

The router operates with zero based indexes, which means if your destination number is 5, for example, the router treats it internally as 4. So, this script just substracts those numbers internally before submitting the command to the router.

Happy routing!

Bridging Traditional Wired Intercom with Mobile Devices

We have two venues running services simultaneously, with volunteers all over the place. Communication is essential to us staying on schedule and coordinating our efforts.

Our primary wired intercom is the Clearcom Encore system. Nothing too fancy – just your standard analog 4 channel party line system with main stations, remote stations, and single channel belt packs placed throughout the control rooms, auditoriums, and tech booths. In each auditorium, we use 1 channel for tech communication and 1 channel for the band in-ears. That takes up all four channels.

 

Photo Apr 29, 8 00 00 PM
Here is one of our four-channel stations for our Tech Directors to use. They can talk on any channel.

 

 

Photo Apr 29, 8 00 37 PM
Most of the volunteers have a single channel station where they can only talk on one channel.

 

Where we have really leveraged this technology is with our bridge to mobile intercom, using a software product called Unity Intercom. By itself, Unity is a Mac-based server application with remote clients (iOS, Mac, Android, Windows, etc.) that connect over the network. Version 2 was limited to 6 partyline channels, but Version 3 that was just released has an option to extend that to 128 partyline channels, which is impressive! The Unity Intercom software is a great solution for allowing mobile intercom use.

The flexibility for us comes with the bridge from our traditional wired intercom to the Unity system so that no matter which system we are using, we can communicate with everyone. There are a lot of ways to do this, like using a 2-wire to 4-wire interface, but we bridge ours using Dante (audio over IP) with a product from Studio Technologies, the ST-45DC.

m45dc_f_72p-e1517952265955m45dc_b_72p-e1517952276513

This interface comes with 2 standard 3-pin partyline intercom connections, and an ethernet port for the Dante network. It’s POE-capable, so if your network switch supports it, no other power supply is needed.

 

Photo Apr 29, 8 01 31 PM
You can see both 45DCs and our Unity Server Mac Mini here in the rack. They are powered by the network switch and everything is connected over the network.

 

With two of these 45DC’s, we can bridge all four channels of our wired ClearCom intercom to the Dante network. Our Unity server (running on a Mac Mini) has Dante Virtual Soundcard which allows us to bring in Dante network audio as audio input. You do need the “Advanced I/O” Module from Unity in order to bring your audio in/out.

 

Photo Apr 29, 8 03 07 PM
Here is a view of the inside of the rack. You can see the back of the 45DC;s, the Mac mini, and the intercom patchbay as well. I wired ours through the patchbay for ultimate flexibility, but it isn’t absolutely necessary to do this.

 

Intercom audio can now pass from the analog intercom system, through the Studio Tech 45DC’s, through Dante directly to the Unity server. Any audio that comes out of Unity goes back to the 45DC’s via a Dante subscription, and the 45DC’s take care of all audio nulling. A side benefit: With your intercom traffic on Dante, you can route it to other places too, like recorders, speakers, etc. Want to record a channel of intercom to be able to listen later and improve your production communication? With this setup, it’s no problem!

To use the wireless intercom, we usually ask volunteers to install the free Unity client app on their personal devices and connect to our server. We have campus-wide public wifi, so they can be anywhere in the facility and still communicate on intercom. The Unity server allows you to control which users can listen to which channels, and you can  control which ones they are allowed to talk  as well.

 

photo-apr-29-8-09-00-pm.jpg
We also have inexpensive tablets available for volunteers who may not have a personal device to use.

 

I had our IT department configure port forwarding which allows us to access the Unity server from outside the network (i.e. the Internet), which means we can be anywhere in the world and still communicate with the team in real-time, if necessary! This will be very helpful should we ever go multi-site or otherwise have an off-campus event that requires coordination with on-site volunteers.

Setup Recap:

  • You need an existing Wired Intercom like the ClearCom Encore System.
  • As many bridging interfaces as desired for the channels you want available to Unity
  • Mac computer to run Unity (you can dedicate a computer or just use one you already have)
  • Unity Server with as many licenses as you need, as well as the Advanced I/O License
  • Dante Virtual Soundcard software for the Unity server computer

If you are considering a wireless intercom workflow to use with your wired intercom, I hope this helps!

Using Ross Dashboard for Production Control

At my church, we rely heavily on Ross products for our video systems. We have two Carbonite switcher panels/frames and several OpenGear frames with cards doing things from audio embedding/de-embedding, video up/down/cross conversion, fiber conversion, etc. The Ross framework makes all that possible.

A great product that Ross makes is their Dashboard software. It’s free, cross-platform, and with the community forums available, you have a lot of power at your fingertips to control all of your equipment. I would highly recommend it even if you don’t use other Ross products.

With Dashboard, you can create your own custom panels to do whatever you need. It does require some programming knowledge if you really want to have full control to design and create your own workflows, but if you’re up for learning, there are plenty of resources available to help you along the way. It uses Java and JavaScript technologies.

screen-shot-2018-04-18-at-1-29-37-pm-e1524072685120.png
Here’s a screenshot of some code in one of my panels.

In ministry, it’s always great when we can create simpler systems where volunteers can succeed, which is why tools like this are so valuable. I started creating my own custom panels in Dashboard about 4 years ago. The first one I created was a panel to control and arm our Aja Ki Pro recorder so we could easily record the sermon video for later editing. The first version wasn’t too fancy, it basically just allowed you to enter a custom clip name and start/stop recording, but it suited our needs.

Screen Shot 2018-04-15 at 6.49.20 PM

I later wrote a full transport control version that allowed you to cue up or delete clips, rewind, fast forward, etc. I’ve made both versions of this custom panel available and there are churches, new stations, and government agencies all over the country using both version of these panels. This is all possible because Aja created a RESTful API that can be used to access their KiPro devices, and through Dashboard, we can take advantage of that.

Screen Shot 2018-04-15 at 6.49.53 PM.png

If you’d like a copy of this panel to use in your church, let me know. I would be happy to send it to you!

I’ve also created custom panels to turn on/off projectors and do simple operations on the video switchers (by firing custom controls through Dashboard), and over time this developed into the complex but flexible system we use today. Now we have a “master production control” custom panel that is always open in DashBoard on one of the production machines.

Screen Shot 2018-04-15 at 6.54.36 PM.png

Then, each production machine has Dashboard installed and is running one of the remote panels I’ve created.

Here is an example of one of the remote panels, used primarily for turning projectors on and off in one of the auditoriums and controlling screens we use in those rooms. I tend to customize these panels for their application, only giving them the command options necessary for that area.

Screen Shot 2018-04-15 at 6.56.02 PM

This master control panel is where all of the code lies that does the actual work, whether it is turning a projector on, executing a custom control on a video switcher, setting a PTZ camera preset, etc. This is great because now anytime I make a performance improvement, add a new feature, etc., I only have to add it to the master control panel, and the remote clients will get that benefit when they execute the command.

The remote panel simply sends a web HTTP request to the master panel at a specific address and port, which triggers the corresponding button on the master panel.

Screen Shot 2018-04-15 at 6.55.46 PM

The master control panel then keeps track of the remote listeners and sends updates as commands are executed. Right now, I primarily use this to update an activity log on each remote client, or to update the state of a button if needed, but the flexibility is there to do what I want, and all of the clients can stay up to date no matter who pressed a button from any particular machine.

I hope this gives you a few ideas for your tech ministry on ways to simplify equipment and production control! If you need help along the way, drop me a line. Happy coding!

First Post

Hello! Welcome to this blog. The goal and purpose will be to share some projects, thoughts, and ideas on how to effectively use technology in ministry, to serve the local church and advance God’s Kingdom.