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


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

(defun interpret-a-work (wn) 
  (tagbody 
    (my-randomize) 
    (format t "~%***** ~a *****" 
                   (second (first wn))) 
    (format t "~%The original key is ~a." 
                   (first (first wn)))
    (format t "~%Entey 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)) 
    (interpret-pairs l2))) 

(defun key-p (c) 
  (if (member c '(C +C -D D
                    +D -E E F
                    +F -G G +G
                    -A A +A -B B 
            c +c -d d
                    +d -e e f
                    +f -g g +g
                    -a a +a -b b)) 
    t 
      nil))

;;; 
;;; 
;;; 
(defun select-UST-at-random (pair) 
  (let* ((l1 (assoc (second pair) 
                      (UST pair)))
       (l2 (rest (second l1))))
    (nth (random (length l2)) l2))) 

(defun make-a-phrase-with-UST-at-random (pair) 
  (get-notes-from-UST-at-random 
         (select-UST-at-random pair)))

;;; 
;;; 
;;; 
(defun get-a-phrase-at-random-aux (pair)
  (case (random 4)
    (0 (get-elements-of-melody-at-random 
                   pair)) 
    (1 (make-a-phrase-with-UST-at-random 
                   pair))
    (2 (make-a-phrase-with-scale-from-tension
                   pair))
    (3 (make-a-phrase-with-scale-from-elm 
                   pair)))) 

(defun get-a-phrase-at-random-2-aux (pair) 
  (case (random 4) 
    (0 (get-elements-of-melody-at-random-2 
                   pair))
    (1 (get-notes-from-UST-at-random-2 
                   pair))
    (2 (make-a-phrase-with-scale-from-tension-2 
                   pair))
    (3 (make-a-phrase-with-scale-from-elm-2
                   pair))))

