Devamps Demystified

The Devamp cue is very important in allowing sound and projection designers to follow the timing of performers, rather than performers having to tailor their performances to prearranged timings. This example uses Audio cues, but you can do exactly the same thing with looping Video cues. The origins of the technique go back to the days of Vaudeville and before. Imagine a man balancing a chair on his nose. It might take anywhere from ten to twenty five seconds for him to have it balanced, during which the live orchestra would “vamp ‘til ready” with some drum rolls and tremolo strings. Once the chair was stable, the music would change seamlessly to triumphant chords. The crowd goes wild. Sometimes the performer would manage ten seconds before the chair fell, on a good day it might be more than a minute, so again the orchestra would vamp until the chair fell, then seamlessly transition to a double tempo for the playoff.

Simple Vamp to Crash

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

How It Works

Cue 1 is set to loop infinitely.

Q1 Loop

Cue 2 is a Group cue set to “start first child and go to next cue”. It contains a Devamp cue targeting cue 1, and is 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 loop and then fires the next cue, i.e. another looped Audio cue called Loop 1.wav, and stops cue 1.

Devamp settings

Quantized Vamp to Crash

Cue 3 sounds similar, but behind the scenes it operates quite differently. 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 triggered when the loop had just started, we would be waiting for nearly eight beats, (over three 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 four-beat, two-beat, or one-beat phrase of the currently running cue. This makes its operation similar to the quantize feature found in programs like Ableton Live.

How It Works

All the examples in the video use a second Audio cue with its volume set to -inf running alongside the Audio cue we can hear. The length of this silent cue is set to a fraction of the length of the eight beat phrase we are devamping. For example, in the two-beat devamp approach, the length of the silent cue is one quarter of the length of the audible cue.

Two-beat devamp

The silent cue is the one that’s actually devamped. 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 cue and will not be stopped by it.

An Alternate Method

This video shows a different method of devamping. There is only one Audio cue here which is sliced. The Devamp cues tell the play head to continue when it reaches the next slice, instead of looping.

In this example the playhead is not locked to the selection, so that you can observe the sliced cue while other cues are run. When the playhead is unlocked like this, the selection stays where you put it, while the playhead, the white arrow-head on the left-hand side of the cue list, moves down the list as cues are triggered. An OSC cue has been used in the example workspace to unlock the playhead, but you can also turn this setting on and off in Workspace Settings → General. It is reset at the end of this example, but if you need to reset it manually you can press 1 which will trigger an OSC cue that locks the playhead to the selection.

Devamp with slices

The final example here demonstrates that as well as devamping loops, 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 “start-all” Group cue named DO THESE CUES ON SLICE. This Group cue can contain any cues you like: MSC to trigger a lighting board, Video cues, subtitles etc. In the example, just to make clear that a cue is happening, an Audio cue is triggered 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 example workspace, there is one further example that has all the slices set 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

A Fancier Method

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

Drew's devamp

It uses a looping Group cue which triggers cues contained in a separate Group cue. The example uses MIDI cues sending MSC messages, but works with any type of cue. If you want to trigger multiple cues on each devamp, the best way would be to put Start cues in place of the MIDI cues, and have those Start cues trigger other Group cues with multiple cues within. Here it is in action:

One of the problems with any devamp method based on 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 slice 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 and newer, 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 cue “song Group” is triggered:

  • a MIDI cue, LX101 is triggered.
  • a Script cue moves the playhead and does some other things which we’ll discuss in a moment.
  • an Audio cue plays the song itself.
  • a looping Group triggers a Devamp cue with these settings:

Devamp settings

When the next slice in the song is reached, the Devamp cue starts cue “start cues” which is a Group cue set to “start all children simultaneously.” This Group cue contains:

  • 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 start.
  • a Start cue targeting the Devamp loop cue, i.e the Group cue the Devamp cue is within. This sets the Devamp cue up to be ready for the next slice in the song. Note the short pre-wait to ensure the slice has been passed before the Devamp cue triggers.

Here’s the Script cue, as promised:

set thesong to "1.5" --cue number of your song
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

Two 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 these cues into your show workspaces. The pre-wait of the Stop cue (which targets its parent Group cue is set to the duration of the Audio cue “your song” so that the Devamp loop stops running when the song is done.

set theselected to cues whose q number of parent is “2” sets the variable theselected to a list of the cue IDs of all the cues in the Group cue “LX Cues”, which are the cues that the devamps will trigger.

set themarkers to slice markers of cue thesong sets the variable themarkers to a list of the slice marker times of the slices in the song.

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 playhead will remain at the top the Group cue ready to trigger item 1.

If the load to time is 0:12, then three markers would have times less than the action elapsed time, and the playhead would be set to the fourth 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.

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

Creative Commons License

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

Creative Commons License