;;; 
;;; 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)))