aboutsummaryrefslogtreecommitdiff
path: root/guile/starlet/midi-control/faders.scm
blob: a53262db2732a23c600c94a99fd1923cb65ea1ef (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
(define-module (starlet midi-control faders)
  #:use-module (starlet midi-control base)
  #:use-module (starlet base)
  #:use-module (ice-9 receive)
  #:export (on-fader
            sel))


(define* (on-fader cc-number state
                   #:key (channel #f))
  (register-state!
   (lighting-state
    (state-for-each
     (lambda (fix attr val)
       (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)))))

           ;; Non-intensity parameters just get set in our new state
           (at fix attr val)))

     state))))


(define* (at-midi-jogwheel fix attr cc-number
                           #:key (led #f))

  (define (ccval->offset a)
    (if (eq? a 127)
        -1
        1))

  (when led
    (send-note-on led))

  (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)
  (values
   (list 98 124 125 84 85 86 120 121 122)
   (list
    (at-midi-jogwheel fixture 'intensity 21
                      #:led 98)
    (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))))


;; Stuff to clear up when we're done with selected fixtures
(define midi-callbacks '())
(define midi-leds '())


(define (sel fixture)

  (define (merge-rule-replace attr a b) b)

  (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)
    (for-each send-note-off midi-leds)
    (set! midi-callbacks '())
    (set! midi-leds '()))

  (when fixture
    (receive (leds callbacks)
      (select-fixtures fixture)
      (set! midi-callbacks callbacks)
      (set! midi-leds leds))))