<?xml version="1.0"?>
<Denemo>
  <merge>
    <title>A Denemo Keymap</title>
    <author>AT, JRR, RTS</author>
    <map>
      <row>
        <after>AngryDelete</after>
        <action>FootPedalConductor</action>
        <scheme>;;;;;;;;;;FootPedalConductor
(define (FootPedalConductor::display text)
  (if (positive? (d-DirectiveGet-standalone-gy "Conductor"))
  (begin
    (d-DirectivePut-standalone-graphic "Conductor" (string-append "\n" text "\nDenemo\n620"))
    (d-RefreshDisplay))))
  
(let ((start #f) (number #f) (numerator (string-&gt;number (car (string-split (d-InsertTimeSig "query=timesigname") #\/)))))
(define (pedalDown? midi)
    (and (= #xB0 (bit-extract midi 0 8))  (= (bit-extract midi 8 16) #x40) (=  (bit-extract midi 16 24) #x7F)))
(define (pedalUp? midi)
    (and (= #xB0 (bit-extract midi 0 8))  (= (bit-extract midi 8 16) #x40) (=  (bit-extract midi 16 24) #x0)))
(define (thetime) (/ (get-internal-real-time) internal-time-units-per-second)) ;;; time in seconds
(d-SetBackground #xB0B0E0)
(d-DirectivePut-standalone-gy "Conductor" 480)
(d-MoveCursorLeft)
(let loop ((number -1))
 (FootPedalConductor::display (string-append (number-&gt;string number) " &#x2B07;"))
 (let ((midi (d-GetMidi)))  
 (disp midi)
    (if (pedalDown? midi)
	(begin
	 (if start
	    (let* ((now (thetime)) (interval (- now start)))
	      (if (&gt; interval (/ 1 2))
		(begin
		  (set! start now)
		    (if (&gt; number -1)
		      (let ( (at #f) (text (string-append (number-&gt;string (+ 1 number)) " " "&#x2B06;")))
		      (cond ((or (= numerator 2) (= numerator 6))
			      (set! text (string-append (number-&gt;string (+ 1 number)) " " "&#x2B06;"))
			      (set! at (round (* interval 500)))
			      (d-OneShotTimer at (string-append "(FootPedalConductor::display \"" text "\")")))
			    ((or (= numerator 3) (= numerator 9))
				(set! text (string-append (number-&gt;string (+ 1 number)) " " " &#x27A8;"))
				(set! at (round (* interval 333)))
				(d-OneShotTimer at (string-append "(FootPedalConductor::display \"" text "\")"))
				(set! text (string-append (number-&gt;string (+ 1 number)) " " " &#x21D6;"))
				(set! at (round (* interval 666)))
				(d-OneShotTimer at (string-append "(FootPedalConductor::display \"" text "\")")))

			    ((or (= numerator 4) (= numerator 12))
			      (set! text (string-append (number-&gt;string (+ 1 number)) " " "&#x21A9;"))
			      (set! at (round (* interval 250)))
			      (d-OneShotTimer at (string-append "(FootPedalConductor::display \"" text "\")"))
			      (set! text (string-append (number-&gt;string (+ 1 number)) " " " &#x27A8;"))
			      (set! at (round (* interval 500)))
			      (d-OneShotTimer at (string-append "(FootPedalConductor::display \"" text "\")"))
			      (set! text (string-append (number-&gt;string (+ 1 number)) " " "&#x21D6;"))
			      (set! at (round (* interval 750)))
			      (d-OneShotTimer at (string-append "(FootPedalConductor::display \"" text "\")"))
			      ))))
		  (loop (+ 1 number)))
		  (disp "finished")))
	    (begin ;;; not started yet
	    	(set! start (thetime))
	    	(loop (+ 1 number)))))
	  (begin
	    (if (pedalUp? midi)
	    (loop number)))))))
(d-SetBackground #xFFFFFF)
(d-DirectiveDelete-standalone "Conductor")
</scheme>
        <label>Foot Pedal Conductor</label>
        <tooltip>Press the foot pedal at the start of each measure. The bar number is displayed and the beats are interpolated following the timesignature set. Two quick presses of the foot pedal stops the conductor.</tooltip>
      </row>
    </map>
  </merge>
</Denemo>
