diff options
author | Thomas White <taw@physics.org> | 2020-08-02 16:59:21 +0200 |
---|---|---|
committer | Thomas White <taw@physics.org> | 2020-08-02 16:59:21 +0200 |
commit | 65641890d23eaca494859a75780e7548df0a158e (patch) | |
tree | 887632d3bc8e312cfcfd35a59f62a4645be0b7fd | |
parent | 0596a81179a6c92a4e76a68b192c46769ea6beda (diff) |
Add fade-up
-rw-r--r-- | examples/demo.scm | 58 | ||||
-rw-r--r-- | guile/starlet/base.scm | 39 |
2 files changed, 77 insertions, 20 deletions
diff --git a/examples/demo.scm b/examples/demo.scm index cf5658d..17a031f 100644 --- a/examples/demo.scm +++ b/examples/demo.scm @@ -10,30 +10,52 @@ (start-ola-output) (start-midi-control "/dev/snd/midiC1D0") + +;; Light up some LEDs on the MIDI controller +(define led1 + (make-midi-led #:channel 14 + #:note-number 23)) + +(define led2 + (make-midi-led #:channel 14 + #:note-number 20)) + +(set-midi-led! led1 #t) +(set-midi-led! led2 #t) + + +;; Set up working lights on a MIDI fader +(define worklight (make-workspace)) + (define working-light-fader (make-midi-controller #:channel 14 #:cc-number 19)) +(set-attr! worklight dim11 'intensity + (lambda (a) + (get-controller-value working-light-fader))) +(set-attr! worklight dim12 'intensity + (lambda (a) + (get-controller-value working-light-fader))) +(set-attr! worklight dim13 'intensity + (lambda (a) + (get-controller-value working-light-fader))) + + + +;; Workspace for cue playback +(define cue-wksp (make-workspace)) + (define pot1 (make-midi-controller #:channel 14 #:cc-number 7)) -(define wksp (make-workspace)) - -(define (example-state wksp) - - (blackout wksp) +(define (example-state-1 wksp) ;; Front wash - (set-attr! wksp dim11 'intensity - (lambda (a) - (get-controller-value working-light-fader))) - (set-attr! wksp dim12 'intensity - (lambda (a) - (get-controller-value working-light-fader))) - (set-attr! wksp dim13 'intensity - (lambda (a) - (get-controller-value working-light-fader))) + (set-attr! wksp dim11 'intensity 100) + (set-attr! wksp dim12 'intensity 100) + (set-attr! wksp dim13 'intensity 100) ;; Sidelight (set-attr! wksp dim7 'intensity (flash 2)) @@ -44,9 +66,7 @@ (get-controller-value pot1)))) -(define (example2 wksp) - - (blackout wksp) +(define (example-state-2 wksp) ;; Front wash (set-attr! wksp dim1 'intensity 10) @@ -57,4 +77,6 @@ (set-attr! wksp dim7 'intensity (flash 5)) (set-attr! wksp dim8 'intensity 50)) -(example-state wksp) + +(fade-up cue-wksp example-state-1 + #:fade-time 1) diff --git a/guile/starlet/base.scm b/guile/starlet/base.scm index 2138654..fc97542 100644 --- a/guile/starlet/base.scm +++ b/guile/starlet/base.scm @@ -8,7 +8,7 @@ #:export (<fixture> <fixture-attribute> start-ola-output patch-fixture set-attr! home-attr! home-all! blackout - make-workspace scanout-freq + make-workspace fade-up scanout-freq percent->dmxval msb lsb chan)) (use-modules (srfi srfi-1)) @@ -70,7 +70,8 @@ (define-class <starlet-state> (<object>) (hash-table #:init-form (make-hash-table) - #:getter get-state-hash-table)) + #:getter get-state-hash-table + #:setter set-state-hash-table!)) (define-generic set-in-state!) @@ -149,6 +150,40 @@ (when attr (set-in-state! workspace fix attr value)))) +(define (fade-frac fade-time start-time time-now) + (min (/ (- time-now start-time) + fade-time) + 1.0)) + + +(define (wrap-fade value fade-time start-time) + (lambda (time) + (inexact->exact (* (value->number value time) + (fade-frac fade-time + start-time + (hirestime)))))) + + +;; "state" is a function with one parameter: a workspace +;; This function sets up "workspace" to fade in the state +(define* (fade-up workspace state + #:key (fade-time 5)) + (let ((fade-up-state (make <starlet-state>)) + (start-time (hirestime))) + + ;; Execute passed-in function to get state + (state fade-up-state) + + (state-for-each (lambda (fix attr value) + (set-in-state! fade-up-state + fix + attr + (wrap-fade value fade-time start-time))) + fade-up-state) + + (set-state-hash-table! workspace + (get-state-hash-table fade-up-state)))) + ;; Patch a new fixture (define* (patch-fixture class |