UNPKG

vtally

Version:

An affordable and reliable Tally Light that works via WiFi based on NodeMCU / ESP8266. Supports multiple video mixers.

113 lines (112 loc) 4.44 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const midi_1 = __importDefault(require("midi")); // @see https://static.roland.com/assets/media/pdf/V-8HD_reference_eng03_W.pdf class RolandV8HDConnector { constructor(configuration, communicator) { this.configuration = configuration; this.communicator = communicator; this.connected = false; this.interval = null; this.midi = midi_1.default; this.input_status = [0, 0, 0, 0, 0, 0, 0, 0]; } connect() { console.log(`Connecting to RolandV8HD V-8HD via MIDI`); this.midi_input = new this.midi.Input(); let inputPortCount = this.midi_input.getPortCount(); // select correct port for (let i = 0; i < inputPortCount; i++) { let name = this.midi_input.getPortName(i); if (name.includes("V-8HD")) { this.midi_input.openPort(i); console.log(`Opened Midi Port ${i}: ${name}`); break; } } this.midi_output = new this.midi.Output(); let outputPortCount = this.midi_output.getPortCount(); // select correct port for (let i = 0; i < outputPortCount; i++) { let name = this.midi_output.getPortName(i); if (name.includes("V-8HD")) { this.midi_output.openPort(i); console.log(`Opened Midi Output Port ${i}: ${name}`); break; } } // do not ignore SysEx messages. this.midi_input.ignoreTypes(false, true, true); // Callback Method for Midi Input this.midi_input.on('message', (deltaTime, message) => { //Check tally parameter area if (message[8] === 12) { // hdmi input id in byte 11 let channel_idx = message[10]; // tally information in byte 12 let input_status = message[11]; this.input_status[channel_idx] = input_status; // only notify program status change after full iteration (8 chans) if (channel_idx === 7) { this.processInputStatus(this.communicator); } } }); this.interval = setInterval(this.checkRolandV8HDStatus, this.configuration.getRequestInterval(), this.communicator, this.midi_output); if (this.midi_input.isPortOpen() && this.midi_output.isPortOpen()) { this.connected = true; this.communicator.notifyMixerIsConnected(); } else { console.log(`Cannot connect with RolandV8HD V-8HD. Please check connection and try again.`); } } processInputStatus(communicator) { let programs = []; let previews = []; // iterate through input status array for (let i = 0; i < 8; i++) { // process program if (this.input_status[i] === 1) { programs.push(`${i + 1}`); } // process preview if (this.input_status[i] === 2) { previews.push(`${i + 1}`); } } communicator.notifyProgramPreviewChanged(programs, previews); } checkRolandV8HDStatus(communicator, midi_out) { // Base SysEx message to RolandV8HD V-8HD let sysex_msg = [0xF0, 0x41, 0x10, 0x00, 0x00, 0x00, 0x68, 0x11, 0x0C, 0x00, 0x00, 0x00, 0x00, 0x03, 0x71, 0xF7]; // iterate through all 8 input chans for (let i = 0; i < 8; i++) { if (midi_out) { midi_out.sendMessage(sysex_msg); // increment input channel address sysex_msg[10] += 1; // decrement checksum by 1 sysex_msg[14] -= 1; } } } disconnect() { //clean interval clearInterval(this.interval); console.log(`RolandV8HD V-8HD connection closed`); this.midi_output.closePort(); this.midi_input.closePort(); this.connected = false; this.communicator.notifyMixerIsDisconnected(); return true; } isConnected() { return this.connected; } } RolandV8HDConnector.ID = "rolandV8HD"; exports.default = RolandV8HDConnector;