aboutsummaryrefslogtreecommitdiff
path: root/docs/cue-list.rst
diff options
context:
space:
mode:
Diffstat (limited to 'docs/cue-list.rst')
-rw-r--r--docs/cue-list.rst276
1 files changed, 276 insertions, 0 deletions
diff --git a/docs/cue-list.rst b/docs/cue-list.rst
new file mode 100644
index 0000000..b6bda08
--- /dev/null
+++ b/docs/cue-list.rst
@@ -0,0 +1,276 @@
+=======================
+Cue lists and playbacks
+=======================
+
+Anatomy of a cue
+================
+
+Here is cue 4.3 representing a 4 second crossfade to a dim lighting wash::
+
+ (cue 4.3 ;; Cue number 4.3
+ (crossfade 4 ;; Cross-fade in 4 seconds
+ (lighting-state ;; To a lighting state...
+ (at washL washR 30) ;; ... consisting of 'washL' and 'washR' at 30% intensity
+ (at washM 40)))) ;; ... and 'washM' at 40% intensity.
+
+Other types of transition are possible. For example, the simplest transition
+of all is a "snap" (a hard, immediate change)::
+
+ (cue 4.3
+ (snap
+ (lighting-state
+ (at washL washR 30)
+ (at washM 40))
+
+The simplest transition effect is ``snap``, which produces a hard zero-time
+transition to the cue. The usual one is ``crossfade``, which produces a smooth
+fade in the time you specify (in seconds). It gives you a lot of control, for
+example, to fade intensities up in 4 seconds but down in 2 seconds::
+
+ (crossfade 4 2 state)
+
+To delay the up fade part by 2 seconds relative to everything else::
+
+ (crossfade 4 #:up-delay 2 state)
+
+To delay the down fade part, use ``#:down-delay``. To control the fade times
+for non-intensity parameters, use ``#:attr-time`` and ``#:attr-delay``.
+Putting it all together for a complicated crossfade::
+
+ (crossfade 3 4
+ #:up-delay 2
+ #:attr-time 1
+ #:attr-delay 1.5
+ (lighting-state ...))
+
+You can write your own transition effects, if you want some other kind of
+transition. Documentation pending, but look at snap-transition.scm and
+crossfade.scm for some examples.
+
+The lighting state does not have to feature a literal ``lighting-state`` form.
+Let's say you defined a state somewhere else::
+
+ (define my-state
+ (lighting-state
+ (at spotSR spotSL 50)
+ (at spotCS 100)))
+
+You can refer to that state in a cue like this::
+
+ (cue 3
+ (crossfade 3 5 my-state))
+
+You can also layer changes on top of the state, by using ``apply-state`` (which
+does exactly what its name suggests)::
+
+ (cue 3
+ (crossfade 3 5
+ (lighting-state
+ (apply-state my-state)
+ (at upstage-spot))))
+
+You can even make those changes conditional::
+
+ (define spot-needed #f)
+
+ (cue 3
+ (crossfade 3 5
+ (lighting-state
+ (apply-state my-state)
+ (when spot-needed
+ (at upstage-spot 100)))))
+
+
+Multi-part cues
+===============
+
+To make certain fixtures fade differently during the same cue, simply add a
+separate transition for each part. Here's an example (from a real show)::
+
+ (cue 3
+
+ (crossfade 6 #:up-delay 14
+ (lighting-state
+ (at highsideL intensity 100.0)
+ (at highsideR intensity 100.0)
+ (at front-leds colour (cmy 0 93 80))
+ (at splitL splitR 70)
+ (at washL washR 100)
+ (at washM 50)))
+
+ (crossfade 3
+ (lighting-state
+ (at portrait-spot 100)))
+
+ (crossfade 3 #:up-delay 16
+ (lighting-state
+ (at front-leds 100))))
+
+In this example, the ``portrait-spot`` fades up first, in 3 seconds. The main
+part of the scene fades up more slowly, in 6 seconds after a delay of 14
+seconds. The ``front-leds`` (a group containing all of the front-light LED
+fixtures) fades up a further 2 seconds after that. Note that the cue parts
+don't need to appear in chronological order. However, the first cue part is
+"special", because it's the one *into* which the other parameters will track
+(see below).
+
+
+Cue lists
+==========
+
+A cue list is simply a list of cues. For example::
+
+ (cue-list
+
+ (cue 0.5
+ ;; Tab warmers
+ (snap
+ (lighting-state
+ (at washL washR 30)
+ (at washM 40))))
+
+ (cue 0.8
+ (crossfade 6 blackout))
+
+ (cue 1
+ ;; Act 1, Scene 1
+ (crossfade 3
+ (lighting-state
+ (at front-wash 80)
+ (at moverL colour (cmy 21 0 0))
+ (at moverL 25))))
+
+ (cue 2
+ (crossfade 3 4 ;; Separate up/down fade times
+ (lighting-state
+ (at washM 100))))
+
+ (cue 2.5
+ (crossfade 2
+ (lighting-state
+ (apply-state home-state)
+ (at moverR 100)))))
+
+Just so you know, the cue list is represented internally as a Scheme *vector*,
+not a real list.
+
+
+Playback objects
+================
+
+The cue list doesn't do anything on its own. To actually see the contents on
+the stage, it needs to be loaded into a playback. In practice, the best way to
+work is to put the cue list in a file on its own and create the playback with
+a reference to that file::
+
+ (define pb
+ (make-playback
+ #:cue-list-file "shows/my-show.qlist.scm"
+ #:recovery-file "recovery.q"))
+
+The ``#:recovery-file`` is optional but highly recommended, discussed below.
+
+Once the playback has been created like this, if you change the cue list file
+then you can re-load it::
+
+ scheme@(guile-user)> (reload-cue-list! pb)
+ $8 = cue-list-reloaded
+
+If the modifications to the cue list file involved the currently active cue,
+the state shown on the stage will *not* be updated until you say so, with::
+
+ (reassert-current-cue! pb)
+
+The playback object shows useful information when printed::
+
+ scheme@(guile-user)> pb
+ $1 = #<<starlet-playback> state: ready current-cue: 43.0 next-cue: 44.0>
+
+For completeness, know that you can also create a playback like this::
+
+ (define my-cue-list
+ (cue-list
+ (cue ...)))
+
+ (define pb (make-playback #:cue-list my-cue-list))
+
+However, this makes it much harder to make subsequent changes to the cue list.
+
+
+Running cues
+============
+
+To rapidly jump (with a snap transition) to a cue, use ``cut-to-cue-number!``.
+To run a cue using the transition specified in the cue list, use
+``run-cue-number!``::
+
+ (cut-to-cue-number! pb 1)
+ (run-cue-number! pb 4)
+
+Calling ``go!`` will run the next cue in the cue list::
+
+ (go! pb)
+
+Playbacks also implement the other familiar operations:
+
+* ``(stop! pb)`` - immediately pause any running cue. The next call to
+ ``go!`` will continue it.
+* ``(cut! pb)`` - run the next cue, using a snap transition regardless of what
+ the cue specifies.
+* ``(back! pb)`` - go backwards one step in the cue list, using a snap
+ transition.
+
+
+Tracking
+========
+
+By default, non-intensity parameters will "track" from one cue into the next
+cue. That helps to avoid unexpected parameter changes, e.g. a moving light
+changing position while it dims. If you run cues *out of order*, the result
+will be the same as if you'd run the cues *in order* from the start, to get to
+the cue you wanted. If you're lucky enough to have never encountered a system
+that works any other way, just know that it works the way you'd expect it to
+work in a theatrical system.
+
+If you additionally want to track *intensities* into a cue, add
+``track-intensities`` as the first thing after the cue number::
+
+ (cue 1
+ (crossfade 3
+ (lighting-state
+ (at front-wash 80))))
+
+ (cue 2
+ track-intensities
+ (crossfade 3
+ (lighting-state
+ (at spotC 100))))
+
+In this example, cue 2 will include ``spotC`` at full intensity, **and**
+``front-wash`` at 80% intensity.
+
+
+Fixture presetting ("auto move while dark")
+===========================================
+
+Starlet tries as hard as it can to get non-intensity parameters into the right
+state before running a cue. In other words, it makes a big effort to avoid the
+audience seeing moving lights actually move. If a fixture's ``intensity``
+parameter is zero after running a cue, Starlet will set all its non-intensity
+parameters to the values in the next cue. Of course, if a non-intensity
+parameter changes while the intensity is non-zero, the audience will see the
+move!
+
+
+The recovery file
+=================
+
+The purpose of the playback recovery file is to make a rapid recovery after a
+crash (not that there will be any, of course!). If the file specified by the
+``#:recovery-file`` keyword argument to ``make-playback`` exists when the
+playback is created, the playback will immediately jump to the cue number in
+the file. Whenever you run (or jump to) a cue, the cue number in the file will
+be updated. If you don't use a recovery file, the playback will revert to cue
+zero on creation and you'll have to use ``cut-to-cue-number!``. That will
+create a blackout of a few seconds while you figure out the right cue number to
+pick up from where things went wrong.