Simple web-based interface to remote-control mixing consoles.
- 🎚 Compatible with different mixers
- 📱Responsive and mobile-friendly
- 🚀 Lightweight and performant
- 🕸️ Connect multiple clients
- 🌓 Light and dark mode
🚧 This project is still Work in Progress! 🛠️
It should be stable enough to use at small events, but do not rely on it as your only means of mixing. Use at your own risk.
I'm still not sure about the general direction for this project. Feel free to fork and experiment - PRs welcome.
💡 Also check out this project's companion app vlight for controlling DMX lights.
This project is not meant to control every little functionality of a certain mixing console; usually, there are better alternatives around for that. However, many of them
- only work for a single mixing console model
- only run on a single platform like Windows or iOS
- only support a single connected client at the same time
- are not mobile-friendly
This project tries to bridge these limitations by supporting basic controls for different mixing consoles, accessible from any device (mouse or touch), and multiple devices at once.
- Yamaha 01v96
- Behringer X32 / Midas M32
- Add your own (see below)
- Faders
- On/Off buttons
- Names
- Meters
- Categories (tabs), 2 levels deep
- Colors
You can build and run this project through Docker (in a Linux container):
> ./docker-build.sh
> ./docker-run.sh
Software needed:
Build tools for native Node.js addons are also needed depending on your platform. If the installation fails, install the tools listed in the node-gyp documentation.
Install and setup:
> yarn
Start in production mode:
> yarn start
Edit the config/remote-mixer-config.js
file. Instructions on how to configure each compatible mixing console are usually contained in the corresponding README in backend/src/devices
.
const userConfig = {
httpPort: 8080,
logLevel: 'info',
device: 'dummy',
}
module.exports = userConfig
Start in development mode with hot reloading:
> yarn dev
Code to control different mixing consoles is located in backend/src/devices
. Each file (or index.ts
in a sub-directory) needs to have a DeviceController
as default export.
import { DeviceController, DeviceMessageListener } from '@remote-mixer/types'
export default class MyDeviceController implements DeviceController {
deviceConfig = {
categories: [
{
key: 'ch',
label: 'Channels',
count: 32,
meters: true,
namePrefix: 'CH',
faderProperties: [
{ key: 'value', label: 'CH' },
{ key: 'aux1', label: 'AUX1' },
// ...
],
},
{
key: 'aux',
label: 'AUX',
count: 4,
namePrefix: 'AUX',
},
// ...
],
}
constructor(private listener: DeviceMessageListener) {
// connect, sync, and call this.listener() for any change
}
change(category: string, id: string, property: string, value: string): void {
// send the change to the mixing console
}
}
Checkout the dummy device for a minimal example that sends periodic random changes.
You can use existing device controllers as a baseline for similar consoles:
- Yamaha 01v96 for a MIDI controller
- Behringer X32 for an OSC controller