aboutsummaryrefslogtreecommitdiff
path: root/guile/starlet/midi-control/faders.scm
diff options
context:
space:
mode:
authorThomas White <taw@bitwiz.me.uk>2021-01-02 18:33:15 +0100
committerThomas White <taw@bitwiz.me.uk>2021-01-02 18:33:15 +0100
commite0d13cfbc4878e17e946f62b550abe27aaf01aa8 (patch)
treef7beab2e8e4a84f044f4c00b7d23cdfcb29803d6 /guile/starlet/midi-control/faders.scm
parent43e21c32d57067bce99f1263f161ad6f1330730a (diff)
Implement at-midi-fader
get-cc-value now returns #f if the position of the fader is unknown. Some other changes were needed to accommodate that.
Diffstat (limited to 'guile/starlet/midi-control/faders.scm')
-rw-r--r--guile/starlet/midi-control/faders.scm84
1 files changed, 65 insertions, 19 deletions
diff --git a/guile/starlet/midi-control/faders.scm b/guile/starlet/midi-control/faders.scm
index a53262d..dde2760 100644
--- a/guile/starlet/midi-control/faders.scm
+++ b/guile/starlet/midi-control/faders.scm
@@ -12,17 +12,18 @@
(lighting-state
(state-for-each
(lambda (fix attr val)
- (if (intensity? attr)
+ (if (intensity? attr)
- ;; Intensity parameters get scaled according to the fader
- (at fix attr (lambda (time)
- (* 0.01
- val
- (scale-127-100 (get-cc-value cc-number
- #:channel channel)))))
+ ;; Intensity parameters get scaled according to the fader
+ (at fix attr (lambda (time)
+ (let ((cc-val (get-cc-value cc-number
+ #:channel channel)))
+ (if cc-val
+ (* 0.01 val (ccval->percent cc-val))
+ 0))))
- ;; Non-intensity parameters just get set in our new state
- (at fix attr val)))
+ ;; Non-intensity parameters just get set in our new state
+ (at fix attr val)))
state))))
@@ -50,6 +51,51 @@
(+ old-val offset))))))
+(define (in-range a val1 val2)
+ (or
+ (and (>= a val1)
+ (<= a val2))
+ (and (>= a val2)
+ (<= a val1))))
+
+
+(define* (at-midi-fader fix
+ attr
+ cc-number
+ #:key
+ (led-incongruent #f)
+ (led #f))
+
+ (let* ((congruent-val (percent->ccval (current-value fix attr)))
+
+ (cc-val (get-cc-value cc-number))
+ (congruent (and cc-val
+ (= cc-val congruent-val))))
+
+ (if congruent
+ (send-note-on led)
+ (send-note-on led-incongruent))
+
+ (register-midi-cc-callback!
+ #:cc-number cc-number
+ #:func (lambda (prev-cc-val new-cc-value)
+
+ (when congruent
+ (set-attr! selection-state
+ fix
+ attr
+ (ccval->percent new-cc-value)))
+
+ (when (or (and (not prev-cc-val)
+ (= new-cc-value congruent-val))
+ (and prev-cc-val new-cc-value
+ (in-range congruent-val
+ prev-cc-val
+ new-cc-value)))
+ (set! congruent #t)
+ (send-note-on led))))))
+
+
(define (select-fixtures fixture)
(values
(list 98 124 125 84 85 86 120 121 122)
@@ -59,16 +105,16 @@
(at-midi-jogwheel fixture 'pan 0
#:led 124)
(at-midi-jogwheel fixture 'tilt 1
- #:led 125))))
-;; (at-midi-fader fixture 'red 4
-;; #:led-incongruent 84
-;; #:led-congruent 120)
-;; (at-midi-fader fixture 'green 5
-;; #:led-incongruent 85
-;; #:led-congruent 121)
-;; (at-midi-fader fixture 'blue 6
-;; #:led-incongruent 86
-;; #:led-congruent 122))))
+ #:led 125)
+ (at-midi-fader fixture 'r 4
+ #:led 120
+ #:led-incongruent 84)
+ (at-midi-fader fixture 'g 5
+ #:led 121
+ #:led-incongruent 85)
+ (at-midi-fader fixture 'b 6
+ #:led 122
+ #:led-incongruent 86))))
;; Stuff to clear up when we're done with selected fixtures