Cross Platform Remote Control

[Requires QLab 4.2]

This chapter looks at remote control of QLab, using different operating systems on a range of devices. It opens up the possibilities of creating control panels on cheap tablets costing less than 50 dollars.

In addition to QLab, it uses the following software which can be downloaded without charge, using the links below.


Open Stage Control is a desktop OSC bi-directional control surface application. It’s built on web technologies and run as an Electron web server that accepts any number of clients.

What this means is that once you have it up and running, you can log in to the server from a Google Chrome web browser on any device that supports it. Currently, this includes Windows 7 or later, MacOS 10.10 or later, Linux v2.24 or later , iOS10 or later, Android Jelly Bean or later.

It’s software that is very much in development, it seems very stable,  but you would need to test it thoroughly for your application. The Developer, Jean-Emmanuel is very responsive. In fact, this project relies on a feature that did not exist, that Jean-Emmanuel incorporated by coding a custom module in JavaScript within a day of requesting it.

Example Project

This project is going to use an almost identical workspace to that used in this QLab Cook Book chapter


This project uses Open-Stage-Control  to synchronise a fader bank remote running on any of the devices listed above with the sliders in the selected cue in QLab. It also displays the number and name of the current cue.

Here’s it is  in action (Best Viewed full screen):

Here is the QLab workspace we are going to control.


The workspace contains a main cue list with 3 cues in a fire all group

Each cue is an 8 track WAV file of an instrument with repeated notes. Each of  8 notes of the C major Scale C-C are on separate tracks.

Here’s the Open Stage Control panel running in its own GUI:


And here it is on a Chrome browser on an iPad.


And on a Windows PC


You can have many clients connected to the server simultaneously, and it’s possible to run the server headless.

Open Stage Control

To Launch the server

Open Open-Stage-Control .app

The pre-launch window will open.

In the send field type

This is the IP address for localhost, i.e the computer all these programs are running on followed by a colon and the port number that QLab listens out for OSC messages on (53000)

If we were opening a file we would select it using the button with dots to the right of the load field

We are going to create a new file by ticking the checkbox in Blank

This project requires a custom module which is included in the project download linked at the end of the chapter. The file is named


set the custom module to this file using the file browser dots icon on the right  of the field

launch OSC

Now you can hit START

If the editor isn’t visible click the menu icon at the top right and then turn the editor on.

Select the TAB_1 object in the Editor. In the Style section of the menu change the label from auto to QLab Current Cue Faders 1-8


Right-click in the gridded area and add a fader object with

+Add widget/ Sliders/ Fader.



Now we’ll set up all the editor parameters necessary to get out fader to control the master fader of the selected cue in QLab. Click the fader to open the editor window for that object.

Change the widget id to fader_0 to match the QLab sliders designations.

Select the pips checkbox to display the fader legends and the input check box so the fader can be externally controlled.

In the range field type this:

“min”: -60,
“80%”: 0,
“73%”: -5,
“65%”: -10,
“53%”: -20,
“39%”: -30,
“26%”: -40,
“12%”: -50,
“max”: 12

This sets the maximum and minimum values for the fader and also the position and label of the subdivision pips on the legend.

In the OSC section

set the precision to 2

set the address for the fader to


and append a pre argument to the message of 0 so the  complete message sent to QLab is

/cue/selected/sliderLevel 0

Copy the fader by right-clicking on it and selecting copy then right click again in a blank area of the canvas and select paste/ID +1 repeat the paste another 7 times to create a master and faders 1-8.

For each of the faders 1-8 the only editing you need to do is to change the prearg to the fader number e.g 3 for fader_3

You can now test these control the corresponding sliders in QLab.

We’ll now add some other controls that won’t do anything until we have put the corresponding cues into a QLab workspace.

Cue Information Fields

Right-click in the canvas to create  2 plot/text objects

Label 1 of them current cue number and the other Current Cue Name

set the address of  the current cue number to /text_1 and the  address of the current cue name to /text_2

Momentary Sync Button

To make a momentary push button to trigger a cue we will make shortly in  QLab, to send the data for the current cue:

Right-click in the canvas and select add widget/button/push

Change the label for this button to

SYNC QLab Values for Selected Cue

and set the OSC address to


OSC Stop Start

So it is possible to turn on and off the continuous OSC updating, right click and add widget/buttons/switch

label the switch Continuous QLab Values for Selected Cue

Set its values to

“Request”: 1,
“STOP”: 0

To create 2 switch positions with corresponding values

set the address to


This switch controls the actions of the custom module we loaded


Here is the JavaScript from that file:


An in-depth analysis of the JavaScript  syntax is beyond the scope of this chapter, but the basic idea is fairly clear from the code, depending on the state of the button described above, Open-Stage Control will send the OSC message /cue/sendYourValuesToMe/start  to QLab 4 times a second.


Save the project from the save button in the edit pane and close Open-Stage-Control

Launching the demo Open Stage Control project

Open Open-Stage-Control.

In the launcher window, set the load field to the file path of OpSC Faders.json (the project file) using the file selector dots to the right of the field

set the custom-module field to the file path ofsendYourValuesTpMe.js  again, using the file selector dots to the right of the field.

Make sure blank isn’t ticked

Click on START

QLab Workspace

We need to get QLab to regularly report the sliderLevels of the currently selected cue, together with its cue number and name, so that Open-Stage-Control can follow changes in the selected cues and any level changes performed in QLab itself.

In order for QLab to communicate with Open-Stage-Control we have to create a path in settings/network

Name a patch OpSC set the destination address to localhost and the port to Open-Stage-Control’s default receive port (8080)


In QLab create a new cue list and name it OSC.

Create a fire all group cue in this list and number it SYNC

Create  a network cue, set it’s destination to OpSC, and set it to send the OSC message

/cue/selected/sliderLevel 0 #/cue/selected/sliderLevel 0#

This uses an OSC query (the bit between the hashes) to get the level of slider 0 (Master) in the currently selected cue and sends that as the argument to the OSC message /cue/selected/sliderLevel 0 which will set the Open-Stage-Control fader with that address i.e Fader0

Copy the cue 8 times to create Network cues for the other 8 Open-Stage-Control  faders editing the OSC message appropriately e.g for Fader 1 sliderLevel 1

/cue/selected/sliderLevel 1 #/cue/selected/sliderLevel 1# etc.

2 further network cues are required to send the cue number and name to the  objects in Open-Stage-Control

The OSC message for the network cue that sends the currently selected cue number is:

/text_1 “#/cue/selected/number#”

and for the cue name

/text_2 “#/cue/selected/number#”

Note the quote marks around the OSC query. This allows spaces in the result of the query to be sent to Lemur. If you omit them, then only the first word of the cue name is sent.


The example QLab workspace, together with the Open-Stage-Control .json file and the custom module .js file   can be downloaded  here

Chapter Bonus Project.

A great feature of Open-Stage-Control is its ability to use variables within the address portion of an OSC message. This means, for instance, that you can use an array of 100 numbered push buttons and start a QLab cue by pressing the relevant button on the remote.

Here it is in action:


How it works:







There is a single multipush object in OpenStage Control







The Size of the matrix is set in the matrix field

You can set the start number of the matrix so you could have bigger buttons with, for instance, 16 per Tab

The spacing sets the space around each button


true in the norelease field means only one message will be sent per push



a string in this field will be used to define the widgets’ addresses, replacing dollar signs ($) with their respective index i.e the number of the button pushed. e.g /cue/3/start


You can download the .json file to load with Open Stage Controller and the example QLab workspace here


Chapter Author: Mic Pool

Chapter Graphic: Electron Logo used under a free  Expat License