;;; 
;;; c:\\program files\\acl62\\rythm.cl 
;;; 
(load "c:\\program files\\acl62\\music2.cl") 

(make-frame-from-list 
 '(4n (add0 (value 4 (8pause 8) 
                    "3(8pause 8pause 8)")) 
    (add1 (value (8 8) (8.5 16) 
                     "3(8pause 8 8)")) 
    (add2 (value (16pause 16 16 16) 
                     (8 16 16) "3(8 8 8)"))
    (add3 (value (16 16 16 16))))) 

(defun fget-addn-of-4n (n) 
  (case n 
    (0 (fget-i '4n 'add0)) 
    (1 (fget-i '4n 'add1)) 
    (2 (fget-i '4n 'add2)) 
    (3 (fget-i '4n 'add3)))) 

(defun select-addn-of-4n (n) 
  (let ((lst (fget-addn-of-4n n))) 
    (nth (random (length lst)) lst))) 

(defun generate-a-list-of-disorder-n (n) 
  (prog (w num) 
   loop 
   (setf num (1+ (random n))) 
   (if (and (not (member num w)) 
        (<= num n)) 
     (push num w)) 
   (if (>= (length w) n) 
     (go exit) 
      (go loop)) 
   exit 
   (return w))) 

(defun replace-nth-element-in-a-list (l n e) 
  (do ((lst l (cdr lst)) 
     (num 1 (1+ num)) 
      (w)) 
    ((null lst) (reverse w)) 
   (if (= num n) 
     (push e w) 
      (push (car lst) w)))) 

