Skip to content

Instantly share code, notes, and snippets.

@derchrisuk
Created November 11, 2017 21:40
Show Gist options
  • Save derchrisuk/f540eca0817b176672ad92d8852ca2a1 to your computer and use it in GitHub Desktop.
Save derchrisuk/f540eca0817b176672ad92d8852ca2a1 to your computer and use it in GitHub Desktop.
/* Functional prototype of a physical Voctomix button deck with a take button,
implemented on the Stream Deck -- pivot 2017-11-11 */
const path = require('path');
const streamDeck = require('elgato-stream-deck');
var net = require('net');
var source_ids = new Array('slides', 'cam1', 'cam2', 'cam3');
var mode_ids = new Array('fullscreen', 'picture_in_picture',
'side_by_side_select', 'side_by_side_equal');
var mode_output = 0;
var mode_select = 0;
var srca_output = 0;
var srca_select = 0;
var srcb_output = 0;
var srcb_select = 0;
var btn_state = new Array(
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1);
var socket;
/* Communication with Stream Deck */
function update_button(i, r, g, b)
{
if (btn_state[i * 3] == r &&
btn_state[i * 3 + 1] == g &&
btn_state[i * 3 + 2] == b)
return;
streamDeck.fillColor(i, r, g, b);
btn_state[i * 3] = r;
btn_state[i * 3 + 1] = g;
btn_state[i * 3 + 2] = b;
}
for (var i = 0; i < 15; i++)
update_button(i, 0, 0, 0);
function update_buttons()
{
/* first row */
update_button(0, 0, 0, 0);
if (mode_output == 3)
update_button(1, 255, 0, 0);
else if (mode_select == 3)
update_button(1, 0, 255, 0);
else
update_button(1, 42, 42, 42);
if (mode_output == 2)
update_button(2, 255, 0, 0);
else if (mode_select == 3)
update_button(2, 0, 255, 0);
else
update_button(2, 42, 42, 42);
if (mode_output == 1)
update_button(3, 255, 0, 0);
else if (mode_select == 3)
update_button(3, 0, 255, 0);
else
update_button(3, 42, 42, 42);
if (mode_output == 0)
update_button(4, 255, 0, 0);
else if (mode_select == 3)
update_button(4, 0, 255, 0);
else
update_button(4, 42, 42, 42);
/* second row */
update_button(5, 0, 0, 0);
if (mode_output != 0 && srcb_output == 3)
update_button(6, 255, 0, 0);
else if (mode_select != 0 && srcb_select == 3)
update_button(6, 0, 255, 0);
else
update_button(6, 42, 42, 42);
if (mode_output != 0 && srcb_output == 2)
update_button(7, 255, 0, 0);
else if (mode_select != 0 && srcb_select == 2)
update_button(7, 0, 255, 0);
else
update_button(7, 42, 42, 42);
if (mode_output != 0 && srcb_output == 1)
update_button(8, 255, 0, 0);
else if (mode_select != 0 && srcb_select == 1)
update_button(8, 0, 255, 0);
else
update_button(8, 42, 42, 42);
if (mode_output != 0 && srcb_output == 0)
update_button(9, 255, 0, 0);
else if (mode_select != 0 && srcb_select == 0)
update_button(9, 0, 255, 0);
else
update_button(9, 42, 42, 42);
/* third row */
update_button(10, 0, 0, 255);
if (srca_output == 3)
update_button(11, 255, 0, 0);
else if (srca_select == 3)
update_button(11, 0, 255, 0);
else
update_button(11, 42, 42, 42);
if (srca_output == 2)
update_button(12, 255, 0, 0);
else if (srca_select == 2)
update_button(12, 0, 255, 0);
else
update_button(12, 42, 42, 42);
if (srca_output == 1)
update_button(13, 255, 0, 0);
else if (srca_select == 1)
update_button(13, 0, 255, 0);
else
update_button(13, 42, 42, 42);
if (srca_output == 0)
update_button(14, 255, 0, 0);
else if (srca_select == 0)
update_button(14, 0, 255, 0);
else
update_button(14, 42, 42, 42);
}
streamDeck.on('down', keyIndex => {
switch (keyIndex) {
case 1: mode_select = 3; break;
case 2: mode_select = 2; break;
case 3: mode_select = 1; break;
case 4: mode_select = 0; break;
case 6: srcb_select = 3; break;
case 7: srcb_select = 2; break;
case 8: srcb_select = 1; break;
case 9: srcb_select = 0; break;
case 11: srca_select = 3; break;
case 12: srca_select = 2; break;
case 13: srca_select = 1; break;
case 14: srca_select = 0; break;
/* take */
case 10:
/* send command to voctomix core */
var cmd = 'set_videos_and_composite ' + source_ids[srca_select] +
' ' + source_ids[srcb_select] + ' ' + mode_ids[mode_select];
console.log('> ' + cmd);
socket.write(cmd + '\n');
/* previous output becomes new selection */
srca_select = srca_output;
srcb_select = srcb_output;
mode_select = mode_output;
break;
}
update_buttons();
});
streamDeck.on('error', error => {
console.error(error);
});
/* Communication with Voctomix Core */
socket = new net.Socket();
socket.connect(9999, '10.73.80.3', function() {
socket.write('get_video\n');
socket.write('get_composite_mode\n');
socket.write('get_stream_status\n');
});
socket.on('data', function(data) {
data = String(data);
if (data.substr(-1) == '\n')
data = data.substr(0, data.length - 1);
if (data.substr(-1) == '\r')
data = data.substr(0, data.length - 1);
console.log('< ' + data);
var fields = data.split(' ');
if (fields[0] == 'video_status' && fields.length == 3) {
srca_output = source_ids.indexOf(fields[1]);
srcb_output = source_ids.indexOf(fields[2]);
} else if (fields[0] == 'composite_mode' && fields.length == 2)
mode_output = ode_ids.indexOf(fields[1]);
update_buttons();
});
socket.on('close', function() {
console.log('disconnected from voctomix core');
});
socket.on('error', error => {
console.error(error);
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment