[Updated for QLab 4.1 13 JUL 2017  revised Nov 2017]

The Devamp cue is very important in allowing sound and video designers to follow the timing of performers, rather than performers having to tailor their performances to preset timings. This example uses audio cues, but you can do exactly the same thing with video loops.

The origins of the technique go back beyond Vaudeville.  Imagine a man balancing a chair on his nose. It might take anything from ten to twenty-five seconds for him to have it balanced, during which the orchestra would ‘vamp till ready’ round some drum rolls and tremolando strings. When the chair was stable the music would change seamlessly to triumphant chords. Sometimes the performer would manage 10s before the chair fell, on a good day it might be more than a minute, so again the music would vamp until ready until the chair fell, was caught and the music seamlessly transitioned to a double tempo for the playoff.

Here’s a video of a simple vamp sequence, using 2 loops of drums and a final cymbal splash.

How It Works: Cue 1 is set to an infinite loop

Q1 Loop

Cue 2 is a ‘start first child and go to next cue’ group. It contains a devamp cue targeting cue 1 and set to start the next cue and stop its target cue. When cue 2 is fired, it waits for cue 1 to complete the current iteration of the audio loop it is playing and then fires the next cue, i.e. another looped audio cue, Loop 1.wav and stops cue 1.

devamp settings

Cue 3 is similar. The cymbal crash is the coda to this cue sequence, and only plays once, it is not looped. This works very well, but if the devamp cue was given when the loop had just started, we would be waiting for nearly 8 beats, (over 3 seconds at this tempo), before the sequence advanced to the next loop. Here’s a video of the same sequence but this time the programming allows the devamp to trigger either at the end of each 4 beat, 2 beat, or 1 beat phrase of the currently running cue. This makes its operation similar to the quantize feature in programs like Ableton Live.

How It Works:

All the examples in the video use a second audio cue, with its volume out i.e. muted, in each group, running alongside the audio cue we can hear.  The length of this muted cue is set to a fraction of the length of the 8 beat phrase we are devamping. e.g in the second example where we devamp after 2 beats the length of the dummy, muted cue is 1/4 of the length of the audible cue.

2 beat devamp

The silent cue is used as the devamp. It is also necessary to add a cue to fade and stop the audible cue, as this is no longer the target of the devamp and will not be stopped by it.

Method 2: This video shows a different method of devamping. There is only one audio cue which is sliced. The devamps tell the play head to continue when it reaches the next slice, instead of performing the loop, if present.

In this example, in the workspace, I have decoupled the playhead from the selection, in order to display the sliced waveform so you can observe it while other cues are run. When the playhead is decoupled, the highlight stays on the selected cue which is displayed in the inspector, and the play head is just the white arrow-head on the left-hand side of the cue list. An OSC command has been used in the example workspace, but you can also set this from settings/general in QLab.  It is reset at the end of this example, but if you need to reset it manually you can press 1 which will trigger a script to reinstate ‘selection follows playhead’.

devamp with slices

The final example here demonstrates, that as well as devamping loops, the slices can also be used to trigger other events.

Cues on Slices

The slices all have their play counts set to 1, so the audio cue plays straight through. Every time a slice marker is encountered a cue is triggered which plays all the cues in a fire all group named DO THESE CUES ON SLICE. This group can contain any cues you like; MSC to fire a lighting board, video cues, subtitles etc. In the example, just to make clear that a cue is happening, an audio cue is fired on each slice with a spoken GO announcement. Each DO THESE CUES group also contains the cue which triggers the next devamp. This is delayed by a tenth of a second to allow the playhead time to pass the marker before it sets the next devamp.

Here is the cue in action:

In the workspace, there is one further example that has all the slices reset to loop, and allows the devamps to be cued manually. The DO THESE CUES group is fired as before on each devamp.

Cues on slices manual

You can download a workspace containing all the examples here

A further refinement which results in a much cleaner workspace is this structure devised by Drew Schmidt:


It uses a group which loops round to devamp cues contained in a separate group cue. following the group containing the sliced cue and the looping group. The example uses MSC cues, but you could use any other cue types instead. If you want to trigger multiple cues then the best way would be to put start cues in this group to trigger other group cues with multiple cues within.

Here it is in action:

One of the problems with any devamp method of triggering cues on slices is that there is no easy way to load a sequence to time and have the correct cues triggered. There are no marker ids in QLab, so if you load to time halfway through an audio cue, which would have triggered 3 devamps if played from the start the next slice it hits will still trigger the first devamp, In QLab 4.1 it is possible to get a list of slice markers using AppleScript. This next example is work in progress insofar as it needs some extra scripting to handle edge cases, and more testing, but it works well enough to demonstrate a practical use of scripting using the slice marker list. It only works correctly with cue slices without loops i.e play counts of 1.

Here it is in action:

And here’s the workspace:

Load to time slice marker

How it works:

When the song group cue is triggered, the play head moves to the top of the numbered group cue following which contains the LX cues which will be triggered by the slices.

In the Song group cue LX101 is sent as a MIDI MSC cue to go with the start of the song, then the script is executed, which we will look at in detail in a moment.

The audio file in the numbered cue plays and then the devamp loop group. This group cue triggers a devamp cue with these settings:


When the next slice is reached it start’s the next cue which is a fire all children group cue containing;

A start cue targeting the main cue list which will cause the cue at the play head (currently at the start of the LX cues Group cue) to trigger.

A start cue targeting the Devamp Loop cue i.e the group cue the devamp is in. This sets the devamp ready for the next slice. (Note the short predate to ensure the slice has been passed before the devamp cue triggers, ready for the next slice)

The script cue contains the following script;

set thesong to “1.5” –cue number of yoursong
set thedevamps to “2” — cue number of group cue containing LX cues)
tell application id “com.figure53.QLab.4” to tell front workspace
set the pre wait of cue after cue “1.5” to duration of cue “1.5”
set theselected to cues whose q number of parent is “2”
set themarkers to slice markers of cue thesong
set thecount to number of items in themarkers
repeat with n from 1 to thecount
if time of item n of themarkers is less than action elapsed of cue “1.5” then
set the playback position of front cue list to item (n + 1) of theselected
set notes of cue “1” to n
end if
end repeat
end tell

2 variables are set with the cue number of the sliced audio cue and the cue number of the group cue containing the cues to be triggered by the slices. These are put at the top so that they are easy to edit when you cut and paste the cues into your show workspaces.

The pre-wait of the stop cue (which targets its own group cue), following the audio cue, is set to the duration of the audio cue so the devamp loop stops when the file finishes.

set theselected to cues whose q number of parent is “2”

This sets the variable theselected to a list of the cue Ids of all the cues in the group cue containing the cues which are triggered on slices, which we will use in a moment to set the playback position of the cue list.

set themarkers to slice markers of cue thesong

This sets the variable themarkers to  a list of the slice markers  times (and play counts which we will disregard as this only works with play counts of 1)

The repeat loop goes through all the markers and for any marker time which is less than the action elapsed time of the audio cue advances the playhead (currently in the group cue containing the cues to be triggered by the slices) to the next cue.

So if the load to time is 0:00, then no markers will have a time less than the action time of the cue, so the play head will  remain at the top the group cue ready to trigger item 1

If the load to time in our example was 0:12 then 3 markers would have times less than the action elapsed time, and the playhead would be set to the 4th child cue of the group cue because

set the playback position of front cue list to item (n + 1) of theselected

would have last have been executed when n was 3.

You can download the example workspace with audio here

Chapter Author: Mic Pool

The drum loop used in the examples is by  v0idation
distributed under a Creative Commons 0 license (public domain)

Load to Time Video Demo Music: “Mysterioso March”
Kevin MacLeod (
Licensed under a Creative Commons Attribution 3.0 Unported License.
Creative Commons License