;;;
;;; C:\\program files\\acl62\\music20.cl
;;;


(load "c:\\program files\\acl62\\music19.cl") 

(defun sharp-till-chord-tone-2 (note pair) 
  (do ((nt note (sharp-a-note nt)) 
     (w)) 
    ((member-of-chord-tone-2 nt pair)
         (push nt w) (reverse w))
   (push nt w))) 

(defun flat-till-chord-tone-2 (note pair) 
  (do ((nt note (flat-a-note nt)) 
     (w)) 
    ((member-of-chord-tone-2 nt pair)
         (push nt w) (reverse w))
   (push nt w))) 

(defun generate-a-phrase-aux-2 (pair) 
  (do ((i 8 (1- i)) 
     (w)) 
    ((<= i 0) (reverse w))
   (let ((nt (generate-a-note-at-random pair)))
    (cond ((member-of-guide-tone-2 nt pair)
        (push nt w)) 
       ((member-of-tension-note-2 nt pair)
        (push 
         (case (random 4) 
          (0 (flat-till-chord-tone nt pair))
          (1 (sharp-till-chord-tone nt pair))
          (2 (flat-till-chord-tone-2 nt pair))
          (3 (sharp-till-chord-tone-2 nt pair)))
                  w))
       (t 
       (push 
         (case (random 4) 
          (0 (flat-till-chord-tone nt pair))
          (1 (sharp-till-chord-tone nt pair))
          (2 (flat-till-chord-tone-2 nt pair))
          (3 (sharp-till-chord-tone-2 nt pair)))
                 w))))))

(defun generate-a-phrase-of-n-notes-2 (pair n) 
  (cut-list-at-length n (generate-a-phrase-aux-2 pair)))

(defun generate-a-phrase-at-random-2 (pair)
  (generate-a-phrase-of-n-notes-2 pair (1+ (random 6))))

(defun make-a-phrase-2 (l)
  (do ((lst l (cddr lst)))
    ((null lst))
   (format t "~%*********** On ~a ************" l) 
   (format t "~%*********** On ~a ************" 
                (list (first lst) (second lst))) 
   (format t "~%Chord Scale: ~a" 
                (chord-scale (list (first lst)
                                   (second lst))))
    (format t "~%~a"
                (generate-a-phrase-at-random-2
                    (list (first lst) (second lst))))
    (format t "~%~a"
                (generate-a-phrase-at-random-2
                    (list (first lst) (second lst))))
   (format t "~%~a"
                (generate-a-phrase-at-random-2
                    (list (first lst) (second lst))))
   (format t "~%~a"
                (generate-a-phrase-at-random-2
                    (list (first lst) (second lst))))
    (format t "~%~a"
                (generate-a-phrase-at-random-2
                    (list (first lst) (second lst))))))

(defun make-phrases-2 (l)
  (do ((lst l (cdr lst)))
    ((null lst))
   (make-a-phrase-2 (car lst))))

;;; 
;;; (auto-comp3 *w3*) etc. 
;;; 
(defun auto-comp3 (wn) 
  (tagbody 
    (my-randomize)
    (format t "~%********** ~a ************"
                  (second (first wn)))
    (format t "~%The original key is ~a."
                  (first (first wn)))
    (format t "~%Enter a key.")
    loop1
    (setf l1 (read-sentence))
    (if (not (key-p (car l1))) (go loop1))
    (if (equal (car l1) (first (first wn)))
      (setf l2 (cdr wn))
      (setf l2 (modulate-key1-to-key2
                          (cdr wn)
                          (first (first wn))
                          (car l1))))
    (format t "~%**** The key is ~a. ***"
                  (car l1))
    (make-phrases-2 l2)))