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

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

(defun get-elements-of-melody-3 (pair)
  (translate-flat-to-sharp-in-a-list
     (append (last (chord-tone pair)) 
                   (tension-note pair))))

(defun get-20elements-in-a-list (l) 
  (do ((i 1 (1+ i))
       (w))
      ((> i 20) w)
       (push (nth (random (length l)) l) w)))

(defun get-a-phrase-1-aux-3-7 (pair)
  (cut-list-at-length (+ (random 2) 1)
    (get-20elements-in-a-list 
       (get-elements-of-melody-2 pair)))) 

(defun get-a-phrase-2-aux-3-7 (pair)
  (cut-list-at-length (+ (random 4) 1)
    (get-20elements-in-a-list 
        (get-elements-of-melody-2 pair)))) 

(defun get-a-phrase-3-aux-3-7 (pair) 
  (cut-list-at-length (+ (random 6) 1)
    (get-20elements-in-a-list 
        (get-elements-of-melody-2 pair)))) 

(defun get-a-phrase-4-aux-3-7 (pair)
   (cut-list-at-length (+ (random 8) 1)
      (get-20elements-in-a-list 
          (get-elements-of-melody-2 pair)))) 

(defun get-a-phrase-1-aux-7 (pair) 
   (cut-list-at-length (+ (random 2) 1) 
      (get-20elements-in-a-list 
          (get-elements-of-melody-3 pair)))) 

(defun get-a-phrase-2-aux-7 (pair) 
   (cut-list-at-length (+ (random 4) 1) 
      (get-20elements-in-a-list 
          (get-elements-of-melody-3 pair)))) 

(defun get-a-phrase-3-aux-7 (pair) 
   (cut-list-at-length (+ (random 6) 1)
      (get-20elements-in-a-list 
          (get-elements-of-melody-3 pair)))) 

(defun get-a-phrase-4-aux-7 (pair)
   (cut-list-at-length (+ (random 8) 1)
      (get-20elements-in-a-list 
           (get-elements-of-melody-3 pair)))) 

(defun get-a-phrase-one-aux-3-7 (l) 
   (cond ((equal (length l) 2) 
          (do ((lst l (cddr lst)) 
               (w))
              ((null lst) (reverse w))
            (let ((l1 (cons (list (first lst)
                                  (second lst))
                         (get-a-phrase-4-aux-3-7 
                            (list (first lst) 
                                  (second lst))))))
              (push l1 w))))
         ((equal (length l) 4)
          (do ((lst l (cddr lst))
               (w))
              ((null lst) (reverse w))
            (let ((l2 (cons (list 
                               (first lst)
                               (second lst))
                            (get-a-phrase-3-aux-3-7 
                               (list (first lst)
                                     (second lst))))))
              (push l2 w)))) 
         ((equal (length l) 6)
          (do ((lst l (cddr lst))
               (w))
              ((null lst) (reverse w))
            (let ((l3 (cons 
                         (list (first lst)
                               (second lst))
                         (get-a-phrase-2-aux-3-7 
                             (list (first lst)
                                   (second lst))))))
              (push l3 w)))))) 

(defun get-a-phrase-two-aux-3-7 (l)
  (cond ((equal (length l) 2)
         (do ((lst l (cddr lst))
              (w))
             ((null lst) (reverse w))
           (let ((l1 (cons 
                        (list (first lst) 
                              (second lst))
                        (get-a-phrase-3-aux-3-7
                           (list (first lst)
                                 (second lst))))))
             (push l1 w))))
         ((equal (length l) 4)
          (do ((lst l (cddr lst))
               (n2)
               (w)) 
              ((null lst) (reverse w))
            (let ((l2 (cons (list 
                              (first lst)
                              (second lst))
              (get-a-phrase-2-aux-3-7 
                   (list (first lst) 
                         (second lst))))))
             (push l2 w))))
         ((equal (length l) 6)
          (do ((lst l (cddr lst))
               (w))
              ((null lst) (reverse w))
           (let ((l3 (cons (list (first lst)
                                 (second lst))
             (get-a-phrase-1-aux-3-7 
                  (list (first lst)
                  (second lst))))))
           (push l3 w)))))) 

