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


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

(make-frame-from-list
 '(chords-on-scale
  (CM7-ion-2 (value "CM7" "Dm7" "Em7"
                      "FM7" "G7" "Am7"
                      "Bm7-5"))
  (Cm7-dor-2 (value "Cm7" "Dm7" "-EM7"
                      "F7" "Gm7" "Am7-5"
                      "-BM7"))
  (Cm7-phr-2 (value "Cm7" "-DM7" "-E7"
                      "Fm7" "Gm7-5" "-AM7"
                      "-Bm7"))
  (CM7-lyd-2 (value "CM7" "D7" "Em7"
                      "+Fm7-5" "GM7"
                      "Am7" "Bm7"))
  (C7-mix-2 (value "C7" "Dm7" "Em7-5"
                     "FM7" "Gm7" "Am7"
                     "-BM7"))
  (Cm7-aeo-2 (value "Cm7" "Dm7-5"
                      "-EM7" "Fm7" "Gm7"
                      "-AM7" "-B7"))
  (Cm7-5-loc-2 (value "Cm7-5" "-DM7"
                        "-Em7" "Fm7"
                        "-GM7" "-AM7"
                        "-Bm7"))
  (Cm7-n-2 (value "Cm7" "Dm7-5" "-EM7"
                    "Fm7" "Gm7" "-AM7"
                    "-B7"))
  (Cm7-h-2 (value "CmM7" "Dm7-5"
                    "-EaugM7" "Fm7"
                    "G7" "-AM7"
                    "Bdim"))
  (Cm7-m-2 (value "CmM7" "Dm7"
                    "-EaugM7" "F7"
                    "G7" "Am7-5" "Bm7-5"
                    "Cm7" "-B7" "-AM7"
                    "Gm7" "Fm7" "-EM7"
                    "Dm7-5"))
  (Cm7-dor-2-2 (value "Cm7-5" "-DaugM7"
                        "-E7" "F7"
                        "Gm7-5" "Am7-5"
                        "-BmM7"))
  (Cm7-5-loc+2-2 (value "Cm7-5"
                          "Dm7-5" "-EmM7"
                          "Fm7" "-GaugM7"
                          "-A7" "-B7"))
  (C7-lyd-7-2 (value "C7" "D7" "Em7-5"
                       "+Fm7-5" "GmM7"
                       "Am7" "-BaugM7"))
  (C7-hmp5-2 (value "Fm7" "-Ddim7"
                      "Edim7" "Gdim7"
                      "-Bdim7"))
  (C7-mmp5-2 (value "C7" "Dm7-5"
                      "Em7-5" "FmM7"
                      "Gm7" "-AaugM7"
                      "-B7"))
  (C7-alt-2 (value "Cm7-5" "-DmM7"
                     "-Em7" "EaugM7"
                     "-G7" "-A7"
                     "-Bm7-5"))
  (C7-comd-2 (value "Cdim7" "-Ddim7"
                      "-Edim7" "Edim7"
                      "-Gdim7" "Gdim7"
                      "Adim7" "-Bdim7"))
  (Cdim7-dim-2 (value "Cdim7" "Ddim7"
                        "-Edim7" "Fdim7"
                        "-Gdim7" "-Adim7"
                        "Adim7" "Bdim7"))
  (C7-wt-2 (value "Caug" "Daug" "Eaug"
                    "-Gaug" "-Aaug"
                    "-Baug"))
  (C7-mixsus4-2 (value "C7"
                         "Dm7" "Em7-5"
                         "FM7" "Gm7"
                         "Am7" "-BM7"))
  (C7-mix-6-2 (value "C7" "Dm7-5"
                       "Em7-5" "FmM7"
                       "Gm7" "-AaugM7"
                       "-B7"))))