(defun replace-n-place-with-addn-of-4n (n1 l) 
  (do ((lst 
         (generate-a-list-of-disorder-n 4) 
                (cdr lst)) 
     (lst2 l (cdr lst2)) 
     (num1 0 (1+ num1)) 
     (w '(4 4 4 4))) 
    ((= num1 n1) (squash w)) 
   (setf w (replace-nth-element-in-a-list 
                       w 
            (car lst) 
            (select-addn-of-4n 
                           (car lst2)))))) 

;;; 
;;; 
;;; 
(defun add1-4n () 
  (case (random 3) 
    (0 (replace-n-place-with-addn-of-4n 
                1 '(1))) 
    (1 (replace-n-place-with-addn-of-4n 
                2 '(0 1))) 
    (2 (replace-n-place-with-addn-of-4n 
                4 '(0 0 0 1))))) 

(defun add2-4n () 
  (case (random 7) 
    (0 (replace-n-place-with-addn-of-4n 
                3 '(0 1 1))) 
    (1 (replace-n-place-with-addn-of-4n 
                4 '(0 0 1 1))) 
    (2 (replace-n-place-with-addn-of-4n 
                2 '(0 2))) 
    (3 (replace-n-place-with-addn-of-4n 
                3 '(0 0 2))) 
    (4 (replace-n-place-with-addn-of-4n 
                4 '(0 0 0 2))) 
    (5 (replace-n-place-with-addn-of-4n 
                2 '(1 1))) 
    (6 (replace-n-place-with-addn-of-4n 
                1 '(2))))) 

(defun add3-4n () 
  (case (random 8) 
    (0 (replace-n-place-with-addn-of-4n 
                3 '(0 1 2))) 
    (1 (replace-n-place-with-addn-of-4n 
                4 '(0 0 1 2))) 
    (2 (replace-n-place-with-addn-of-4n 
                4 '(0 1 1 1))) 
    (3 (replace-n-place-with-addn-of-4n 
                2 '(0 3))) 
    (4 (replace-n-place-with-addn-of-4n 
                4 '(0 0 0 3))) 
    (5 (replace-n-place-with-addn-of-4n 
                2 '(1 2))) 
    (6 (replace-n-place-with-addn-of-4n 
                3 '(1 1 1))) 
    (7 (replace-n-place-with-addn-of-4n 
                1 '(3))))) 

(defun add4-4n () 
  (case (random 8) 
    (0 (replace-n-place-with-addn-of-4n 
                4 '(0 1 1 2))) 
    (1 (replace-n-place-with-addn-of-4n 
                3 '(0 1 3))) 
    (2 (replace-n-place-with-addn-of-4n 
                4 '(0 0 1 3))) 
    (3 (replace-n-place-with-addn-of-4n 
                3 '(0 2 2))) 
    (4 (replace-n-place-with-addn-of-4n 
                4 '(0 0 2 2))) 
    (5 (replace-n-place-with-addn-of-4n 
                3 '(1 1 2))) 
    (6 (replace-n-place-with-addn-of-4n 
                2 '(1 3))) 
    (7 (replace-n-place-with-addn-of-4n 
                2 '(2 2))))) 

(defun add5-4n () 
  (case (random 7) 
    (0 (replace-n-place-with-addn-of-4n 
                4 '(0 1 2 2))) 
    (1 (replace-n-place-with-addn-of-4n 
                4 '(0 1 1 3))) 
    (2 (replace-n-place-with-addn-of-4n 
                3 '(0 2 3))) 
    (3 (replace-n-place-with-addn-of-4n 
                4 '(0 0 2 3))) 
    (4 (replace-n-place-with-addn-of-4n 
                3 '(1 2 2))) 
    (5 (replace-n-place-with-addn-of-4n 
                2 '(2 3))) 
    (6 (replace-n-place-with-addn-of-4n 
                3 '(1 1 3))))) 

(defun add6-4n () 
  (case (random 9) 
    (0 (replace-n-place-with-addn-of-4n 
                4 '(0 1 2 3))) 
    (1 (replace-n-place-with-addn-of-4n 
                3 '(1 2 3))) 
    (2 (replace-n-place-with-addn-of-4n 
                4 '(0 2 2 2))) 
    (3 (replace-n-place-with-addn-of-4n 
                3 '(0 3 3))) 
    (4 (replace-n-place-with-addn-of-4n 
                4 '(0 0 3 3))) 
    (5 (replace-n-place-with-addn-of-4n 
                4 '(1 1 2 2))) 
    (6 (replace-n-place-with-addn-of-4n 
                4 '(1 1 1 3))) 
    (7 (replace-n-place-with-addn-of-4n 
                3 '(2 2 2))) 
    (8 (replace-n-place-with-addn-of-4n 
                2 '(3 3))))) 

(defun add7-4n () 
  (case (random 6) 
    (0 (replace-n-place-with-addn-of-4n 
                4 '(0 1 3 3))) 
    (1 (replace-n-place-with-addn-of-4n 
                4 '(0 2 2 3))) 
    (2 (replace-n-place-with-addn-of-4n 
                4 '(1 1 2 3))) 
    (3 (replace-n-place-with-addn-of-4n 
                3 '(1 3 3))) 
    (4 (replace-n-place-with-addn-of-4n 
                4 '(1 2 2 2))) 
    (5 (replace-n-place-with-addn-of-4n 
                3 '(2 2 3))))) 

(defun add8-4n () 
  (case (random 5) 
    (0 (replace-n-place-with-addn-of-4n 
                4 '(1 2 2 3))) 
    (1 (replace-n-place-with-addn-of-4n 
                3 '(2 3 3))) 
    (2 (replace-n-place-with-addn-of-4n 
                4 '(1 1 3 3))) 
    (3 (replace-n-place-with-addn-of-4n 
                4 '(2 2 2 2))) 
    (4 (replace-n-place-with-addn-of-4n 
                4 '(0 2 3 3))))) 

(defun add9-4n () 
  (case (random 4) 
    (0 (replace-n-place-with-addn-of-4n 
                4 '(1 2 3 3))) 
    (1 (replace-n-place-with-addn-of-4n 
                4 '(2 2 2 3))) 
    (2 (replace-n-place-with-addn-of-4n 
                3 '(3 3 3))) 
    (3 (replace-n-place-with-addn-of-4n 
                4 '(0 3 3 3))))) 

(defun add10-4n () 
  (case (random 2) 
    (0 (replace-n-place-with-addn-of-4n 
                4 '(2 2 3 3))) 
    (1 (replace-n-place-with-addn-of-4n 
                4 '(3 3 3 1))))) 

(defun add11-4n () 
  (replace-n-place-with-addn-of-4n 
                4 '(2 3 3 3))) 

(defun add12-4n () 
  (replace-n-place-with-addn-of-4n 
                4 '(3 3 3 3))) 

(defun add0-4n () 
  (nth (random 10) 
           '((4 4 4 4) (4.5 8 4 4) 
             (4 4 4.5 8) (4 4.5 4 8) 
             (4 2 8 8) (2 4 8 8) 
             (4 8 8 2) (2 8 8 4) 
             (8 8 2 4) (4 8 8 2)))) 

(defun add-1-4n () 
  (nth (random 7) 
           '((2 4 4) (4 4 2) 
             (4 2 4) (4.5 8 2) 
             (2 4.5 8) (2.5 8 8) 
             (8 8 2.5)))) 

(defun add-2-4n () 
  (nth (random 6) 
           '((2.5 4) (4 2.5) 
             (2.5 4) (4 2.5) 
             (2 2) (2 2)))) 

(defun add-3-4n () 
    (nth (random 2) '((1) (1)))) 

;;; 
;;; 
;;; 
(defun get-rythm-of-4beat (n) 
  (case n 
    (1 (add-3-4n)) 
    (2 (add-2-4n)) 
    (3 (add-1-4n)) 
    (4 (add0-4n)) 
    (5 (add1-4n)) 
    (6 (add2-4n)) 
    (7 (add3-4n)) 
    (8 (add4-4n)) 
    (9 (add5-4n)) 
    (10 (add6-4n)) 
    (11 (add7-4n)) 
    (12 (add8-4n)) 
    (13 (add9-4n)) 
    (14 (add10-4n)) 
    (15 (add11-4n)) 
    (16 (add12-4n)))) 

(defun get-4beat-below-n (n) 
  (get-rythm-of-4beat (1+ (random n)))) 

(defun get-4beat () 
  (get-rythm-of-4beat (1+ (random 16)))) 

;;; 
;;;*************************************** 
;;; 
(make-frame-from-list 
  '(3n (add0 (value 4 (8pause 8) 
                     "3(8pause 8pause 8)"))
     (add1 (value (8 8) (8.5 16) 
                      "3(8pause 8 8)")) 
     (add2 (value (16 16 8) (8 16 16) 
                      "3(8 8 8)")) 
     (add3 (value (16 16 16 16))))) 

(defun fget-addn-of-3n (n) 
  (case n 
    (0 (fget-i '3n 'add0)) 
    (1 (fget-i '3n 'add1)) 
    (2 (fget-i '3n 'add2)) 
    (3 (fget-i '3n 'add3)))) 

(defun select-addn-of-3n (n) 
  (let ((lst (fget-addn-of-3n n))) 
   (nth (random (length lst)) lst)))

(defun replace-n-place-with-addn-of-3n (n1 l)
  (do ((lst 
           (generate-a-list-of-disorder-n 3) 
           (cdr lst)) 
     (lst2 l (cdr lst2)) 
     (num1 0 (1+ num1)) 
     (w '(4 4 4))) 
    ((= n1 num1) (squash w)) 
   (setf w (replace-nth-element-in-a-list 
                    w 
          (car lst) 
          (select-addn-of-3n 
                       (car lst2)))))) 

(defun add1-3n () 
  (case (random 3) 
    (0 (replace-n-place-with-addn-of-3n 
                 2 '(0 1))) 
    (1 (replace-n-place-with-addn-of-3n 
                 3 '(0 0 1))) 
    (2 (replace-n-place-with-addn-of-3n 
                 1 '(1))))) 

(defun add2-3n () 
  (case (random 5) 
    (0 (replace-n-place-with-addn-of-3n 
                 3 '(0 1 1))) 
    (1 (replace-n-place-with-addn-of-3n 
                 2 '(0 2))) 
    (2 (replace-n-place-with-addn-of-3n 
                 3 '(0 0 2))) 
    (3 (replace-n-place-with-addn-of-3n 
                 2 '(1 1))) 
    (4 (replace-n-place-with-addn-of-3n 
                 1 '(2))))) 

(defun add3-3n () 
  (case (random 4) 
    (0 (replace-n-place-with-addn-of-3n 
                 3 '(0 1 2))) 
    (1 (replace-n-place-with-addn-of-3n 
                 2 '(0 3))) 
    (2 (replace-n-place-with-addn-of-3n 
                 3 '(0 0 3))) 
    (3 (replace-n-place-with-addn-of-3n 
                 2 '(1 2))))) 

(defun add4-3n () 
  (case (random 5) 
    (0 (replace-n-place-with-addn-of-3n 
                 2 '(1 3))) 
    (1 (replace-n-place-with-addn-of-3n 
                 3 '(0 2 2))) 
    (2 (replace-n-place-with-addn-of-3n 
                 3 '(1 1 2))) 
    (3 (replace-n-place-with-addn-of-3n 
                 2 '(1 3))) 
    (4 (replace-n-place-with-addn-of-3n 
                 2 '(2 2))))) 

(defun add5-3n () 
  (case (random 4) 
    (0 (replace-n-place-with-addn-of-3n 
                 3 '(0 2 3))) 
    (1 (replace-n-place-with-addn-of-3n 
                 3 '(1 2 2))) 
    (2 (replace-n-place-with-addn-of-3n 
                 2 '(2 3))) 
    (3 (replace-n-place-with-addn-of-3n 
                 3 '(1 1 3))))) 

(defun add6-3n () 
  (case (random 4) 
    (0 (replace-n-place-with-addn-of-3n 
                 3 '(1 2 3))) 
    (1 (replace-n-place-with-addn-of-3n 
                 3 '(0 3 3))) 
    (2 (replace-n-place-with-addn-of-3n 
                 3 '(2 2 2))) 
    (3 (replace-n-place-with-addn-of-3n 
                 2 '(3 3))))) 

(defun add7-3n () 
  (case (random 2) 
    (0 (replace-n-place-with-addn-of-3n 
                 3 '(1 3 3))) 
    (1 (replace-n-place-with-addn-of-3n 
                 3 '(2 2 3))))) 

(defun add8-3n () 
  (replace-n-place-with-addn-of-3n 
                 3 '(2 3 3))) 

(defun add9-3n () 
  (replace-n-place-with-addn-of-3n 
                 3 '(3 3 3))) 

(defun add0-3n () 
  (nth (random 5) 
           '((4 4 4) (4 4.5 8) 
             (4.5 8 4) (2 8 8) 
             (8 8 2)))) 

(defun add-1-3n () 
  (nth (random 2) '((2 4) (4 2))))

(defun add-2-3n () '(2.5)) 

;;; 
;;; 
;;; 
(defun get-rythm-of-3beat (n) 
  (case n 
    (1 (add-2-3n)) 
    (2 (add-1-3n)) 
    (3 (add0-3n)) 
    (4 (add1-3n)) 
    (5 (add2-3n)) 
    (6 (add3-3n)) 
    (7 (add4-3n)) 
    (8 (add5-3n)) 
    (9 (add6-3n)) 
    (10 (add7-3n)) 
    (11 (add8-3n)) 
    (12 (add9-3n)))) 

(defun get-3beat-below-n (n) 
  (get-rythm-of-3beat 
          (1+ (random n)))) 

(defun get-3beat () 
  (get-rythm-of-3beat 
          (1+ (random 12))))