{"id":25037991,"url":"https://github.com/mattlamb99/vMix-EmberPlus","last_synced_at":"2025-10-20T22:30:54.420Z","repository":{"id":275347157,"uuid":"925800478","full_name":"mattlamb99/vMix-EmberPlus","owner":"mattlamb99","description":"vMix to EmberPlus Gateway. Control \u0026 Tally from vMix API to EmberPlus","archived":false,"fork":false,"pushed_at":"2025-02-01T20:31:36.000Z","size":2,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-02-01T21:28:27.670Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mattlamb99.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2025-02-01T19:23:42.000Z","updated_at":"2025-02-01T20:31:39.000Z","dependencies_parsed_at":"2025-02-01T21:29:33.429Z","dependency_job_id":"0dccdf94-4da7-4c3e-a152-0a5cbac1bfec","html_url":"https://github.com/mattlamb99/vMix-EmberPlus","commit_stats":null,"previous_names":["mattlamb99/vmix-emberplus"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mattlamb99%2FvMix-EmberPlus","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mattlamb99%2FvMix-EmberPlus/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mattlamb99%2FvMix-EmberPlus/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mattlamb99%2FvMix-EmberPlus/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mattlamb99","download_url":"https://codeload.github.com/mattlamb99/vMix-EmberPlus/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":237403368,"owners_count":19304417,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2025-02-06T02:01:28.621Z","updated_at":"2025-10-20T22:30:48.914Z","avatar_url":"https://github.com/mattlamb99.png","language":"JavaScript","funding_links":[],"categories":["Recently Updated","Video Production"],"sub_categories":["[Feb 04, 2025](/content/2025/02/04/README.md)"],"readme":"# vMix EmberPlus Bridge\n\n## Overview\n\nThe **vMix EmberPlus Bridge** is a Node.js application that acts as a bridge between a vMix instance and EmberPlus clients, such as Lawo's VSM.\n\n It performs the following functions:\n\n- **Monitors vMix Status:**  \n  - **Tally Updates:** Receives a string like `TALLY OK 0121...` where each digit represents the tally state for an input (0 = off, 1 = program, 2 = preview).\n  - **ACTS Updates:** Receives individual lines such as:\n    - `ACTS OK Recording 1`\n    - `ACTS OK MultiCorder 0`\n    - `ACTS OK Streaming 1`  \n    These indicate the statuses for Recording, MultiCorder, and Streaming respectively.\n\n- **Exposes an EmberPlus Provider Tree:**  \n  The tree includes:\n  - **Studio1A Subtree:**\n    - **Program Tally** (for up to 32 inputs)\n    - **Preview Tally** (for up to 32 inputs)\n    - **vMix Connected** flag (boolean)\n    - **ACTS Status** subtree with nodes for **Recording**, **MultiCorder**, and **Streaming** (boolean)\n  - **Functions Subtree:**  \n    Contains the following function nodes:\n    - **Auto Mix 1** (sends `FUNCTION CUT`)\n    - **Stinger 1** (sends `FUNCTION STINGER1`)\n    - **Stinger 2** (sends `FUNCTION STINGER2`)\n    - **Stinger 3** (sends `FUNCTION STINGER3`)\n    - **Stinger 4** (sends `FUNCTION STINGER4`)\n    - **Transition 1** (sends `FUNCTION TRANSITION1`)\n    - **Transition 2** (sends `FUNCTION TRANSITION2`)\n    - **Transition 3** (sends `FUNCTION TRANSITION3`)\n    - **Transition 4** (sends `FUNCTION TRANSITION4`)\n  - **Matrices Subtree:**  \n    Contains an example matrix.\n\n- **Function Invocation:**  \n  When an EmberPlus function is invoked (via an EmberPlus client), the bridge sends the corresponding vMix command (if the TCP connection is active).\n\n- **Robust Connection Handling:**  \n  If the vMix TCP connection fails, the bridge uses an exponential back-off strategy (with delays of 2, 4, 8, 16, then 30 seconds) to attempt reconnection. The \"vMix Connected\" node in the EmberPlus tree reflects the connection status.\n\n\n## Requirements\n\n- Node.js (v12 or later recommended)\n- npm (Node Package Manager)\n\n## Installation\n### Docker\n```docker run -p 9000:9000 -e VMIX_HOST=\u003cyour_vmix_host\u003e -e VMIX_PORT=8099 mattlamb99/vmix-emberplus-bridge```\n### Locally\n1. **Clone the Repository:**\n\n   ```bash\n   git clone \u003crepository_url\u003e\n   cd \u003crepository_directory\u003e\n2. **Install Dependencies:**\n\n   ```bash\n   npm install\n\n   This project depends on:\n\n* emberplus-connection\n* chalk\n# Configuration\nBy default, the bridge expects the vMix instance to be available on localhost port 8099. If your vMix instance is running on a different host or port, \nset ENV variables ```VMIX_HOST``` and or ```VMIX_PORT```\n\n\n```\nconst VMIX_HOST = 'localhost';\nconst VMIX_PORT = 8099;\n```\n## Usage\nRun the bridge with:\n\n```\nnode bridge.js\n```\n\nThe application will:\n\n* Start the EmberPlus server on port 9000.\n* Attempt to connect to vMix and subscribe to both TALLY and ACTS updates.\n* Update the EmberPlus tree with live data:\n* * Tally Updates for Program and Preview tallies.\n* * ACTS Updates for Recording, MultiCorder, and Streaming statuses.\n* * vMix Connected status.\n* Listen for function invocations and, if triggered, send the corresponding commands to vMix.\n\n# EmberPlus Tree Structure\n```\nvMix\n ├─ Studio\n │    ├─ Program Tally\n │    │      └─ Input 1 … Input 32 (boolean values)\n │    ├─ Preview Tally\n │    │      └─ Input 1 … Input 32 (boolean values)\n │    ├─ vMix Connected (boolean)\n │    └─ ACTS Status\n │           ├─ Recording (boolean)\n │           ├─ MultiCorder (boolean)\n │           └─ Streaming (boolean)\n ├─ Functions\n │    ├─ Auto Mix 1 (FUNCTION CUT)\n │    ├─ Stinger 1 (FUNCTION STINGER1)\n │    ├─ Stinger 2 (FUNCTION STINGER2)\n │    ├─ Stinger 3 (FUNCTION STINGER3)\n │    ├─ Stinger 4 (FUNCTION STINGER4)\n │    ├─ Transition 1 (FUNCTION TRANSITION1)\n │    ├─ Transition 2 (FUNCTION TRANSITION2)\n │    ├─ Transition 3 (FUNCTION TRANSITION3)\n │    └─ Transition 4 (FUNCTION TRANSITION4)\n └─ Matrices\n       └─ Test Matrix (example)\n```\n# vMix TCP API Subscriptions\n### TALLY Updates:\nSent using:\n``SUBSCRIBE TALLY``\n\nResponses (e.g., ``TALLY OK 0121``...) update the Program and Preview tallies for each input.\n\n### ACTS Updates:\nSent using:\n``SUBSCRIBE ACTS``\n\nResponses update the corresponding ACTS statuses for:\n\n* Recording\n* MultiCorder\n* Streaming\n\n## Function Commands\nThe following functions send the corresponding commands to vMix when invoked:\n\n| Ember Function |\tvMix Command |\n| --- | --- |\n| Auto Mix 1 | FUNCTION CUT |\n|Stinger 1\t| FUNCTION STINGER1\n|Stinger 2\t| FUNCTION STINGER2\n|Stinger 3\t| FUNCTION STINGER3\n|Stinger 4\t| FUNCTION STINGER4\n|Transition 1 | FUNCTION TRANSITION1\n|Transition 2 |\tFUNCTION TRANSITION2\n|Transition 3 |\tFUNCTION TRANSITION3\n|Transition 4 |\tFUNCTION TRANSITION4\n\n# Error Handling \u0026 Reconnection\nIf the vMix TCP connection is lost:\n\n* The vMix Connected node is updated to false.\n* The bridge logs a human-readable error message.\n* A reconnection attempt is scheduled with exponential back-off:\n* * 2 seconds, then 4 seconds, then 16 seconds, and finally 30 seconds between attempts.\n* When the connection is re-established, the vMix Connected node is updated to true and the bridge resubscribes to both TALLY and ACTS updates.\n\n# License\nThis project is licensed under the MIT License.\n\n# Contributions\nPull requests \u0026 help is welcome.\n\n# Acknowledgments\nvMix TCP API Documentation\nEmberPlus and the EmberPlus Connection Library.\nChalk for colorized logging.","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmattlamb99%2FvMix-EmberPlus","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmattlamb99%2FvMix-EmberPlus","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmattlamb99%2FvMix-EmberPlus/lists"}