;;;
;;; (load "c:\\program files\\acl62\\music66.cl")
;;;
(load "c:\\program files\\acl62\\music65.cl")

;;;
;;;(get-a-lhv-at-random-from-pair '("CM7" ion))--->(re mi so)
;;;
(defun connect-lists-for-phrase-by-a-pair-lhv (pair)
  (let ((lst (get-a-lhv-at-random-from-pair pair)))
   (remove (car (avoid-note pair)) (connect-lists-for-phrase lst))))

(defun get-a-phrase-1-aux-lhv (pair)
  (cut-list-at-length (+ (random 2) 1) (connect-lists-for-phrase-by-a-pair-lhv pair)))

(defun get-a-phrase-2-aux-lhv (pair)
  (cut-list-at-length (+ (random 4) 1) (connect-lists-for-phrase-by-a-pair-lhv pair)))

(defun get-a-phrase-3-aux-lhv (pair)
  (cut-list-at-length (+ (random 6) 1) (connect-lists-for-phrase-by-a-pair-lhv pair)))

(defun get-a-phrase-4-aux-lhv (pair)
  (cut-list-at-length (+ (random 8) 1) (connect-lists-for-phrase-by-a-pair-lhv pair)))


(defun get-a-phrase-one-aux-lhv (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-lhv (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-lhv (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-lhv (list (first lst) (second lst))))))
         (push l3 w))))))



(defun get-a-phrase-two-aux-lhv (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-lhv (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-lhv (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-lhv (list (first lst) (second lst))))))
          (push l3 w))))))


(defun get-a-phrase-one-2-aux-lhv (pair)
  (let ((l (get-a-phrase-one-aux-lhv 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-lhv (pair)
  (let ((l (get-a-phrase-two-aux-lhv pair))
     (n))
    (setf n (number-of-notes l))
    (list l '***4beat*** (get-rythm-of-4beat n) '***3beat*** (get-rythm-of-3beat n))))


;;;
;;;(get-phrases-one-lhv '(("CM7" ion "A7" hmp5) ("Dm7" dor "G7" alt) ("CM7" ion)))
;;;
;;;((((CM7 ion) re mi re mi re mi) ((A7 hmp5) +fa so)) ***4beat*** (4 8 16 16 8 16 16 4) ***3beat***
;;; (8 16 16 4 16 16 16 16))
;;;((((Dm7 dor) mi fa) ((G7 alt) +la fa si +la)) ***4beat*** (4 4 3(8pause 8 8) 8 8) ***3beat***
;;; (16 16 16 16 3(8pause 8pause 8) 8pause 8))
;;;((((CM7 ion) la mi so)) ***4beat*** (8 8 2.5) ***3beat*** (4 4 4))
;;;((((("CM7" ion) re mi re mi re mi) (("A7" hmp5) +fa so)) ***4beat*** (4 8 16 16 8 16 16 4) ***3beat***
;;; (8 16 16 4 16 16 16 16))
;;; (((("Dm7" dor) mi fa) (("G7" alt) +la fa si +la)) ***4beat*** (4 4 "3(8pause 8 8)" 8 8) ***3beat***
;;; (16 16 16 16 "3(8pause 8pause 8)" 8pause 8))
;;; (((("CM7" ion) la mi so)) ***4beat*** (8 8 2.5) ***3beat*** (4 4 4)))
;;;
;;;(get-phrases-two-lhv '(("CM7" ion "A7" hmp5) ("Dm7" dor "G7" alt) ("CM7" ion)))
;;;
;;;((((CM7 ion) so) ((A7 hmp5) si so +fa)) ***4beat*** (4 4 4.5 8) ***3beat*** (4 4 8 8))
;;;((((Dm7 dor) la mi) ((G7 alt) +so si mi fa)) ***4beat*** (4 8pause 8 3(8 8 8) 4) ***3beat***
;;; (16 16 8 8.5 16 4))
;;;((((CM7 ion) mi re si)) ***4beat*** (4.5 8 2) ***3beat*** (2 8 8))
;;;((((("CM7" ion) so) (("A7" hmp5) si so +fa)) ***4beat*** (4 4 4.5 8) ***3beat*** (4 4 8 8))
;;; (((("Dm7" dor) la mi) (("G7" alt) +so si mi fa)) ***4beat*** (4 8pause 8 "3(8 8 8)" 4) ***3beat***
;;; (16 16 8 8.5 16 4))
;;; (((("CM7" ion) mi re si)) ***4beat*** (4.5 8 2) ***3beat*** (2 8 8)))
;;;
(defun get-phrases-one-lhv (l)
  (do ((lst l (cdr lst))
     (w))
     ((null lst) (reverse w))
    (let ((ll (get-a-phrase-one-2-aux-lhv (car lst))))
     (format t "~%~a" ll)
     (push ll w))))

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


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


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