Created
November 11, 2017 21:40
-
-
Save derchrisuk/f540eca0817b176672ad92d8852ca2a1 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* 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