;;;
;;; c:\\program files\\acl62\\music21.cl
;;;


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

(defun make-a-phrase-1-2 (l)
  (let ((num (length l)))
   (case num
    (2 (do ((lst l (cddr lst))
        (w))
        ((null lst) w)
         (setf w (cut-list-at-length
                             (1+ (random 6))
               (squash 
                                (generate-a-phrase-at-random 
                                    (list (first lst) 
                                          (second lst))
           ))))))
    (4 (do ((lst l (cddr lst))
        (w))
        ((null lst) w)
        (setf w 
                      (append w 
                (cut-list-at-length
                 (1+ (random 3))
                 (squash
                                   (generate-a-phrase-at-random
                                       (list (first lst)
                                             (second lst))
           )))))))
    (6 (do ((lst l (cddr lst))
        (w))
       ((null lst) w)
        (setf w 
                   (append w 
              (cut-list-at-length 
                 (1+ (random 2))
                (squash
                                  (generate-a-phrase-at-random 
                                      (list (first lst) 
                                           (second lst))
           ))))))))))

(defun make-a-phrase-2-2 (l) 
  (let ((num (length l))) 
   (case num 
        (2 (do ((lst l (cddr lst)) 
          (w)) 
          ((null lst) w)
           (setf w 
                        (cut-list-at-length
                               (1+ (random 6)) 
                (squash
                                  (generate-a-phrase-at-random-2
                                     (list (car lst) (cadr lst))
            ))))))
      (4 (do ((lst l (cddr lst))
          (w))
          ((null lst) w)
           (setf w
                       (append w 
              (cut-list-at-length
                (1+ (random 3))
                (squash
                                   (generate-a-phrase-at-random-2
                                             (list (car lst)
                                                   (cadr lst))
               ))))))) 
      (6 (do ((lst l (cddr lst)) 
          (w)) 
          ((null lst) w)
           (setf w 
                       (append w 
              (cut-list-at-length
                (1+ (random 2))
                (squash
                                  (generate-a-phrase-at-random-2
                                            (list (car lst)
                                                  (cadr lst))
               ))))))))))

(defun make-a-phrase-for-waltz (l) 
  (let* ((l1 (make-a-phrase-1-2 l)) 
      (l2 (make-a-phrase-2-2 l)) 
      (n1 (length l1)) 
      (n2 (length l2)) 
      (r1 (get-rythm-of-3beat n1)) 
      (r2 (get-rythm-of-3beat n2)))
    (list (list l1 r1) (list l2 r2)))) 

(defun make-phrases-for-waltz (l) 
   (do ((lst l (cdr lst))) 
      ((null lst)) 
    (format t "~%*** ~a ***" (car lst))
    (format t "~%~a" (make-a-phrase-for-waltz (car lst)))))

;;; 
;;; (make-waltz *w3*) 
;;; 
(defun make-waltz (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-for-waltz l2)))