;;; -*- Mode:LISP; Package: COMPOSER; Readtable:CL; Base:10 -*-
;;;
;;; Primitives for drawing musical stuff on windows
;;;
;;;

(defconst *standard-staff-space-width* 8)

(defun staff-height (line-width)
  (+ (* 4 *standard-staff-space-width*) (* 5 line-width)))

(defun staff-interspacing-size (line-width)
  (staff-height line-width)))

(defun draw-staff (window x-pos y-pos n-staves measure-width n-measures line-width
		   &aux
		   (inside-height (send window :inside-height))
		   (inside-width (send window :inside-width))
		   (interspacing-size (staff-interspacing-size line-width))
		   (staff-height (staff-height line-width))
		   (total-width (* measure-width n-measures)))
  (send window :refresh)
  (when (or (> (+ x-pos (* n-measures measure-width) n-measures) inside-width)
	    (> (+ y-pos (* n-staves staff-height) interspacing-size)
	       inside-height))
    (ferror nil "Staff wont fit inside window"))
  (do ((staff 1 (add1 staff))
       (y y-pos (+ y staff-height interspacing-size)))
      ((> staff n-staves))
    (draw-individual-staff window x-pos y measure-width n-measures line-width))
  (send window :draw-line x-pos y-pos
	x-pos
	(+ y-pos (* n-staves staff-height) (* (sub1 n-staves) interspacing-size)))
  (send window :draw-line (+ x-pos total-width) y-pos
	(+ x-pos total-width)
	(+ y-pos (* n-staves staff-height) (* (sub1 n-staves) interspacing-size))))
		  
(defun draw-individual-staff (window x-pos y-pos measure-width n-measures line-width)
  (do ((count 1 (add1 count))
       (y y-pos (+ y *standard-staff-space-width* line-width)))
      ((> count 5))
    (do ((count 1 (add1 count))
	 (line-length (* measure-width n-measures)))
	((> count line-width))
      (send window :draw-line x-pos (+ y count) (+ x-pos line-length) (+ y count) tv:alu-ior)))
  (do ((count 1 (add1 count))
       (vx (+ x-pos measure-width) (+ vx measure-width)))
      ((= count n-measures))
    (do ((count 1 (add1 count))
	 (line-length (staff-height line-width)))
	((> count line-width))
      (send window :draw-line vx y-pos vx (+ y-pos line-length)))))

; (draw-staff tv:selected-window 0 0 10 100 10 1)
