;;;
;;; c:\\program files\\acl62\\music24.cl
;;;
(load "c:\\program files\\acl62\\music23.cl")

(defun get-CPM-or-CPm (key)
  (cond ((upper-char-p key)
       (list (list key 'Major)
          (get-CPM-with-key-at-random key)
          (get-related-key key)))
      ((lower-char-p key)
       (list (list key 'Minor)
          (get-CPm-with-key-at-random key)
          (get-related-key key)))))

(defun build-CP ()
  (prog (key w r)
    (my-randomize)
    (setf w nil)
    loop
    (format t "~%The chord progression is ~a." w)
    (format t "~%The length of the chord progression is ~a." (length w))
    ;;;
    loop2
    (format t "~%So far is it OK ? (y or n)")
    (setf r (car (read-sentence)))
    (if (not (or (eq r 'y) (eq r 'n)))
      (go loop2))
    ;;;
    (cond ((eq r 'n)
         (setf w (butlast w))
         (go loop))
         ((eq r 'y)
          (go next)))
    next
    (format t "~%Enter a key!~%")
    (setf key (car (read-sentence)))
    (if (or (eq key 'end) (eq key 'END))
      (go exit))
    (if (not (or (upper-char-p key)
            (lower-char-p key)))
      (go next))
    exit
    (cond ((or (eq key 'end)
           (eq key 'END))
         (return w))
        (t
         (setf w (append w (list (get-CPM-or-CPm key))))
         (go loop)))))

(defun get-first-and-second-part (lst)
  (list (first lst) (second lst)))

;;;
;;;
;;;
(defun make-chord-progression ()
  (format t "~%~a" (mapcar #'get-first-and-second-part (build-CP))))