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


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

(defun generate-8-elements-at-random (pair) 
  (do ((i 8 (1- i)) 
     (w)) 
    ((<= i 0) (reverse w)) 
   (push (generate-a-note-at-random pair) w))) 

(defun make-a-phrase-for-waltz-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))
       (generate-8-elements-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))
         (generate-8-elements-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))
        (generate-8-elements-at-random
                  (list (first lst)
                        (second lst)))))))))))

(defun make-a-phrase-for-ballad-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 8))
       (generate-8-elements-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 4))
        (generate-8-elements-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 3)) 
        (generate-8-elements-at-random
                  (list (first lst)
                        (second lst)))))))))))

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

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

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