A tally light is a indication light used in multi-(video)camera environments that light up when a specific camera is being used (i.e. shown for IMAG (image magnification), or when recording). Often these lights are built-in on professional broadcast cameras; but they are also useful for consumer and non-broadcast-like cameras.
Having bought a few M5StickC devices out of boredom, I decided to write a program to use these as tally lights, since they come with an inbuilt LCD! After a day (or three) of finding libraries, remembering how to program in C++, figuring out CMake configurations, and bug fixes… I present Talyte!
M5StickC
These are ESP-32 devices with lots of cool builtin components - a display, RTC clock, IR blaster, buttons, a decent amount of GPIO, and also an integrated battery
Talyte
I wrote Talyte fairly modularly, as I had in mind the idea to incorporate its features into a later project that has more capabilities. It comes as a complete system firmware for the M5StickC, but also as a library that can be used in other code bases.
Now, there is a project called Tally Arbiter built by my friend Joseph, which already does exactly this and much much more… and it’s also free and open source - but it requires additional software on the host machine unlike mine*. Also I wanted to make one anyway :') Do checkout the project though!
* Whilst Talyte can operate purely with OBS + obs-websocket, I would recommend also running the optional Talyte Assistant application too
Generally when I develop software for ESP32 or ESP8266 devices, I’ve always used the Arduino IDE - which is rather clunky and honestly not that great. In the spirit of trying out new things, I installed PlatformIO and did not regret it.
PlatformIO is provided as an extension for VS Code, which is my primary IDE for most projects. Being my primary IDE, I have a lot of extensions (and dark themes) installed to improve my programming experience. Being able to develop code with VS Code was really good as I was familiar with the layout, keybinds and syntax highlighting rules amongst others (and once again, dark theme).
The main screen of Talyte is the Tally View, which flashes Red (when on program), Green (when on preview), or is off when not being cued.
The Information View shows some information about the current program/preview scenes and the device.
There is also a third page which allows you to assign a new scene to be observed by Talyte.
Demo
Also did you know in C++ you can define a function by putting all three types of brackets next to each other? [](){}
is a void function, that accepts no arguments, and does nothing… But that’s cool I guess!
Talyte Assistant
During development, I realised that the events sent from OBS was rather voluminous and noisy - There were many events being sent, and each event was quite large. It wasn’t ideal to receive all of this data, as it will take time to process on the ESP32 microprocessor; and the fact that I’d be discarding the majority of data anyway.
However I also didn’t want to create my own application protocol as I wanted Talyte to be plug-and-play with a stock OBS
+ obs-websockets
setup. I ended up writing a WebSockets proxy application which solves this issue by relaying only the required event data from OBS to Talyte.
This dramatically improved the processing time on the ESP32!
I decided to write Talyte Assistant in C++ instead of node.js or some other language because I wanted the program to be dependency free; to not require regular users to have any sort of software development environment. This meant remembering how to set up all of the associated C/C++ things like CMake files, compiler flags, cross-platform dependencies - and also looking at Doxygen docs for the first time in a long while 😂…
Overall, I’m very happy with what I was able to accomplish in three days.
It took abit of time to remember how to develop in C++, but realistically even if I had written everything in another language, it would probably still take three days.
I hope to be able to use this in some future video set!
EDIT: I tried it!
So I got the opportunity to try it out during a livestream that I was doing… it works yay!
In the future I’d like to add an inbuilt configuration tool to select the Wireless Network, and Websockets IP + Port, as right now I have to compile those settings in and flash it over - not the most versatile way huh.
EDIT: 16th July 2021 - I’ve added it in! Read here