(defun get-a-phrase-for-ballad-aux (pair) 
  (let ((lst (get-a-phrase-at-random-aux 
                   pair)))
    (cut-list-at-length 
             (nth (random 4) '(1 2 3 4)) lst)))

(defun get-a-phrase-for-waltz-aux (pair)
  (let ((lst (get-a-phrase-at-random-aux pair)))
    (cut-list-at-length 
             (nth (random 6) '(1 2 3 4 5 6)) lst))) 

;;; 
;;; 
;;; 
(defun make-a-phrase-with-scale-from-tension-2 (pair) 
  (do ((i 8 (1- i)) 
     (w (rotate-a-scale-from-tension-and-cut
                   pair))) 
    ((or (= i 0) (> (length w) 8)) 
     (cut-list-at-length 
               (nth (random 3) '(4 6 8)) w)) 
   (setf w 
            (append w 
          (rotate-a-scale-from-a-note-and-cut
            (get-a-note-around-a-note-in-a-scale 
                            (car (last w))
                             pair) pair)
                    )))) 

(defun make-a-phrase-with-scale-from-elm-2 (pair) 
  (do ((i 8 (1- i)) 
     (w (rotate-a-scale-from-elm-and-cut
                    pair))) 
     ((or (= i 0) (> (length w) 8))
      (cut-list-at-length 
                 (nth (random 3) '(4 6 8)) w)) 
   (setf w (append w 
           (rotate-a-scale-from-a-note-and-cut
             (get-a-note-around-a-note-in-a-scale
                              (car (last w)) 
                              pair) pair)
              )))) 

(defun get-elements-of-melody-at-random-2 (pair) 
  (get-n-elements-of-melody 
            pair 
            (nth (random 3) '(4 6 8)))) 

(defun get-notes-from-UST-at-random-2 (pair) 
  (get-n-notes-from-UST 
            (select-UST-at-random pair) 
            (nth (random 3) '(4 6 8)))) 

;;; 
;;; 
;;; 
(defun append-two-phrases-1 (n1 n2 pair) 
  (append (list (list (first pair) (second pair)) 
         (cut-list-at-length
                       n1
                       (get-a-phrase-at-random-2-aux
              (list (first pair) (second pair)))))
      (list (list (third pair) (fourth pair))
         (cut-list-at-length
                       n2
                      (get-a-phrase-at-random-2-aux
             (list (third pair) (fourth pair)))))))

(defun append-three-phrases-1 (n1 n2 n3 pair)
  (append (list (list (first pair) (second pair))
         (cut-list-at-length
                       n1
                       (get-a-phrase-at-random-2-aux
              (list (first pair) (second pair)))))
      (list (list (third pair) (fourth pair))
         (cut-list-at-length
                       n2
                       (get-a-phrase-at-random-2-aux
              (list (third pair) (fourth pair)))))
      (list (list (fifth pair) (sixth pair))
         (cut-list-at-length
                       n3
                       (get-a-phrase-at-random-2-aux
               (list (fifth pair) (sixth pair)))))))

(defun append-four-phrases-1 (n1 n2 n3 n4 pair)
  (append (list (list (first pair) (second pair))
         (cut-list-at-length
                       n1 
                       (get-a-phrase-at-random-2-aux
             (list (first pair) (second pair)))))
      (list (list (third pair) (fourth pair))
         (cut-list-at-length
                       n2 
                       (get-a-phrase-at-random-2-aux
              (list (third pair) (fourth pair)))))
       (list (list (fifth pair) (sixth pair))
         (cut-list-at-length
                       n3
                       (get-a-phrase-at-random-2-aux
             (list (fifth pair) (sixth pair)))))
      (list (list (seventh pair) (eighth pair))
         (cut-list-at-length
                       n4
                       (get-a-phrase-at-random-2-aux 
             (list (seventh pair) (eighth pair))
            )))))

(defun get-a-phrase-at-random (pair) 
  (case (length pair) 
    (2 (list pair (get-a-phrase-at-random-aux pair))) 
    (4 (case (nth (random 14) '(1 2 3 4 5 6 7 
                                   8 9 10 11 12 13 14))
        (1 (append-two-phrases-1 1 1 pair)) 
        (2 (append-two-phrases-1 1 2 pair)) 
        (3 (append-two-phrases-1 2 1 pair)) 
        (4 (append-two-phrases-1 2 2 pair)) 
        (5 (append-two-phrases-1 2 3 pair)) 
        (6 (append-two-phrases-1 3 2 pair)) 
        (7 (append-two-phrases-1 3 3 pair)) 
        (8 (append-two-phrases-1 4 3 pair)) 
        (9 (append-two-phrases-1 3 4 pair)) 
        (10 (append-two-phrases-1 4 4 pair)) 
        (11 (append-two-phrases-1 1 1 pair)) 
        (12 (append-two-phrases-1 2 2 pair)) 
        (13 (append-two-phrases-1 3 3 pair)) 
        (14 (append-two-phrases-1 4 4 pair)))) 
    (6 (case (nth (random 18) '(1 2 3 4 5 6 7 
                                    8 9 10 11 12 13 
                                    14 15 16 17 18)) 
        (1 (append-three-phrases-1 1 1 1 pair)) 
        (2 (append-three-phrases-1 2 1 1 pair)) 
        (3 (append-three-phrases-1 1 2 1 pair)) 
        (4 (append-three-phrases-1 1 1 2 pair)) 
        (5 (append-three-phrases-1 2 2 1 pair)) 
        (6 (append-three-phrases-1 2 1 2 pair)) 
        (7 (append-three-phrases-1 1 2 2 pair)) 
        (8 (append-three-phrases-1 2 2 2 pair)) 
        (9 (append-three-phrases-1 2 2 3 pair)) 
        (10 (append-three-phrases-1 2 3 2 pair)) 
        (11 (append-three-phrases-1 3 2 2 pair)) 
        (12 (append-three-phrases-1 2 3 3 pair)) 
        (13 (append-three-phrases-1 3 2 3 pair)) 
        (14 (append-three-phrases-1 3 3 2 pair)) 
        (15 (append-three-phrases-1 1 1 1 pair)) 
        (16 (append-three-phrases-1 1 1 1 pair)) 
        (17 (append-three-phrases-1 2 2 2 pair)) 
        (18 (append-three-phrases-1 2 2 2 pair)))) 
    (8 (case (nth (random 30) '(1 2 3 4 5 6 7 8 
                                    9 10 11 12 13 14 
                                    15 16 17 18 19 20
                  21 22 23 24 25 26 
                                    27 28 29 30)) 
        (1 (append-four-phrases-1 1 1 1 1 pair)) 
        (2 (append-four-phrases-1 2 1 1 1 pair)) 
        (3 (append-four-phrases-1 1 2 1 1 pair)) 
        (4 (append-four-phrases-1 1 1 2 1 pair)) 
        (5 (append-four-phrases-1 1 1 1 2 pair)) 
        (6 (append-four-phrases-1 2 2 1 1 pair)) 
        (7 (append-four-phrases-1 2 1 2 1 pair)) 
        (8 (append-four-phrases-1 2 1 1 2 pair)) 
        (9 (append-four-phrases-1 1 2 2 1 pair)) 
        (10 (append-four-phrases-1 1 2 1 2 pair))
        (11 (append-four-phrases-1 1 1 2 2 pair)) 
        (12 (append-four-phrases-1 2 2 2 1 pair)) 
        (13 (append-four-phrases-1 2 2 1 2 pair)) 
        (14 (append-four-phrases-1 2 1 2 2 pair)) 
        (15 (append-four-phrases-1 1 2 2 2 pair)) 
        (16 (append-four-phrases-1 2 2 2 2 pair)) 
        (17 (append-four-phrases-1 1 1 1 1 pair)) 
        (18 (append-four-phrases-1 1 1 1 1 pair)) 
        (19 (append-four-phrases-1 1 1 1 1 pair)) 
        (20 (append-four-phrases-1 1 1 1 1 pair)) 
        (21 (append-four-phrases-1 1 1 1 1 pair)) 
        (22 (append-four-phrases-1 2 1 1 1 pair)) 
        (23 (append-four-phrases-1 1 2 1 1 pair)) 
        (24 (append-four-phrases-1 2 2 2 1 pair)) 
        (25 (append-four-phrases-1 2 2 1 2 pair)) 
        (26 (append-four-phrases-1 2 2 2 2 pair)) 
        (27 (append-four-phrases-1 2 2 2 2 pair)) 
        (28 (append-four-phrases-1 2 2 2 2 pair)) 
        (29 (append-four-phrases-1 2 2 2 2 pair)) 
        (30 (append-four-phrases-1 2 2 2 2 pair))))))

(defun get-a-phrase-at-random-2 (pair)
  (case (length pair) 
    (2 (list pair (get-a-phrase-at-random-2-aux pair)))
    (4 (case (nth (random 3) '(1 2 3)) 
       (1 (append-two-phrases-1 2 2 pair)) 
       (2 (append-two-phrases-1 3 3 pair)) 
       (3 (append-two-phrases-1 4 4 pair)))) 
    (6 (case (nth (random 9) '(1 2 3 4 5 6 7 8 9)) 
       (1 (append-three-phrases-1 2 1 1 pair)) 
       (2 (append-three-phrases-1 1 2 1 pair)) 
       (3 (append-three-phrases-1 1 1 2 pair)) 
       (4 (append-three-phrases-1 2 2 2 pair)) 
       (5 (append-three-phrases-1 2 3 3 pair)) 
       (6 (append-three-phrases-1 3 2 3 pair)) 
       (7 (append-three-phrases-1 3 3 2 pair)) 
       (8 (append-three-phrases-1 2 2 2 pair)) 
       (9 (append-three-phrases-1 2 2 2 pair)))) 
    (8 (case (nth (random 18) '(1 2 3 4 5 6 7 8
                                    9 10 11 12 13 14 
                                   15 16 17 18)) 
       (1 (append-four-phrases-1 1 1 1 1 pair)) 
       (2 (append-four-phrases-1 1 1 1 1 pair)) 
       (3 (append-four-phrases-1 1 1 1 1 pair)) 
       (4 (append-four-phrases-1 1 1 1 1 pair)) 
       (5 (append-four-phrases-1 1 1 1 1 pair)) 
       (6 (append-four-phrases-1 1 1 1 1 pair)) 
       (7 (append-four-phrases-1 2 2 1 1 pair)) 
       (8 (append-four-phrases-1 2 1 2 1 pair)) 
       (9 (append-four-phrases-1 2 1 1 2 pair)) 
       (10 (append-four-phrases-1 1 2 2 1 pair))
       (11 (append-four-phrases-1 1 2 1 2 pair))
       (12 (append-four-phrases-1 1 1 2 2 pair))
       (13 (append-four-phrases-1 2 2 2 2 pair))
       (14 (append-four-phrases-1 2 2 2 2 pair))
       (15 (append-four-phrases-1 2 2 2 2 pair))
       (16 (append-four-phrases-1 2 2 2 2 pair))
       (17 (append-four-phrases-1 2 2 2 2 pair))
       (18 (append-four-phrases-1 2 2 2 2 pair))))))

(defun get-a-phrase-for-ballad (pair)
  (case (length pair) 
    (2 (list pair (get-a-phrase-for-ballad-aux pair)))
    (4 (case (nth (random 6) '(1 2 3 4 5 6)) 
       (1 (append-two-phrases-1 1 1 pair))
       (2 (append-two-phrases-1 1 1 pair))
       (3 (append-two-phrases-1 1 2 pair))
       (4 (append-two-phrases-1 2 1 pair))
       (5 (append-two-phrases-1 2 2 pair))
       (6 (append-two-phrases-1 2 2 pair))))
    (6 (case (nth (random 6) '(1 2 3 4 5 6))
       (1 (append-three-phrases-1 1 1 1 pair))
       (2 (append-three-phrases-1 1 1 1 pair))
       (3 (append-three-phrases-1 1 1 1 pair))
       (4 (append-three-phrases-1 2 1 1 pair))
       (5 (append-three-phrases-1 1 2 1 pair))
       (6 (append-three-phrases-1 1 1 2 pair))))
       (8 (append-four-phrases-1 1 1 1 1 pair))))

(defun get-a-phrase-for-waltz (pair) 
  (case (length pair) 
    (2 (list pair 
                 (get-a-phrase-for-waltz-aux pair)))
    (4 (case (nth (random 10) '(1 2 3 4 5
                                    6 7 8 9 10))
       (1 (append-two-phrases-1 1 1 pair))
       (2 (append-two-phrases-1 1 1 pair))
       (3 (append-two-phrases-1 1 2 pair))
       (4 (append-two-phrases-1 2 1 pair))
       (5 (append-two-phrases-1 2 2 pair))
       (6 (append-two-phrases-1 2 2 pair))
       (7 (append-two-phrases-1 2 3 pair))
       (8 (append-two-phrases-1 3 2 pair))
       (9 (append-two-phrases-1 3 3 pair))
       (10 (append-two-phrases-1 3 3 pair))))
    (6 (case (nth (random 12) '(1 2 3 4 5 6 7
                                    8 9 10 11 12))
       (1 (append-three-phrases-1 1 1 1 pair)
       (2 (append-three-phrases-1 1 1 1 pair))
       (3 (append-three-phrases-1 1 1 1 pair))
       (4 (append-three-phrases-1 2 1 1 pair))
       (5 (append-three-phrases-1 1 2 1 pair))
       (6 (append-three-phrases-1 1 1 2 pair))
       (7 (append-three-phrases-1 2 2 1 pair))
       (8 (append-three-phrases-1 2 1 2 pair))
       (9 (append-three-phrases-1 1 2 2 pair))
       (10 (append-three-phrases-1 2 2 2 pair))
       (11 (append-three-phrases-1 2 2 2 pair))
       (12 (append-three-phrases-1 2 2 2 pair))))
    (8 (case (nth (random 18) '(1 2 3 4 5 6 7 8 
                                    9 10 11 12 13 14
                                    15 16 17 18))
       (1 (append-four-phrases-1 1 1 1 1 pair))
       (2 (append-four-phrases-1 1 1 1 1 pair))
       (3 (append-four-phrases-1 1 1 1 1 pair))
       (4 (append-four-phrases-1 1 1 1 1 pair))
       (5 (append-four-phrases-1 1 1 1 1 pair))
       (6 (append-four-phrases-1 1 1 1 1 pair))
       (7 (append-four-phrases-1 2 1 1 1 pair))
       (8 (append-four-phrases-1 1 2 1 1 pair))
       (9 (append-four-phrases-1 1 1 2 1 pair))
       (10 (append-four-phrases-1 1 1 1 2 pair))
       (11 (append-four-phrases-1 1 2 1 1 pair))
       (12 (append-four-phrases-1 1 1 2 1 pair))
       (13 (append-four-phrases-1 2 2 1 1 pair))
       (14 (append-four-phrases-1 2 1 2 1 pair))
       (15 (append-four-phrases-1 2 1 1 2 pair))
       (16 (append-four-phrases-1 1 2 2 1 pair))
       (17 (append-four-phrases-1 1 2 1 2 pair))
       (18 (append-four-phrases-1 1 1 2 2 pair))))))