aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorThomas White <taw@physics.org>2021-04-04 12:00:48 +0200
committerThomas White <taw@physics.org>2021-04-04 12:11:03 +0200
commit6d54086fc0814e55dfb80ebe36c16e53bed3401a (patch)
tree60d63535252ceda769345463dfcb7dd433be5221
parentb9b9e2c51c2dae1343eefa49f0566b6636bfe4d4 (diff)
Add the ability to make certain states unique
This allows easy re-assignment of faders with state-on-fader
-rw-r--r--guile/starlet/base.scm42
-rw-r--r--guile/starlet/midi-control/faders.scm18
2 files changed, 53 insertions, 7 deletions
diff --git a/guile/starlet/base.scm b/guile/starlet/base.scm
index 407e3d9..ea7850c 100644
--- a/guile/starlet/base.scm
+++ b/guile/starlet/base.scm
@@ -125,8 +125,13 @@
;; of (fixture . attribute) --> value
(define-class <starlet-state> (<object>)
(hash-table
- #:init-form (make-hash-table)
- #:getter get-state-hash-table))
+ #:init-form (make-hash-table)
+ #:getter get-state-hash-table)
+ (name
+ #:init-value #f
+ #:init-keyword #:name
+ #:getter get-state-name
+ #:setter set-state-name!))
(define-method (set-in-state! (state <starlet-state>)
@@ -202,10 +207,35 @@
(get-attr-type aobj)))
-(define (register-state! new-state)
- (atomic-box-set! state-list
- (append (atomic-box-ref state-list)
- (list new-state))))
+(define (append-or-replace-named-state orig-list name new-state)
+ (let ((new-list (map (lambda (st)
+ (if (eq? (get-state-name st) name)
+ (begin
+ new-state)
+ st))
+ orig-list)))
+
+ ;; If there is no state with this name in the list,
+ ;; the replacement above will have no effect.
+ ;; Check again and add in the normal way if so.
+ (if (find (lambda (st) (eq? (get-state-name st)
+ name))
+ new-list)
+ new-list
+ (append orig-list (list new-state)))))
+
+
+(define* (register-state! new-state
+ #:key (unique-name #f))
+ (if unique-name
+ (begin (set-state-name! new-state unique-name)
+ (atomic-box-set! state-list
+ (append-or-replace-named-state (atomic-box-ref state-list)
+ unique-name
+ new-state)))
+ (atomic-box-set! state-list
+ (append (atomic-box-ref state-list)
+ (list new-state)))))
;; Patch a new fixture
(define* (patch-real name
diff --git a/guile/starlet/midi-control/faders.scm b/guile/starlet/midi-control/faders.scm
index 606bd72..34d9ddb 100644
--- a/guile/starlet/midi-control/faders.scm
+++ b/guile/starlet/midi-control/faders.scm
@@ -8,6 +8,21 @@
#:export (state-on-fader))
+(define (channel-number->string channel)
+ (if channel
+ (number->string channel)
+ "default"))
+
+
+(define (name-for-fader-state channel cc-number)
+ (string->symbol
+ (string-append
+ "faderstate-ch"
+ (channel-number->string channel)
+ "-cc"
+ (number->string cc-number))))
+
+
(define* (state-on-fader cc-number
state
#:key (channel #f))
@@ -37,7 +52,8 @@
;; Fader position unknown
'no-value)))))
- state))))
+ state))
+ #:unique-name (name-for-fader-state channel cc-number)))
(define (current-values fixture-list attr-name)