<?xml version="1.0"?>
<Denemo>
  <merge>
    <title>A Denemo Keymap</title>
    <author>AT, JRR, RTS</author>
    <map>
      <row>
        <action>CountSteps</action>
        <scheme>;;;;;;;;;;;;;;;
;;CountSteps
;; tests note name recognition.
(let (
      (shiftup 0)
      (shiftdown 0)
      (runtest 0) 
      (PlaceAnswerStatus 0)
      (notewas #t)
      (userinput 0)
      (score 0)
      (steps 0)
      (starttime 0)
      (endtime 0)
      (direction 0)
      (span 8) ;; how many steps of the scale to test. perhaps have many cummulative levels 
      (num-goes 10) ;; how many notes to present for the whole test
      )
  ;; set the random seed up using time of day
  (let ((time (gettimeofday)))
    (set! *random-state*
	  (seed-&gt;random-state (+ (car time)
				 (cdr time)))))
  (set! shiftup
	(lambda (n)
	  (if (&gt; n 0) (begin
			(d-CursorUp)
			(shiftup (- n 1))))))

  (set! shiftdown
	(lambda (n)
	  (if (&gt; n 0) (begin
			(d-CursorDown)
			(shiftdown (- n 1))))))
  (set! PlaceAnswerStatus
  	(lambda (name gfx)
	  (begin
	    (d-DirectivePut-note-minpixels name 30)
	    (d-DirectivePut-note-gx name -15)
	    (d-DirectivePut-note-gy name 10)
	    (d-DirectivePut-note-graphic name gfx))))
 

;;;;;;;; the main function to run the test
  (set! runtest 
	(lambda (n)
	  (if (&gt; n 0) (begin
			(set! steps (+ 1 (random span)))
			
			;;(d-InsertLilyDirective "directive=%Your score so far: ")
			(d-DirectivePut-score-display "CountSteps" (string-append (string-append  "Score: " (object-&gt;string score)) ". Count the steps in this interval"))
			
			(if (= direction 0)
			    (begin
			      (shiftdown steps)
			      (set! direction 1)
			     (d-Insert2))
                            (begin
			     (shiftup steps)
			     (set! direction 0)
			     (d-Insert2)))

			(set! userinput (d-GetChar))
			(set! userinput (string-&gt;number userinput))
  			(if (not (integer? userinput))
  			(set! userinput 1))

			(if (number? userinput)
			    (begin
			      ;;(d-DeletePreviousObject)
			      (if  (= steps userinput)
				   (begin
				     (set! score (+ score 1))
 				     (PlaceAnswerStatus "NoteCorrect" "CheckMark") 
				     (d-ChangeNotehead "Diamond"))
				   (begin
				     (set! score (- score 1))
				     (PlaceAnswerStatus "NoteWrong" "CrossSign")
				     (d-ChangeNotehead "Cross"))) 		 
			      (runtest (- n 1))))))))

  (d-PlayMidiKey #xF03001)
  (d-PlayMidiKey #xF02A01)
  (d-PlayMidiKey #xF04001)
  (set! num-goes (d-GetUserInput "Reading Test - Instructions" "For each interval, hit the number of steps in that interval.\nHow many goes do you want?" "8"))
  (set! span (d-GetUserInput "Reading Test - Level" "What level are you on? (What is the largest inteval you can count?)" "8"))
  (set! starttime (car (gettimeofday)))
  (d-NewWindow)
  (set! num-goes (string-&gt;number num-goes))
  (if (not (integer? num-goes))
  (set! num-goes 10))
  
  (set! span (string-&gt;number span))
  (if (not (integer? span))
  (set! span 8))

  (shiftup 6)
  (d-Insert2)
  (runtest num-goes)
  (d-DirectivePut-score-display  "ReadingNoteNames"  (string-append  "Final Score: " (object-&gt;string score)))
  (set! endtime (car (gettimeofday))) 
  (display (- endtime starttime))
  (d-RefreshDisplay)
  (d-PlayMidiKey #xF03001)
  (d-PlayMidiKey #xF02A01)
  (d-PlayMidiKey #xF04001)
  )
;;;;;;;;;;;;;;;;;;;;;;;;;;

</scheme>
        <label>Step Counting</label>
        <tooltip>%tests your ability to count the steps between notes</tooltip>
      </row>
    </map>
  </merge>
</Denemo>