(defun get-a-phrase-one-aux-7 (l) 
   (cond ((equal (length l) 2)
          (do ((lst l (cddr lst))
               (w))
              ((null lst) (reverse w))
            (let ((l1 (cons (list (first lst)
                                  (second lst))
                            (get-a-phrase-4-aux-7 
                                (list (first lst)
                                      (second lst))))))
              (push l1 w))))
         ((equal (length l) 4)
          (do ((lst l (cddr lst)) 
               (w))
              ((null lst) (reverse w))
           (let ((l2 (cons (list (first lst)
                                 (second lst)) 
                           (get-a-phrase-3-aux-7 
                           (list (first lst)
                                 (second lst))))))
             (push l2 w))))
         ((equal (length l) 6)
          (do ((lst l (cddr lst))
               (w)) 
              ((null lst) (reverse w))
            (let ((l3 (cons (list (first lst)
                                  (second lst))
                            (get-a-phrase-2-aux-7
                                (list (first lst)
                                      (second lst))))))
              (push l3 w)))))) 

(defun get-a-phrase-two-aux-7 (l)
  (cond ((equal (length l) 2)
         (do ((lst l (cddr lst))
              (w))
             ((null lst) (reverse w))
           (let ((l1 (cons (list (first lst) (second lst))
                           (get-a-phrase-3-aux-7 
                               (list (first lst) 
                                     (second lst))))))
            (push l1 w))))
        ((equal (length l) 4)
         (do ((lst l (cddr lst))
              (n2)
              (w))
             ((null lst) (reverse w))
           (let ((l2 (cons (list (first lst) (second lst))
                           (get-a-phrase-2-aux-7 
                              (list (first lst)
                                    (second lst))))))
             (push l2 w))))
         ((equal (length l) 6)
          (do ((lst l (cddr lst))
               (w))
              ((null lst) (reverse w))
            (let ((l3 (cons (list (first lst) (second lst))
                            (get-a-phrase-1-aux-7
                                 (list (first lst)
                                       (second lst))))))
              (push l3 w)))))) 

(defun get-a-phrase-one-2-aux-3-7 (pair) 
  (let ((l (get-a-phrase-one-aux-3-7 pair))
        (n))
    (setf n (number-of-notes l))
    (list l '***4beat*** (get-rythm-of-4beat n) 
            '***3beat*** (get-rythm-of-3beat n))))

 (defun get-a-phrase-two-2-aux-3-7 (pair) 
   (let ((l (get-a-phrase-two-aux-3-7 pair))
         (n)) 
     (setf n (number-of-notes l))
     (list l '***4beat*** (get-rythm-of-4beat n) 
             '***3beat*** (get-rythm-of-3beat n))))

(defun get-a-phrase-one-2-aux-7 (pair)
  (let ((l (get-a-phrase-one-aux-7 pair))
        (n))
    (setf n (number-of-notes l))
    (list l '***4beat*** (get-rythm-of-4beat n) 
            '***3beat*** (get-rythm-of-3beat n)))) 

(defun get-a-phrase-two-2-aux-7 (pair) 
  (let ((l (get-a-phrase-two-aux-7 pair))
        (n))
    (setf n (number-of-notes l))
    (list l '***4beat*** (get-rythm-of-4beat n) 
            '***3beat*** (get-rythm-of-3beat n)))) 

(defun get-phrases-one-3-7 (l) 
   (do ((lst l (cdr lst)) 
        (w)) ((null lst) (reverse w)) 
     (let ((ll (get-a-phrase-one-2-aux-3-7 
                      (car lst))))
       (format t "~%~a" ll) (push ll w)))) 

(defun get-phrases-two-3-7 (l) 
  (do ((lst l (cdr lst)) 
       (w))
      ((null lst) (reverse w))
    (let ((ll (get-a-phrase-two-2-aux-3-7
                    (car lst)))) 
      (format t "~%~a" ll)
      (push ll w)))) 

(defun get-phrases-one-7 (l) 
  (do ((lst l (cdr lst)) 
       (w)) 
      ((null lst) (reverse w))
    (let ((ll (get-a-phrase-one-2-aux-7 
                  (car lst)))) 
      (format t "~%~a" ll)
      (push ll w)))) 

(defun get-phrases-two-7 (l) 
  (do ((lst l (cdr lst)) 
       (w)) 
      ((null lst) (reverse w))
    (let ((ll (get-a-phrase-two-2-aux-7 
                   (car lst)))) 
      (format t "~%~a" ll)
      (push ll w)))) 

defun auto-comp-one-3-7 (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)) 
     ;(print l2)
     (get-phrases-one-3-7 l2))) 

(defun auto-comp-two-3-7 (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))
     (get-phrases-two-3-7 l2))) 

(defun auto-comp-one-7 (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)) 
     ;(print l2)
     (get-phrases-one-7 l2))) 

(defun auto-comp-two-7 (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)) 
     (get-phrases-two-7 l2)))