aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas White <taw@bitwiz.me.uk>2020-12-31 10:50:16 +0100
committerThomas White <taw@bitwiz.me.uk>2020-12-31 10:50:16 +0100
commit42f49129729e3f74244c4d752b225877cba631d2 (patch)
tree902b5076acdc0bc7e77cf95ec2dcaca371912c97
parent8aa3c8d107343a3e5f124989914351cdcea242ba (diff)
Select fixture and change parameters via MIDI
-rw-r--r--guile/starlet/base.scm20
-rw-r--r--guile/starlet/midi-control/base.scm10
-rw-r--r--guile/starlet/midi-control/faders.scm47
3 files changed, 75 insertions, 2 deletions
diff --git a/guile/starlet/base.scm b/guile/starlet/base.scm
index 15b6b72..76d6f61 100644
--- a/guile/starlet/base.scm
+++ b/guile/starlet/base.scm
@@ -24,6 +24,7 @@
merge-states-htp
get-state-hash-table
set-state-hash-table!
+ add-state-to-state!
scanout-fixture
attr-continuous
attr-boolean
@@ -33,6 +34,7 @@
apply-state
at
blackout
+ clear-state!
home-val
intensity?
state-find
@@ -260,6 +262,10 @@
val))
+(define (clear-state! state)
+ (set-state-hash-table! state (make-hash-table)))
+
+
(define (merge-rule-ltp attr a b)
(lambda (time)
(value->number b time)))
@@ -420,6 +426,20 @@
#:unwind? #f))))
+
+(define (current-value fix attr-name)
+ ;; FIXME: Only need to track one fixture through the state stack
+ (let ((combined-state (merge-states-ltp
+ (list
+ (merge-states-htp
+ (reverse ;; Put "home" state last
+ (atomic-box-ref state-list)))
+ programmer-state
+ selection-state)))
+ (attr (find-attr fix attr-name)))
+ (value->number (state-find fix attr combined-state) 0)))
+
+
(define-syntax attr-continuous
(syntax-rules ()
((_ attr-name attr-range attr-home-value)
diff --git a/guile/starlet/midi-control/base.scm b/guile/starlet/midi-control/base.scm
index 21692b5..fece2be 100644
--- a/guile/starlet/midi-control/base.scm
+++ b/guile/starlet/midi-control/base.scm
@@ -10,7 +10,8 @@
send-note-on
send-note-off
register-midi-note-callback!
- register-midi-cc-callback!))
+ register-midi-cc-callback!
+ remove-midi-callback!))
(define cc-arrays (make-atomic-box '()))
@@ -62,6 +63,13 @@
(register-midi-callback! 'cc channel cc-number func))
+(define (remove-midi-callback! callback)
+ (atomic-box-set! callback-list
+ (remove (lambda (a)
+ (eq? callback a))
+ (atomic-box-ref callback-list))))
+
+
(define enqueue-midi-bytes!
(lambda bytes
(unless (eq? (atomic-box-compare-and-swap! send-queue '() bytes)
diff --git a/guile/starlet/midi-control/faders.scm b/guile/starlet/midi-control/faders.scm
index 5abbe8a..8fa7351 100644
--- a/guile/starlet/midi-control/faders.scm
+++ b/guile/starlet/midi-control/faders.scm
@@ -1,7 +1,8 @@
(define-module (starlet midi-control faders)
#:use-module (starlet midi-control base)
#:use-module (starlet base)
- #:export (on-fader))
+ #:export (on-fader
+ sel))
(define* (on-fader cc-number state
@@ -23,3 +24,47 @@
(at fix attr val)))
state))))
+
+
+(define (at-midi-jogwheel fix attr cc-number)
+
+ (define (ccval->offset a)
+ (if (eq? a 127)
+ -1
+ 1))
+
+ (let ((old-val (current-value fix attr))
+ (offset 0))
+ (register-midi-cc-callback!
+ #:cc-number cc-number
+ #:func (lambda (prev-cc-val new-cc-value)
+ (set! offset (+ offset (ccval->offset new-cc-value)))
+ (set-attr! selection-state
+ fix
+ attr
+ (+ old-val offset))))))
+
+
+(define (select-fixtures fixture)
+ (list
+ (at-midi-jogwheel fixture 'intensity 21)
+ (at-midi-jogwheel fixture 'pan 0)
+ (at-midi-jogwheel fixture 'tilt 1)))
+
+
+(define midi-callbacks '())
+
+(define (merge-rule-replace attr a b)
+ b)
+
+
+(define (sel fixture)
+ (when selection-state
+ (add-state-to-state! merge-rule-replace
+ selection-state
+ programmer-state)
+ (clear-state! selection-state)
+ (for-each remove-midi-callback! midi-callbacks))
+ (when fixture
+ (set! midi-callbacks
+ (select-fixtures fixture))))