;;;
;;; (get-chords-on-scale '("CM7" ion))
;;;
(defun get-chords-on-scale (pair)
 (case (second pair)
  (ion (modulate-key1-to-key2
             (fget-i 'chords-on-scale
                     'CM7-ion-2)
             'C
             (involve-atom-p
                     (first pair))))
  (dor (modulate-key1-to-key2
             (fget-i 'chords-on-scale
                     'Cm7-dor-2)
             'C
             (involve-atom-p
                     (first pair))))
  (phr (modulate-key1-to-key2
             (fget-i 'chords-on-scale
                     'Cm7-phr-2)
             'C
             (involve-atom-p
                     (first pair))))
  (lyd (modulate-key1-to-key2
             (fget-i 'chords-on-scale
                     'CM7-lyd-2)
             'C
             (involve-atom-p
                     (first pair))))
  (mix (modulate-key1-to-key2 
             (fget-i 'chords-on-scale
                     'C7-mix-2)
             'C
             (involve-atom-p
                     (first pair))))
  (aeo (modulate-key1-to-key2
             (fget-i 'chords-on-scale
                     'Cm7-aeo-2)
             'C
             (involve-atom-p
                     (first pair))))
  (loc (modulate-key1-to-key2
             (fget-i 'chords-on-scale
                     'Cm7-5-loc-2)
             'C
             (involve-atom-p
                     (first pair))))
  (n (modulate-key1-to-key2
           (fget-i 'chords-on-scale
                   'Cm7-n-2)
           'C
           (involve-atom-p
                   (first pair))))
  (h (modulate-key1-to-key2
           (fget-i 'chords-on-scale
                   'Cm7-h-2)
           'C
           (involve-atom-p
                   (first pair))))
  (m (modulate-key1-to-key2
           (fget-i 'chords-on-scale
                   'Cm7-m-2)
           'C
           (involve-atom-p
                   (first pair))))
  (dor-2 (modulate-key1-to-key2
               (fget-i 'chords-on-scale
                       'Cm7-dor-2-2)
               'C
               (involve-atom-p
                       (first pair))))
  (loc+2 (modulate-key1-to-key2
               (fget-i 'chords-on-scale
                       'Cm7-5-loc+2-2)
               'C
               (involve-atom-p
                       (first pair))))
  (lyd-7 (modulate-key1-to-key2
               (fget-i 'chords-on-scale
                       'C7-lyd-7-2)
               'C
               (involve-atom-p
                       (first pair))))
  (hmp5 (modulate-key1-to-key2
              (fget-i 'chords-on-scale
                      'C7-hmp5-2)
              'C
              (involve-atom-p
                      (first pair))))
  (mmp5 (modulate-key1-to-key2
              (fget-i 'chords-on-scale
                      'C7-mmp5-2)
              'C
              (involve-atom-p
                      (first pair))))
  (alt (modulate-key1-to-key2
             (fget-i 'chords-on-scale
                     'C7-alt-2)
             'C
             (involve-atom-p
                     (first pair))))
  (comd (modulate-key1-to-key2
              (fget-i 'chords-on-scale
                      'C7-comd-2)
              'C
              (involve-atom-p
                      (first pair))))
  (dim (modulate-key1-to-key2
             (fget-i 'chords-on-scale
                     'Cdim7-dim-2)
             'C
             (involve-atom-p
                     (first pair))))
  (wt (modulate-key1-to-key2
            (fget-i 'chords-on-scale
                    'C7-wt-2)
            'C
            (involve-atom-p
                    (first pair))))
  (mixsus4 (modulate-key1-to-key2
                 (fget-i 'chords-on-scale
                         'C7-mixsus4-2)
                 'C
                 (involve-atom-p
                         (first pair))))
  (mix-6 (modulate-key1-to-key2
               (fget-i 'chords-on-scale
                       'C7-mix-6-2)
               'C
               (involve-atom-p
                       (first pair))))))

;;;
;;; (tell-chords-on-scale *w1*)
;;;
(defun tell-chords-on-scale-aux (lst)
  (let ((l (collect-pairs lst)))
    (do ((ll l (cdr ll)))
      ((null ll))
     (format t "~% ~a : ~a."
                     (car ll)
                     (get-chords-on-scale 
                            (car ll))))))

(defun tell-chords-on-scale (wn)
  (tagbody
    (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-chords-on-scale-aux l2)))

(defun collect-chords-on-scales-of-CM7 ()
  (remove-duplicate
    (append (fget-i 'chords-on-scale
                        'CM7-ion-2)
        (fget-i 'chords-on-scale
                        'CM7-lyd-2))))

(defun collect-chords-on-scales-of-Cm7 ()
  (remove-duplicate
    (append (fget-i 'chords-on-scale
                        'Cm7-dor-2)
        (fget-i 'chords-on-scale
                        'Cm7-phr-2)
        (fget-i 'chords-on-scale
                        'Cm7-aeo-2)
        (fget-i 'chords-on-scale
                        'Cm7-n-2)
        (fget-i 'chords-on-scale
                        'Cm7-h-2)
        (fget-i 'chords-on-scale
                        'Cm7-m-2)
        (fget-i 'chords-on-scale
                        'Cm7-dor-2-2))))

(defun collect-chords-on-scales-of-Cm7-5 ()
  (remove-duplicate
    (append (fget-i 'chords-on-scale
                        'Cm7-5-loc-2)
        (fget-i 'chords-on-scale
                        'Cm7-5-loc+2-2))))

(defun collect-chords-on-scales-of-C7 ()
  (remove-duplicate
    (append (fget-i 'chords-on-scale
                        'C7-mix-2)
        (fget-i 'chords-on-scale
                        'C7-lyd-7-2)
        (fget-i 'chords-on-scale
                        'C7-hmp5-2)
        (fget-i 'chords-on-scale
                        'C7-mmp5-2)
        (fget-i 'chords-on-scale
                        'C7-alt-2)
        (fget-i 'chords-on-scale
                        'C7-comd-2)
        (fget-i 'chords-on-scale
                        'C7-wt-2)
        (fget-i 'chords-on-scale
                        'C7-mixsus4-2)
        (fget-i 'chords-on-scale
                        'C7-mix-6-2))))

(defun collect-chords-on-scales-of-Cdim7 ()
  (fget-i 'chords-on-scale 'Cdim7-dim))

;;;
;;; (collect-chords-on-scales "CM7")
;;;
(defun collect-chords-on-scales (chord)
  (cond ((search-s1-in-s2 "m7-5" chord)
      (modulate-key1-to-key2
             (collect-chords-on-scales-of-Cm7-5)
               'C
               (involve-atom-p chord)))
     ((search-s1-in-s2 "dim" chord)
      (modulate-key1-to-key2
             (collect-chords-on-scales-of-Cdim7)
               'C
               (involve-atom-p chord)))
     ((search-s1-in-s2 "m7" chord)
      (modulate-key1-to-key2
               (collect-chords-on-scales-of-Cm7)
               'C
               (involve-atom-p chord)))
     ((search-s1-in-s2 "M7" chord)
      (modulate-key1-to-key2
               (collect-chords-on-scales-of-CM7)
               'C
               (involve-atom-p chord)))
     ((search-s1-in-s2 "7" chord)
      (modulate-key1-to-key2
               (collect-chords-on-scales-of-C7)
               'C
               (involve-atom-p chord)))))

;;;
;;; (tell-chords-on-scales *w1*)
;;;
(defun tell-chords-on-scales-aux (l)
  (let ((lst (collect-chords l)))
   (do ((ll lst (cdr ll)))
     ((null ll))
    (format t "~% ~a : ~a."
                   (car ll)
                   (collect-chords-on-scales 
                            (car ll))))))

(defun tell-chords-on-scales (wn)
  (tagbody
    (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-chords-on-scales-aux l2)))