Disculpa, pero esta entrada está disponible sólo en Inglés Estadounidense. For the sake of viewer convenience, the content is shown below in the alternative language. You may click the link to switch the active language.

After reading and experimenting with the following references, I finally was able to control QLC+ with OSC, therefore allowing me to control DMX lights from an environment like Processing:

Here’s a small guide of how to configure QLC+ for that.

1 Set the Universe and Fixtures in the normal way

You should be able to control the DMX channels from the Simple Desk tab

2 Define the input/output mapping

In the Inputs/Outputs tab:

a) Activate the output device, for example DMX USB

b) Activate the OSC as the input device. The first option (127.0.01.) is the loopback address that you can use if you are only using your computer. The second option (another IP address) would be the one to use when working with different devices in a network.

Optional (recommended?): Also activate the OSC in the Feedback column, so that you can receive OSC feedback.

By default, the input OSC port of QLC+ is 7700, and the output port is 9000. These values for Universe 1.  The following universes would continue sequentially. Quoting from the page:

For example:
QLC+ Universe 1 –> OSC input port 7700, output port 9000
QLC+ Universe 2 –> OSC input port 7701, output port 9001

QLC+ Universe 8 –> OSC input port 7707, output port 9007

In your program, you should define the same addresses and ports. When sending something from your program, you should see a joystick icon appear next to the corresponding universe.

3 Define the OSC profile

This is very important and not very obvious. In the Inputs/Outputs tab, in the right go from Mapping to Profile.

By default the profile is “None”. In theory you can make your own, but I couldn’t make it work.

Choose one of the existing OSC profiles, for example Touch OSC Mix 16.

Double click it, and go to the Channels tab. There you’ll see a list of channels/names/type.

The names are the OSC addresses that you should be using from your program. 

For this example I will use channel 51085 that corresponds to the name /1/fader1 and that is a slider. You can always return to the list to map new controls.

4 Set a virtual device in the Virtual Console

Go to the Virtual Console tab, and create a new slider with the corresponding button.

Double click it to personalize it:

  • Change the Widget name to something useful for you, for example “Red 1”
  • In the External input section under General, click the Choose… button. Open the Touch OSC Mix 16 profile and search for a name you want to use, in this case we wanted /1/fader1. This will “plug” the OSC input with that address, to the virtual device.
  • Go to the Level tab and if there’s a button that says Switch to Level Mode, press it. You will then see many options, one of them is the list of fixtures and DMX channels. Here you will “plug” the virtual device to the real DMX output in the chosen channel.
  • Press OK

 

5 Switch to Operate Mode (Play)

Click the play button in the top right corner. This will enable the Virtual console. You should be able to move the slider and see a change in the given fixture. When you send an OSC message with the /1/fader1 address to the given address and port, and with a floating point value between 0 and 1, you should see the slider move to the corresponding position and the fixture responding accordingly.

Note that if you go to the Simple Desk tab you will also be able to see the state of the DMX channels. However, if you change a value from there, you will see that the slider will turn red – This means that the Simple Desk is overriding the Virtual Console and therefore the OSC values. To remove this, press the Reset universe button (the button with an X)

 

Sample Processing sketch

This is a Processing sketch that requires the oscP5 library (it’s a modification of the oscP5message example by Andreas Schlegel), and that would control the /1/fader1 channel (and slider in this example) with the x-coordinate of the mouse when it is clicked.

import oscP5.*;
import netP5.*;

OscP5 oscP5;
NetAddress myRemoteLocation;

void setup() {
  size(400,400);
  frameRate(25);
  /* start oscP5, listening for incoming messages at port 12000 */
  oscP5 = new OscP5(this,9000);
  
  myRemoteLocation = new NetAddress("127.0.0.1",7700);
}


void draw() {
  background(0);  
  
  if(mousePressed){
      OscMessage myMessage = new OscMessage("/1/fader1");
  myMessage.add(map(mouseX,0,width,0,1)); /* Map the mouse position to a value between 0 and 1 */
  /* send the message */
  oscP5.send(myMessage, myRemoteLocation); 

  print("### sent an osc message.");
  print(" addrpattern: "+myMessage.addrPattern());
  println(" typetag: "+myMessage.typetag());
  println(" value: "+myMessage.get(0).floatValue());
  }
}

/* incoming osc message are forwarded to the oscEvent method. */
void oscEvent(OscMessage theOscMessage) {
  /* print the address pattern and the typetag of the received OscMessage */
  print("### received an osc message.");
  print(" addrpattern: "+theOscMessage.addrPattern());
  println(" typetag: "+theOscMessage.typetag());
  println(" value: "+theOscMessage.get(0).floatValue());
}

Here’s a video of a similar program in action: