;;;
;;; c:\\program files\\acl62\\music18.cl
;;;
(load "c:\\program files\\acl62\\music17.cl")

(defun floor-n-at-m (n m)
  (do ((nn 0 (1+ nn))
     (w))
     ((>= nn n) (mapcar #'(lambda (e) (floor e m)) (reverse w)))
    (push nn w)))

(defun floor-list-at-m (lst m)
  (floor-n-at-m (length lst) m))

(defun append-floor (lst n)
  (do ((l1 (floor-list-at-m lst n) (cdr l1))
     (l2 lst (cdr l2))
     (w))
     ((null l1) (reverse w))
    (push (list (car l1) (car l2)) w)))

(defun last-of-floor (lst n)
  (car (last (floor-list-at-m lst n))))

(defun fetch-n-part-of-lst (lst n)
  (do ((l lst (cdr l))
     (w))
     ((null l) (reverse w))
    (if (= (first (car l)) n)
      (push (second (car l)) w))))

(defun divide-into-n-parts (lst n)
  (do ((max (last-of-floor lst n))
     (l (append-floor lst n) (cdr l))
     (n 0 (1+ n))
     (w))
     ((= n (1+ max)) (reverse w))
    (push (fetch-n-part-of-lst l n) w)))

;;;
;;;
;;;
(defun fold-list-at-n (lst n)
  (divide-into-n-parts lst n))

(defun show-list-at-n-fold (lst n)
  (do ((l (fold-list-at-n lst n) (cdr l)))
     ((null l))
    (format t "~%~a" (car l))))

;;;
;;;
;;;
(defun tell-a-pair-1 (pair)
  (format t "~% トライアッド")
  (show-list-at-n-fold (get-triads pair) 4)
  (format t "~% 7thコード")
  (show-list-at-n-fold (get-chords-from-scale pair) 4)
  (format t "~% 4度重ね3和音")
  (show-list-at-n-fold (4th-interval-triads pair) 4)
  (format t "~% 4度重ね4和音")
  (show-list-at-n-fold (4th-interval-chords pair) 4))

(defun tell-a-pair-2 (pair)
  (format t "~%Scale ~a" (chord-scale pair))
  (format t "~%3rd-interval ~a" (3rd-interval pair))
  (format t "~%4th-interval ~a" (4th-interval pair))
  (format t "~%5th-interval ~a" (5th-interval pair))
  (format t "~%6th-interval ~a" (6th-interval pair))
  (format t "~%7th-interval ~a" (7th-interval pair)))

(defun tell-a-pair-3 (pair)
  (tell-a-chord (car pair)))

(defun tell-a-pair-4 (pair)
  (format t "~%drop2 ~a" (drop2 (car pair)))
  (format t "~%drop3 ~a" (drop3 (car pair)))
  (format t "~%drop2&4 ~a" (drop2&4 (car pair)))
  (format t "~%drop1&4 ~a" (drop1&4 (car pair))))

(defun tell-a-pair-5 (pair)
  (format t "~%Recommended drop ~a" (get-a-drop (car pair))))

;;;
;;; (tell-a-pair-aux '("G7" alt)
;;;
(defun tell-a-pair-aux (pair)
  (tell-a-pair-1 pair)
  (tell-a-pair-2 pair)
  (tell-a-pair-3 pair)
  (tell-a-pair-4 pair)
  (tell-a-pair-5 pair))

(defun tell-a-pair (l)
  (do ((lst l (cddr lst)))
     ((null lst))
    (read-sentence)
    (format t "~%********** On ~a **********" (list (first lst) (second lst)))
    (tell-a-pair-aux (list (first lst) (second lst)))))

(defun tell-pairs-aux (l)
  (do ((lst l (cdr lst)))
     ((null lst))
     (tell-a-pair (car lst))))

(defun tell-pairs (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))
   (tell-pairs-aux l2))