From 757c3424af0156286725f83c3d1acdcd3654fb5c Mon Sep 17 00:00:00 2001 From: Thomas White Date: Sat, 22 May 2021 20:14:50 +0200 Subject: Indicate playback paused via LEDs --- guile/starlet/midi-control/button-utils.scm | 55 +++++++++++++++++++++-------- guile/starlet/playback.scm | 22 ++++++++---- 2 files changed, 56 insertions(+), 21 deletions(-) diff --git a/guile/starlet/midi-control/button-utils.scm b/guile/starlet/midi-control/button-utils.scm index 859412d..8dcfbf2 100644 --- a/guile/starlet/midi-control/button-utils.scm +++ b/guile/starlet/midi-control/button-utils.scm @@ -29,27 +29,52 @@ (define* (make-go-button pb button - #:key (channel #f)) - (register-midi-note-callback! - #:channel channel - #:note-number button - #:func (lambda () (go! pb)))) + #:key + (channel #f) + (ready-note #f) + (pause-note #f)) + (register-midi-note-callback! + #:channel channel + #:note-number button + #:func (lambda () (go! pb))) + + (when (or ready-note pause-note) + (add-hook! + (state-change-hook pb) + (lambda (new-state) + (cond + ((eq? new-state 'pause) + (send-note-on pause-note)) + ((eq? new-state 'ready) + (send-note-on ready-note)) + (else + (send-note-off ready-note))))))) (define* (make-stop-button pb button - #:key (channel #f)) - (register-midi-note-callback! - #:channel channel - #:note-number button - #:func (lambda () (stop! pb)))) + #:key + (channel #f) + (ready-note #f)) + (register-midi-note-callback! + #:channel channel + #:note-number button + #:func (lambda () (stop! pb))) + + (when ready-note + (send-note-on ready-note))) (define* (make-back-button pb button - #:key (channel #f)) - (register-midi-note-callback! - #:channel channel - #:note-number button - #:func (lambda () (back! pb)))) + #:key + (channel #f) + (ready-note #f)) + (register-midi-note-callback! + #:channel channel + #:note-number button + #:func (lambda () (back! pb))) + + (when ready-note + (send-note-on ready-note))) (define* (select-on-button button fixture diff --git a/guile/starlet/playback.scm b/guile/starlet/playback.scm index 8409931..96e52c3 100644 --- a/guile/starlet/playback.scm +++ b/guile/starlet/playback.scm @@ -43,7 +43,8 @@ back! cue-list set-playback-cue-list! - print-playback)) + print-playback + state-change-hook)) ;; A "playback" is a state which knows how to run cues @@ -62,7 +63,11 @@ (running-cue-clock #:init-value #f #:getter get-cue-clock - #:setter set-cue-clock!)) + #:setter set-cue-clock!) + + (state-change-hook + #:init-form (make-hook 1) + #:getter state-change-hook)) (define-record-type @@ -141,6 +146,7 @@ (clear-state! pb) (set-next-cue-index! pb (+ cue-index 1)) (set-cue-clock! pb #f) + (run-hook (state-change-hook pb) 'ready) (let ((cue-state (calculate-tracking cue-list cue-index))) (state-for-each (lambda (fix attr val) @@ -188,7 +194,8 @@ (clock-stopped? clock)) ;; Restart paused cue - (start-clock! clock) + (begin (start-clock! clock) + (run-hook (state-change-hook pb) 'ready)) ;; Run next cue (let ((next-cue-index (get-next-cue-index pb))) @@ -204,13 +211,15 @@ (let ((clock (get-cue-clock pb))) (when (and clock (not (clock-expired? clock))) - (stop-clock! (get-cue-clock pb))))) + (stop-clock! (get-cue-clock pb)) + (run-hook (state-change-hook pb) 'pause)))) (define (back! pb) (let ((prev-cue-index (- (get-next-cue-index pb) 2))) (if (>= prev-cue-index 0) - (cut-to-cue-index! pb prev-cue-index) + (begin (cut-to-cue-index! pb prev-cue-index) + (run-hook (state-change-hook pb) 'ready)) 'already-at-cue-zero))) @@ -556,7 +565,8 @@ (fix-attrs-involved pb this-cue-state))) (atomically-overlay-state! pb overlay-state) - (set-cue-clock! pb cue-clock))) + (set-cue-clock! pb cue-clock) + (run-hook (state-change-hook pb) 'ready))) (define (print-playback pb) -- cgit v1.2.3