aboutsummaryrefslogtreecommitdiff
path: root/examples/conjure-demo.scm
blob: 65d2d24d5b58c785942774390af682abaefa88b3 (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
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
#!/usr/bin/guile
!#

(define useful-links

  (list

    '((Starlet)     (https://github.com/taw10/starlet))

    '((Conjure)   (https://conjure.fun/))

    '((Video: Conversational Software Development by Oliver Caldwell)
      (https://www.youtube.com/watch?v=RU28xy9JXxs))

    '((Open Lighting Project)   (https://www.openlighting.org/))

    '((ChamSys MagicVis) (https://chamsyslighting.com/products/magicq))))


;; Very basic Conjure demo
(+ 1 1)
(define a 5)
(* a 3)
(reverse '(a b c d e f))


;; Basic setup
(use-modules
  (starlet fixture)
  (starlet state)
  (starlet scanout)
  (starlet playback)
  (starlet effects)
  (starlet colours)
  (starlet clock)
  (starlet fixture-library generic dimmer)
  (starlet fixture-library generic rgb)
  (starlet fixture-library robe mmxspot mode1)
  (starlet fixture-library robe mmxwashbeam mode1)
  (starlet midi-control base)
  (starlet midi-control button-utils)
  (starlet midi-control faders))


;; Start MIDI control
(start-midi-control "/dev/snd/midiC0D0"
            #:channel 14)


;; Fixtures are normal GOOPS objects, fixture types are GOOPS classes
(patch-fixture! red1 <generic-dimmer> 9)
(patch-fixture! red2 <generic-dimmer> 13)
(patch-fixture! red3 <generic-dimmer> 20)
(patch-fixture! red4 <generic-dimmer> 24)

(patch-fixture! led <generic-rgb> 1 #:universe 4)


;; Multiple fixtures can be defined at once
;; Example: Eight dimmers on channels 1-8 of universe 0
(patch-many! foh <generic-dimmer> (iota 8 1))


;; Define many more fixtures
(patch-fixture! ltruss1 <robe-mmxspot-mode1> 1 #:universe 1)
(patch-fixture! ltruss2 <robe-mmxspot-mode1> 39 #:universe 1)
(patch-fixture! ltruss3 <robe-mmxspot-mode1> 77 #:universe 1)
(patch-fixture! ltruss4 <robe-mmxspot-mode1> 115 #:universe 1)
(patch-fixture! ltruss5 <robe-mmxspot-mode1> 153 #:universe 1)
(patch-fixture! ltruss6 <robe-mmxspot-mode1> 191 #:universe 1)

(patch-fixture! rtruss1 <robe-mmxspot-mode1> 229 #:universe 1)
(patch-fixture! rtruss2 <robe-mmxspot-mode1> 267 #:universe 1)
(patch-fixture! rtruss3 <robe-mmxspot-mode1> 305 #:universe 1)
(patch-fixture! rtruss4 <robe-mmxspot-mode1> 343 #:universe 1)
(patch-fixture! rtruss5 <robe-mmxspot-mode1> 381 #:universe 1)
(patch-fixture! rtruss6 <robe-mmxspot-mode1> 419 #:universe 1)

(patch-fixture! floor1 <robe-mmxwashbeam-mode1> 100)
(patch-fixture! floor2 <robe-mmxwashbeam-mode1> 134)
(patch-fixture! floor3 <robe-mmxwashbeam-mode1> 168)
(patch-fixture! floor4 <robe-mmxwashbeam-mode1> 202)
(patch-fixture! floor5 <robe-mmxwashbeam-mode1> 236)
(patch-fixture! floor6 <robe-mmxwashbeam-mode1> 270)


;; Set a parameter
(at foh 'intensity 80)
(at floor4 'intensity 100)
(at floor4 'colour (make-colour-rgb 0 100 0))


;; If parameter is not specified, 'intensity' is understood
(at red1 100)


;; Functions can be assigned to parameters
(let ((clock (make-clock)))
  (at (list-ref foh 0)
      'intensity
      (lambda ()
        (* 50
           (+ 1 (sin (* 2 (elapsed-time clock))))))))


;; Effects library
(at floor2 'intensity (flash 1.3))
(at floor2 'colour (make-colour-cmy 0 0 100))
(at floor2 'pan 0)
(at floor2 'tilt (sinewave 0.5 100 170))


;; Clean up
(clear-state! programmer-state)


;; Fixtures can be grouped together
(define ltruss (list ltruss1
                     ltruss2
                     ltruss3
                     ltruss4
                     ltruss5
                     ltruss6))

(define rtruss (list rtruss1
                     rtruss2
                     rtruss3
                     rtruss4
                     rtruss5
                     rtruss6))

(define floor (list floor1
                    floor2
                    floor3
                    floor4
                    floor5
                    floor6))

(define red (list red1
                  red2
                  red3
                  red4))

(at red 100)
(at rtruss 100)
(at rtruss 'zoom 80)
(at rtruss 'colour (make-colour-cmy 0 100 0))
(at rtruss 'tilt 70)
(at rtruss 'pan 200)
(at rtruss 'prism #f)


;; Clean up again
(clear-state! programmer-state)


;; Control fixtures via MIDI surface
(sel ltruss6)
(at 100)        ;; Without fixture name 'at' applies to selected fixture(s)
(sel rtruss1)
(sel #f)
(sel ltruss5)
(at 'colour (make-colour-cmy 0 0 100))


;; Record a state to a variable, then clear up
(define my-state
  (state-source programmer-state))

(clear-state! programmer-state)


;; Recall a stored state
(apply-state my-state)

(clear-state! programmer-state)


;; Put a lighting state on a MIDI fader
(state-on-fader 19 my-state)

;; Create a cue list
(define my-cue-list
  (cue-list

    (cue 1
         (lighting-state
           (at ltruss1 (quote pan) 206)
           (at ltruss1 (quote tilt) 108.0)
           (at ltruss1 (quote zoom) 6300/127)
           (at ltruss1 (quote intensity) 109)
           (at ltruss1 (quote colour) (make-colour-cmy 0 600/127 3800/127))

           (at rtruss6 (quote pan) 334)
           (at rtruss6 (quote intensity) 133)
           (at rtruss6 (quote zoom) 4200/127)
           (at rtruss6 (quote tilt) 111)
           (at rtruss6 (quote colour) (make-colour-cmy 0 100/127 3100/127))

           (at red4 (quote intensity) 30)
           (at red3 (quote intensity) 30)
           (at red1 (quote intensity) 30)
           (at red2 (quote intensity) 30)

           (at led 'intensity 20)
           (at led 'colour (make-colour-cmy 50 21 0))))

    (cue 2
         (lighting-state
           (apply-state my-state))
         #:up-time 1
         #:down-time 1)

    (cue 2.5
         (lighting-state
           (apply-state my-state)
           (at ltruss6 'colour (make-colour-cmy 100 0 0))
           (at rtruss1 'colour (make-colour-cmy 0 40 0))

           (at led 'intensity 100)
           (at led 'colour (make-colour-cmy 50 100 0)))
         #:up-time 3
         #:down-time 3
         #:attr-time 2)

    (cue 3
         (lighting-state
           (at floor3 (quote pan) 299)
           (at floor3 (quote intensity) 156)
           (at floor3 (quote tilt) 48)
           (at floor4 'colour (make-colour-cmy 200/127 11500/127 100))
           (at floor3 'colour (make-colour-cmy 200/127 11500/127 100))
           (at floor4 (quote intensity) 127)
           (at floor4 (quote pan) 239)
           (at floor2 (quote intensity) -58)
           (at floor4 (quote tilt) 49)
           (at led 'colour (make-colour-rgb 0 50 80))
           (at led 'intensity 100))
         #:up-time 3
         #:down-time 3)))


(define pb
  (make-playback
    #:cue-list my-cue-list))

(cut-to-cue-number! pb 0)


;; Run cues
(go! pb)


;: Jump between cues
(cut-to-cue-number! pb 1)


;; Run cues out of order
(run-cue-number! pb 2)


;; Set up MIDI controller buttons to run cues
(make-go-button pb 12
                #:ready-note 20
                #:pause-note 16)
(make-stop-button pb 24
                  #:ready-note 24)
(make-back-button pb 28
                  #:ready-note 28)

;; A second set of go/stop buttons, because this works well on my controller
(make-go-button pb 15
                #:ready-note 23
                #:pause-note 19)
(make-stop-button pb 27
                  #:ready-note 27)
(make-back-button pb 31
                  #:ready-note 31)


;; Set up some buttons for quick access to fixtures
(select-on-button 32 ltruss
                  #:ready-note 68)
(select-on-button 33 rtruss
                  #:ready-note 69)
(select-on-button 34 foh
                  #:ready-note 70)
(select-on-button 35 floor
                  #:ready-note 71)


;; Red button de-selects everything
(select-on-button 26 #f
                  #:ready-note 26)