;;;
;;; C:\\program files\\acl62\\music19.cl
;;;
(load "c:\\program files\\acl62\\music18.cl")
(defun get-chord-tone-2 (pair)
(translate-flat-to-sharp-in-a-list
(replace-j-note-with-doremi
(get-chord-tone (car pair)))))
(defun get-chord-scale-2 (pair)
(translate-flat-to-sharp-in-a-list
(replace-j-note-with-doremi
(chord-scale pair))))
(defun get-tension-note-2 (pair)
(translate-flat-to-sharp-in-a-list
(replace-j-note-with-doremi
(tension-note pair))))
(defun get-guide-tone-2 (pair)
(translate-flat-to-sharp-in-a-list
(replace-j-note-with-doremi
(guide-tone pair))))
(defun get-elements-of-melody-2 (pair)
(translate-flat-to-sharp-in-a-list
(replace-j-note-with-doremi
(get-elements-of-melody pair))))
(defun generate-a-note-at-random (pair)
(let* ((lst (get-elements-of-melody-2 pair))
(num (length lst)))
(nth (random num) lst)))
(defun translate-number-to-sound-2 (n offset)
(let ((num (confine-a-number (+ n offset))))
(case num
(1.0 'do) (1.5 '+do) (2.0 're) (2.5 '+re)
(3.0 'mi) (3.5 'fa) (4.0 '+fa) (4.5 'so)
(5.0 '+so) (5.5 'la) (6.0 '+la)
(6.5 'si))))
(defun translate-sound-to-number-2 (c)
(case c
(do 1.0) (+do 1.5) (re 2.0) (+re 2.5)
(mi 3.0) (fa 3.5) (+fa 4.0) (so 4.5)
(+so 5.0) (la 5.5) (+la 6.0) (si 6.5)))
(defun distance-of-two-sound-2 (s1 s2)
(let* ((n1 (translate-sound-to-number-2 s1))
(n2 (translate-sound-to-number-2 s2))
(num (- n2 n1)))
(cond ((>= num 7.0) (- num 6.0))
((<= num 0.0) (+ num 6.0))
(t num))))
(defun sharp-a-note (note)
(let ((num
(translate-sound-to-number-2 note)))
(translate-number-to-sound-2
(+ 0.5 num) 0.0)))
(defun flat-a-note (note)
(let* ((num
(translate-sound-to-number-2 note))
(n1 (- num 0.5))
(n2 (cond ((>= n1 7.0) (- n1 6.0))
((<= n1 0.5) (+ n1 6.0))
(t n1))))
(translate-number-to-sound-2 n2 0.0)))
(defun member-of-chord-tone-2 (note pair)
(car (member note (get-chord-tone-2 pair))))
(defun member-of-tension-note-2 (note pair)
(car (member note (get-tension-note-2 pair))))
(defun member-of-scale-note-2 (note pair)
(car (member note
(append (get-chord-tone-2 pair)
(get-tension-note-2 pair)))))
(defun member-of-element-note-2 (note pair)
(car (member note
(append (get-guide-tone-2 pair)
(get-tension-note-2 pair)))))
(defun member-of-guide-tone-2 (note pair)
(car (member note (get-guide-tone-2 pair))))
(defun sharp-till-chord-tone (note pair)
(do ((nt note (sharp-a-note nt))
(w))
((member-of-chord-tone-2 nt pair)
(push nt w) (reverse w))
(cond ((member-of-scale-note-2 nt pair)
(push nt w)))))
(defun flat-till-chord-tone (note pair)
(do ((nt note (flat-a-note nt))
(w))
((member-of-chord-tone-2 nt pair)
(push nt w) (reverse w))
(cond ((member-of-scale-note-2 nt pair)
(push nt w)))))
(defun generate-a-phrase-aux (pair)
(do ((i 8 (1- i))
(w))
((<= i 0) (reverse w))
(let ((nt (generate-a-note-at-random pair)))
(cond ((member-of-guide-tone-2 nt pair)
(push nt w))
((member-of-tension-note-2 nt pair)
(push
(case (random 2)
(0 (flat-till-chord-tone
nt pair))
(1 (sharp-till-chord-tone
nt pair)))
w))
(t (push
(case (random 2)
(0 (flat-till-chord-tone
nt pair))
(1 (sharp-till-chord-tone
nt pair)))
w))))))
(defun generate-a-phrase-of-n-notes (pair n)
(cut-list-at-length
n
(generate-a-phrase-aux pair)))
(defun generate-a-phrase-at-random (pair)
(generate-a-phrase-of-n-notes
pair (1+ (random 6))))
(defun make-a-phrase (l)
(do ((lst l (cddr lst)))
((null lst))
(format t "~%***** On ~a *****" l)
(format t "~%***** On ~a *****"
(list (first lst) (second lst)))
(format t "~%Chord Scale: ~a"
(chord-scale (list (first lst)
(second lst))))
(format t "~%~a"
(generate-a-phrase-at-random
(list (first lst) (second lst))))
(format t "~%~a"
(generate-a-phrase-at-random
(list (first lst) (second lst))))
(format t "~%~a"
(generate-a-phrase-at-random
(list (first lst) (second lst))))
(format t "~%~a"
(generate-a-phrase-at-random
(list (first lst) (second lst))))
(format t "~%~a"
(generate-a-phrase-at-random
(list (first lst) (second lst))))))
(defun make-phrases (l)
(do ((lst l (cdr lst)))
((null lst))
(make-a-phrase (car lst))))
;;;
;;; (auto-comp2 *w3*) etc.
;;;
(defun auto-comp2 (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))
(make-phrases l2)))
|