Fingers On Buzzers

This chapter shows how to create a quiz buzzer system that uses iPads running Touch OSC. One iPad is placed in front of each contestant, and they tap the iPad screen to “buzz in.”

Later in the chapter we’ll look at using alternative buttons and displays that can be used with the example QLab workspace in case you don’t want to use iPads.

For clarity, the example uses two iPads for two contestants. The methods described can be expanded easily to any practical number of contestants.

Here it is in action; best viewed full screen:

How it works

The entire surface of each iPad is a button. When the iPad is pressed, QLab registers the press and locks out any other iPad button presses. It switches on the circular ‘LED’ area of the winning iPad and additionally displays the winner’s name on a video output (shown in the screen recording in the audition window in the lower left of the frame.)

The system is reset for the next question with the hotkey R.

In QLab 4, contestants’ names can be changed by simply editing the cue names of cues within the workspace. After changing the names, the hotkey ⇧S updates the iPads with the new names. This also edits the Text cues that display the contestants’ names on the video output.

Network Setup

For best results, use a dedicated wifi network with static IP addresses. On the Mac, Visit System Preferences → Network and set up a static IP as shown here:

Network setup on the Mac

The example uses the 192.168.x.y address space, but any private IP address scheme will work.

Each iPad needs to be connected to the same network and each needs a unique static IP address. Here is iPad 1 connected to the router with the IP address 192.168.0.22:

Network setup on iPad 1

iPad 2 could use 192.168.0.23, etc.

Next, TouchOSC needs to be configured on each iPad with the IP address of the Mac running QLab (192.168.0.21), the outgoing port that QLab uses to listen for OSC (53000), and the incoming port that QLab will use to send OSC (53001).

These settings are the same for all iPads used, although the local IP address shown on each iPad will of course be unique to each iPad.

TouchOSC setup on iPad 2

Next, QLab needs network destinations for each iPad, so that it can send OSC messages to each. Go to Workspace settings → Network and set up two network patches like this:

Network setup in QLab

While we’re here in Workspace Settings, we’ll set QLab to run the reset cue when the workspace opens so that it is in a state to immediately receive input from the iPads:

Workspace open cue

iPad TouchOSC Setup

The interface of TouchOSC is programmed using TouchOSC Editor on the Mac. Basic proficiency in TouchOSC Editor is outside the scope of this chapter, so you may wish to take some time to familiarize yourself with it before proceeding.

For each iPad, there are three main interface elements shown here in TouchOSC Editor:

First, a “Push Button” covering the whole screen:

Contestant 1 button

On iPad 1, the button sends /cue/1/start via OSC. This means when the button is pressed, it will start cue 1 in QLab. The Value Range for the button is irrelevant here and can be ignored.

Second, a circular “LED” which will be switched on and off by QLab to indicate which contestant buzzed in first for each round:

Contestant 1 LED

The LED uses the default (auto) OSC address /1/led1, which will be the same on all iPads. Since each iPad has a different IP address, and is therefore reached by QLab using a separate network patch, the OSC address itself can be the same on each iPad without creating a conflict.

Third, a “Horizontal Label” to indicate which contestant the iPad is being used by:

Contestant 1 label

This is initially programmed to “CONTESTANTx” in the text field and the OSC address is the auto default /1/label1. This address allows QLab to change the contestant’s name by sending an OSC message to the iPad. For example, sending /1/label1 DAVE will change the label from “CONTESTANT1” to “DAVE”.

Here’s the pushbutton for iPad 2:

Contestant 2 button

The example uses a different color for all the elements on iPad 2. This is purely aesthetic, however, and you can make your own color choices without affecting the functionality.

The custom OSC message for the pushbutton on iPad 2 is /cue/2/start. which means that pressing the button will start cue 2 in QLab.

Putting It All Together

Here’s the QLab workspace, standing by for the contestants to buzz in:

Fingers On Buzzers!

Here’s what happens when iPad 1 is pressed first:

  • iPad 1 sends the OSC message /cue/1/start to QLab on port 53000, which starts cue 1.
  • Cue 1 is a Start cue which starts Group cue iPad1. When this Group is triggered it does the following:
  1. Disarms Group cue STARTS which prevents further iPad button presses from registering.
  2. Plays an Audio cue to give an aural indication that the button was pressed. The example uses different sounds for iPad 1 and iPad 2.
  3. Starts a Text cue which displays the contestant’s name on a video output.
  4. Stops the default “ready” text state of the video screen (The “Fingers on Buzzers” message.)
  5. Turns on the TouchOSC “LED” on iPad 1 by sending the OSC message /1/led1 1 to the network patch destination “2 - ipad1” which we set up earlier. Here’s a screen shot of the Network cue that does this:

Network cue - LED

If iPad 2 had pressed first, cue 2 would have started Group cue iPad2. This does exactly the same things as the Group cue for iPad1, has different content for the Audio and Text cues, and sends the OSC message /1/led1 1 to destination patch “3 - ipad2”.

When the reset cue is run, usually by pressing the hotkey R, the following happens:

  • All TouchOSC ‘LED’s are turned off on the iPads by sending /1/led1 0 to each iPad destination patch.
  • All iPad Group cues are stopped, turning off the contestant name on the video screen.
  • A Text cue is run to put “Fingers on Buzzers!” on the video screen
  • Group cue STARTS is re-armed
  • All cues are loaded to make sure QLab responds as quickly as possible.

Note: cues which are left loaded for a long time may be invisibly unloaded by macOS, because macOS is inscrutable when it comes to background memory management. There is no way to know how long “a long time” is, and there is no way to see whether it’s happened or not. For practical purposes, unless the Mac is busy doing all kinds of things, or unless the Mac has less than 4GB of RAM, you can trust loaded cues to stay loaded for at least several minutes, and possibly much longer. We really wish we could be more specific about this, but we really cannot.

Editing Contestant Names (QLab 4 only)

In QLab 3, if you want custom contestant names you’ll need to manually enter them in TouchOSC Editor, then edit the Titles cues in QLab.

In QLab 4, however, you can enter contestant names by simply renaming the two Network cues in the Group cue numbered names at the bottom of the list, replacing Contestant 1 and Contestant 2.

When Group names is run, either using the hotkey ⇧S or by selecting the cue and triggering GO, the cue names of those two Network cues (numbered ipad1N and ipad2N) are transferred to the iPads using OSC messages like this:

/1/label1 #/cue/ipad1N/name#

The OSC between the hash marks is an OSC query. So this message sends /1/label1 plus the name of cue ipad1N.

You can find out more about OSC queries here.

The Group also sets the text of the Text cues to the new contestant names.

Using the QLab workspace without iPads

If you don’t have, or don’t want to use, iPads for the contestants, the workspace can also work with MIDI input. A contact closure to MIDI device such as the Midi Solutions F8 works nicely, allowing you to wire up any button, switch, or foot pedal to a 1/4” TS plug, and send a MIDI note when that contact is closed.

All you’d need to do is add MIDI triggers to the Start cues at the top of the workspace.

If, for example, you configured your MIDI hardware so that pressing button 1 sent MIDI Note On 60, you’d need to set the trigger of cue 1 like this:

MIDI trigger

You would then need to set a separate note for cue 2, maybe Note On 61.

Happy Buzzing!!