Starlet is an experimental Lisp-based domain-specific language (DSL) for theatrical lighting control. It's based on Guile and sends its DMX output via OLA to almost any type of lighting control interface - DMX, sACN, Art-Net etc. Starlet is aimed specifically towards theatre performances - plays, rather than music.

Combine Starlet with a MIDI controller and an interactive programming tool such as Conjure, and you get a free and open source lighting control solution including an amazingly large fraction of the functionality of a modern lighting console costing thousands of Euros! This video introduction shows the idea much better than words alone:

Here's a preview of how a show is written using Starlet. First, this is a cue list:

(define my-cue-list
    (cue 1
        (cue-state (at dim1 '100))
                   (at mh1 'pan 25))
        #:fade-up 3
        #:fade-down 5)
    (cue 2
        (cue-state (at dim1 '50)
                   (at dim2 '100)
                   (at mh1 'pan 50))
        #:fade-up 3
        #:fade-down 1
        #:down-delay 3)
    (cue 3
        (cue-state #f)  ; blackout
        #:fade-down 2

Cue lists are played back by creating a playback object and using the go method to run each cue. You can also skip between cues:

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

(cut-to-cue-number! pb 1)
(go! pb)
(go! pb)
(go! pb)  ; and so on

Lighting states can be prepared separately, assigned to variables and passed around in all the normal Scheme ways:

(define my-spooky-dungeon-state
    (at dimmer1 dimmer2 20)
    (at moving-light 70)
    (at moving-light 'red 100)
    (at moving-light 'green 10)
    (at moving-light 'blue 12)))

You can use pre-prepared states in cues, even if some minor modifications are needed. This makes it really easy to understand the contents of a cue without having to interpret a screenful of numbers:

(cue 57
     (cue-state (apply-state spooky-dungeon)
                (at follow-spot 100))
     #:fade-up 3
     #:fade-down 3)

Mult-part cues are supported. Simply specify the fade parameters and which fixtures should be in the part:

(cue 64
     (cue-state (apply-state indoor-act1-general)
     #:fade-up 3
     #:fade-down 3

     (cue-part (dim3
                (list moving-light 'pan 'tilt))
               #:down-time 2
               #:down-delay 1))

Everything from a simple dimmers to wacky multi-parameter fixtures are supported. New fixture classes can be defined using some simple Scheme code. Patching fixtures looks like this:

(patch-fixture! dimmer1 <generic-dimmer> 1))
(patch-fixture! dimmer2 <generic-dimmer> 3))
(patch-fixture! balcony-backlight1 <generic-dimmer> 18))
(patch-fixture! balcony-backlight2 <generic-dimmer> 19))
(patch-fixture! footlights <generic-dimmer> 23))
;; Universe numbering starts at zero, matching OLA
(patch-fixture! moving-light <robe-dl7s-mode1> 1 #:universe 4))

Note that the names of the fixtures are just normal Scheme variables. They can be anything you like, and you're encouraged to make the names more descriptive than logical channel numbers, where appropriate.

There are many stage lighting software projects, but most of them seem to concentrate on “disco style” effects and chases whereas Starlet is aimed more towards theatre shows. Here are some that I found especially interesting:

It's also worth taking a look at the stage-lighting topic on Github.

Getting Starlet

More information on Github.