aboutsummaryrefslogtreecommitdiff
path: root/docs/cue-list.rst
blob: b6bda0895e6e01507c8c37279de27131caa806e1 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
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.