diff options
Diffstat (limited to 'lib/xm-test.lsp')
-rw-r--r-- | lib/xm-test.lsp | 622 |
1 files changed, 622 insertions, 0 deletions
diff --git a/lib/xm-test.lsp b/lib/xm-test.lsp new file mode 100644 index 0000000..8fb34ff --- /dev/null +++ b/lib/xm-test.lsp @@ -0,0 +1,622 @@ +;; xm-test.lsp +;; +;; ============== some test code for xm.lsp =============== +;; + +;(load "xm") + +'(setf pat (make-heap '(a b c d e))) +'(dotimes (i 10) (print (next pat))) +'(print "heap test done: ") +'(read) + + +(defun about-equal (x y) + (cond ((null x) (null y)) + ((consp x) + (and (consp y) + (about-equal (car x) (car y)) + (about-equal (cdr x) (cdr y)))) + ((numberp x) + (and (numberp y) + (< (abs (- x y)) 0.000001))) + (t + (equal x y)))) + + +(defun test (name &rest pairs) + (format t "TEST ~A : " name) + (loop + (cond ((or (null pairs) (null (cdr pairs))) + (format t " --PASSED--~%") + (return)) + ((not (about-equal (car pairs) (cadr pairs))) + (format t " --FAILED-- ~A returned instead of ~A~%" + (car pairs) (cadr pairs)) + (break "a test failed") + (return))) + (setf pairs (cddr pairs)))) + + + +(setf xx (make-cycle '(x y z) :name "xx" :trace nil)) + +(test "test" (next xx) 'x (next xx) 'y (next xx t) '(z) (next xx t) '(x y z)) + +(setf aa (make-cycle '(a b) :name "aa" :trace nil)) + +(setf zz (make-cycle (list xx aa))) + +(test "test2" (next zz) 'x (next zz) 'y (next zz t) '(z) (next zz t) '(a b)) + +(setf zz1 (make-cycle (list xx aa) :for 1 :name "zz1")) + +(setf zz10 (make-cycle (list xx aa) :for 10 :name "zz10" :trace nil)) + +(test "test3" (next zz1 t) '(x y z) (next zz1 t) '(a b) + (next zz10 t) '(x y z) + (next zz10 t) '(a b)) + +(setf aa1 (make-cycle '(a b) :for 1 :name "aa1")) + +(setf zza1 (make-cycle (list xx aa1) :name "zza1")) + +(test "test4" (next zza1 t) '(x y z) (next zza1 t) '(a) + (next zza1 t) '(x y z) (next zza1 t) '(b)) + + +(setf zz2 (make-cycle (list xx aa) :for 1 :name "zz2")) +(setf zzz (make-cycle (list zz2 'q) :name "zzz")) + +(test "test5" (next zzz t) '(x y z) (next zzz t) '(q) + (next zzz t) '(a b) (next zzz t) '(q) + (next zzz t) '(x y z) (next zzz t) '(q)) + + ; test using cpat as items list +(setf cpat (make-cycle '(a b) :name "cpat" :trace nil)) +(setf recycpat (make-cycle cpat :for 3 :name "recycpat" :trace nil)) + +(test "test6" (next recycpat t) '(a b a) + (next recycpat t) '(a b a)) + +; test length-class +(setf lpat (make-length (make-cycle '(a b c)) 2)) +(test "length test 1" (next lpat t) '(a b) (next lpat t) '(c a)) + +(setf lpat2 (make-length (make-cycle '(a b c)) (make-cycle '(2 1 0)))) +(test "length test 2" (next lpat2 t) '(a b) (next lpat2 t) '(c) + (next lpat2 t) '() (next lpat2 t) '(a b)) + + +(setf pp1 (make-palindrome '(a b c) + :elide (make-cycle '(:first :last t nil) :name "pp1-elide-pattern") + :name "pp1")) +(test "palindrome test" (next pp1 t) '(a b c c b) (next pp1 t) '(a b c b a) + (next pp1 t) '(a b c b) (next pp1 t) '(a b c c b a) + (next pp1 1) '(a b c c b)) + + +(setf pp2 (make-palindrome '(a b c) + :elide (make-cycle '(:first :last t)) :for 3)) +(test "palindrome test 2" (next pp2 t) '(a b c) (next pp2 t) '(c b a) + (next pp2 t) '(a b c) (next pp2 t) '(b a b)) + + +(setf pp3 (make-palindrome '(a) :elide (make-cycle '(:first :last t nil)))) +(test "palindrome test 3" (next pp3 t) '(a) (next pp3 t) '(a) + (next pp3 t) nil (next pp3 t) '(a a)) + + +(setf pp4 (make-palindrome '(a b c) :elide (make-cycle '(:first :last)) + :for 6)) +(test "palindrome test 4" (next pp4 t) '(a b c c b a) + (next pp4 t) '(b c b a a b)) + +(setf ll1 (make-line '(a b c d))) +(test "line test" (next ll1 t) '(a b c d) (next ll1 t) '(d d d d)) + +(setf nn1 (make-cycle (list + (make-cycle (list + (make-cycle '(a b) :name "ab") + (make-cycle '(c) :name "c")) + :name "ab-c") + (make-cycle (list + (make-cycle '(x y) :name "xy") + (make-cycle '(u v) :name "uv")) + :name "xy-uv")) + :name "ab-c-xy-uv")) + +(test "nested test" (next nn1 t) '(a b) (next nn1 t) '(c) (next nn1 t) '(x y) + (next nn1 t) '(u v) (next nn1 t) '(a b) (next nn1 t) '(c)) + +(setf win1 (make-window (make-cycle '(a b c)) 3 1)) + +(test "window test 1" (next win1 t) '(a b c) + (next win1 t) '(b c a) (next win1 t) '(c a b)) + +(setf win2 (make-window (make-cycle '(a b c)) ; source + (make-cycle '(3 1)) ; length + (make-cycle '(1 1 3)))) ; skip + +(test "window test 2" (next win2 t) '(a b c) + (next win2 t) '(b) ; skip 1 length 1 + (next win2 t) '(a b c) ; skip 1 length 3 + (next win2 t) '(a) ; skip 3 length 1 + (next win2 t) '(b c a) ; skip 1 length 3 + (next win2 t) '(c) ; skip 1 length 1 + (next win2 t) '(a b c) ; skip 3 length 3 + (next win2 t) '(b) ; skip 1 length 1 + (next win2 t) '(a b c)) ; skip 1 length 3 + +(defun only-abc-n (lis n) + (and (= (length lis) n) + (dolist (item lis t) + (cond ((not (member item '(a b c))) + (return nil)))))) + +(defun abc2 (lis) (only-abc-n lis 2)) + +(defun abc3 (lis) (only-abc-n lis 3)) + +(setf rr1 (make-random '(a b c) :name "rr1")) +(display "rr1" (next rr1 t)) +(test "random 1" (abc3 (next rr1 t)) t (abc3 (next rr1 t)) t) + +(setf rr2 (make-random '(a b c) :for 2 :name "rr2" :trace nil)) +(test "random 2" (abc2 (next rr2 t)) t (abc2 (next rr2 t)) t) + + +; random using weights +(setf rr3 (make-random '((a :weight 1) (b :weight 10)))) +(setf a-count 0 b-count 0) +(setf *num-trials* 10000) ;; NORMALLY, SET THIS TO 10000 +(setf rr3-all nil) +(dotimes (i *num-trials*) + ;(display "weight test" i) + (if (eq (setf rr3-out (next rr3)) 'a) (incf a-count) (incf b-count)) + (push rr3-out rr3-all)) +;(print (reverse rr3-all)) + +(setf rr-ratio (/ (float a-count) b-count)) +(format t "test rr3 a/b should be 0.091, actual ratio is ~A~%" rr-ratio) +(test "weight test" (and (< rr-ratio 0.12) (> rr-ratio 0.08)) t) + + +; random using :min +(setf rr4 (make-random '((a :weight 1 :min 2) (b :weight 10 :min 1)))) +(setf sum 0) +(setf a-count 0 b-count 0) +(dotimes (i *num-trials*) + ;(display "min test" (next rr4)) + (if (eq (next rr4) 'a) (incf a-count) (incf b-count)) +) +(setf rr-ratio (/ (float a-count) b-count)) +(format t "test rr4 a/b should be about 0.191, actual ratio is ~A~%" rr-ratio) +(test "min test" (and (< rr-ratio 0.22) (> rr-ratio 0.16)) t) + + +; random using :max +(setf rr5 (make-random '((a :weight 1 :min 2) (b :weight 10 :max 5)))) +(setf sum 0) +(setf rr5-all nil) +(setf a-count 0 b-count 0) +(dotimes (i *num-trials*) + ;(display "max test" (next rr5)) + (if (eq (setf rr5-out (next rr5)) 'a) (incf a-count) (incf b-count)) + (push rr5-out rr5-all)) +(setf rr5-all (reverse rr5-all)) +(setf rr5-state 'a2) +(setf rr5-count 0) +(dolist (s rr5-all) + (incf rr5-count) + (cond ((and (eq rr5-state 'a1) (eq s 'a)) + (setf rr5-state 'a2)) + ((and (eq rr5-state 'a2) (eq s 'a))) + ((and (eq rr5-state 'a2) (eq s 'b)) + (setf rr5-state 'b1)) + ((and (eq rr5-state 'b1) (eq s 'b)) + (setf rr5-state 'b2)) + ((and (eq rr5-state 'b2) (eq s 'b)) + (setf rr5-state 'b3)) + ((and (eq rr5-state 'b3) (eq s 'b)) + (setf rr5-state 'b4)) + ((and (eq rr5-state 'b4) (eq s 'b)) + (setf rr5-state 'b5)) + ((and (eq rr5-state 'b1) (eq s 'a)) + (setf rr5-state 'a1)) + ((and (eq rr5-state 'b2) (eq s 'a)) + (setf rr5-state 'a1)) + ((and (eq rr5-state 'b3) (eq s 'a)) + (setf rr5-state 'a1)) + ((and (eq rr5-state 'b4) (eq s 'a)) + (setf rr5-state 'a1)) + ((and (eq rr5-state 'b5) (eq s 'a)) + (setf rr5-state 'a1)) + (t + (error "bad state")))) + +(setf rr-ratio (/ (float a-count) b-count)) +(format t "test rr5 a/b should be 0.503613, actual ratio is ~A~%" rr-ratio) +(test "max test" (and (> rr-ratio 0.4) (< rr-ratio 0.6)) t) + + +(setf hh1 (make-heap '(a b c))) +(test "heap 1" (abc3 (next hh1 t)) t (abc3 (next hh1 t)) t) + +(setf hh2 (make-heap '(a b c) :for 2 :name "hh2" :trace nil)) +(test "heap 2" (abc2 (next hh2 t)) t (abc2 (next hh2 t)) t) + +(setf xx (make-markov `((a -> a (b ,(make-cycle '(1 2)))) (b -> a)) + :past '(b) + :produces `(a ,(make-cycle '(0)) + b ,(make-cycle '(1 2 3 4) + :trace nil :name "b-produces")) + :is-nested t + :trace nil :name "markov")) +(setf xx-out nil) +(dotimes (i 12) (push (next xx) xx-out)) +(setf xx-out (reverse xx-out)) +(print xx-out) +;; this is a special test to see if the output is plausible +(defun markov-test-xx (lis) + (let (a b) + (setf a (car lis)) + (setf lis (cdr lis)) + (cond ((null lis) t) + ((and (setf b (car lis)) + (eq a 0) (member b '(0 1))) + (markov-test-xx lis)) + ((and (eq a 1) (eq b 2)) + (markov-test-xx lis)) + ((and (eq a 2) (eq b 3)) + (markov-test-xx lis)) + ((and (eq a 3) (eq b 4)) + (markov-test-xx lis)) + ((and (= a 4) (= b 0)) + (markov-test-xx lis)) + (t nil)))) +(format t "TEST markov test : ~A~%" (if (markov-test-xx xx-out) "--PASSED--" + (break "markov test failed"))) + + +(setf cc (make-copier (make-cycle '(a b) :name "ab" :trace nil) + :repeat 3 :name "copier" :trace nil :merge t)) + +(test "copier test 1" (next cc t) '(a b a b a b) (next cc t) '(a b a b a b)) + +(setf cc2 (make-copier (make-cycle '(a b) :name "ab" :trace nil) + :repeat 3 :name "copier" :trace nil)) + +(test "copier test 2" (next cc2 t) '(a b) (next cc2 t) '(a b) (next cc2 t) '(a b)) + +(setf cc3 (make-copier (make-cycle (list (make-cycle '(a)) (make-cycle '(b)))) + :repeat 3 :merge t)) + +(test "copier test 3" (next cc3 t) '(a a a) (next cc3 t) '(b b b) + (next cc3 t) '(a a a)) + +(setf cc4 (make-copier (make-cycle '(a b c d) :for 1) + :repeat (make-cycle '(2 -2 3 -3)) + :merge t)) +(test "copier test 4" (next cc4 t) '(a a) (next cc4 t) '(d d d) + (next cc4 t) '(d d) (next cc4 t) '(c c c)) + +(setf cc5 (make-copier (make-cycle '(a b c d) :for 1) + :repeat 3)) +(test "compier test 5" (next cc5 t) '(a) (next cc5 t) '(a) + (next cc5 t) '(a) (next cc5 t) '(b) (next cc5 t) '(b) + (next cc5 t) '(b) (next cc5 t) '(c) (next cc5 t) '(c) + (next cc5 t) '(c) (next cc5 t) '(d) (next cc5 t) '(d) + (next cc5 t) '(d) (next cc5 t) '(a) (next cc5 t) '(a)) + + +(setf acc1 (make-accumulate (make-cycle '(1 2 -3)))) + +(test "accumulate test 1" (next acc1 t) '(1 3 0) (next acc1 t) '(1 3 0)) + +(setf acc2 (make-accumulate (make-cycle '(1 2 -3) :for 2))) + +(test "accumulate test 2" (next acc2 t) '(1 3) (next acc2 t) '(0 1) + (next acc2 t) '(3 0)) + +(setf sum1 (make-sum (make-cycle '(1 2)) (make-cycle '(3 4 5)))) + +(test "sum test 1" (next sum1 t) '(4 6) (next sum1 t) '(6 5) + (next sum1 t) '(5 7)) + +(setf sum2 (make-sum (make-cycle '(1 2)) (make-cycle '(3 4 5)) :for 4)) + +(test "sum test 2" (next sum2 t) '(4 6 6 5) (next sum2 t) '(5 7 4 6)) + +(setf prod1 (make-product (make-cycle '(1 2)) (make-cycle '(3 4 5)))) + +(test "prod test 1" (next prod1 t) '(3 8) (next prod1 t) '(5 6) + (next prod1 t) '(4 10)) + +(setf prod2 (make-product (make-cycle '(1 2)) (make-cycle '(3 4 5)) :for 4)) + +(test "prod test 2" (next prod2 t) '(3 8 5 6) (next prod2 t) '(4 10 3 8)) + +(setf eval1 (make-eval '(+ 1 2) :for 3)) + +(test "eval test 1" (next eval1 t) '(3 3 3)) + +#| + +(setf testscore '((0 0 (score-begin-end 0 10)) + (0.1 1 (note :pitch 60 :vel 100)) + (1 1 (note :pitch 61 :vel 91)) + (1 0.5 (note :pitch 68 :vel 92)) + (1.5 0.5 (note :pitch 67 :vel 93)) + (2 1 (note :pitch 62 :vel 94)))) + +(test "basic1" (score-get-begin testscore) 0) +(test "basic2" (score-get-end testscore) 10) +(test "basic3" (score-set-begin testscore 1) + (cons '(0 0 (score-begin-end 1 10)) (cdr testscore))) +(test "basic4" (score-set-end testscore 4) + (cons '(0 0 (score-begin-end 0 4)) (cdr testscore))) +(test "basic5" (score-get-begin (cdr testscore)) 0.1) +(test "basic6" (score-get-end (cdr testscore)) 3) + +(test "score-shift" (score-shift testscore 5) + '((0 0 (SCORE-BEGIN-END 0 15)) + (5.1 1 (NOTE :PITCH 60 :VEL 100)) + (6 0.5 (NOTE :PITCH 68 :VEL 92)) + (6 1 (NOTE :PITCH 61 :VEL 91)) + (6.5 0.5 (NOTE :PITCH 67 :VEL 93)) + (7 1 (NOTE :PITCH 62 :VEL 94)) + )) + +(test "score-stretch1" (setf xx (score-stretch testscore 2)) + (setf yy '((0 0 (SCORE-BEGIN-END 0 20)) + (0.2 2 (NOTE :PITCH 60 :VEL 100)) + (2 2 (NOTE :PITCH 61 :VEL 91)) + (2 1 (NOTE :PITCH 68 :VEL 92)) + (3 1 (NOTE :PITCH 67 :VEL 93)) + (4 2 (NOTE :PITCH 62 :VEL 94)) + ))) + +(test "score-stretch2" (score-stretch testscore 2 :dur nil) + '((0 0 (SCORE-BEGIN-END 0 20)) + (0.2 1 (NOTE :PITCH 60 :VEL 100)) + (2 1 (NOTE :PITCH 61 :VEL 91)) + (2 0.5 (NOTE :PITCH 68 :VEL 92)) + (3 0.5 (NOTE :PITCH 67 :VEL 93)) + (4 1 (NOTE :PITCH 62 :VEL 94)) + )) + +(test "score-stretch3" (score-stretch testscore 2 :from-index 2 :to-index 3) + '((0 0 (SCORE-BEGIN-END 0 10.5)) + (0.1 1.1 (NOTE :PITCH 60 :VEL 100)) + (1 1.5 (NOTE :PITCH 61 :VEL 91)) + (1 1 (NOTE :PITCH 68 :VEL 92)) + (2 0.5 (NOTE :PITCH 67 :VEL 93)) + (2.5 1 (NOTE :PITCH 62 :VEL 94)) + )) + +(test "score-stretch4" (score-stretch testscore 2 :from-time 1.5 :to-time 2.5) + '((0 0 (SCORE-BEGIN-END 0 11)) + (0.1 1 (NOTE :PITCH 60 :VEL 100)) + (1 1.5 (NOTE :PITCH 61 :VEL 91)) + (1 0.5 (NOTE :PITCH 68 :VEL 92)) + (1.5 1 (NOTE :PITCH 67 :VEL 93)) + (2.5 1.5 (NOTE :PITCH 62 :VEL 94)) + )) + + +(test "score-transpose1" (score-transpose testscore :pitch 5) + '((0 0 (score-begin-end 0 10)) + (0.1 1 (note :pitch 65 :vel 100)) + (1 1 (note :pitch 66 :vel 91)) + (1 0.5 (note :pitch 73 :vel 92)) + (1.5 0.5 (note :pitch 72 :vel 93)) + (2 1 (note :pitch 67 :vel 94)))) + +(test "score-transpose1" (score-transpose testscore :pitch 5 + :from-index 2 :to-index 3) + '((0 0 (score-begin-end 0 10)) + (0.1 1 (note :pitch 60 :vel 100)) + (1 1 (note :pitch 66 :vel 91)) + (1 0.5 (note :pitch 73 :vel 92)) + (1.5 0.5 (note :pitch 67 :vel 93)) + (2 1 (note :pitch 62 :vel 94)))) + +(test "score-scale1" (score-scale testscore :vel 0.5) + '((0 0 (SCORE-BEGIN-END 0 10)) + (0.1 1 (NOTE :PITCH 60 :VEL 50)) + (1 1 (NOTE :PITCH 61 :VEL 45.5)) + (1 0.5 (NOTE :PITCH 68 :VEL 46)) + (1.5 0.5 (NOTE :PITCH 67 :VEL 46.5)) + (2 1 (NOTE :PITCH 62 :VEL 47)) + )) + +(test "score-scale2" (score-scale testscore :vel 0.5 + :from-time 1 :to-time 1.5) + '((0 0 (SCORE-BEGIN-END 0 10)) + (0.1 1 (NOTE :PITCH 60 :VEL 100)) + (1 1 (NOTE :PITCH 61 :VEL 45.5)) + (1 0.5 (NOTE :PITCH 68 :VEL 46)) + (1.5 0.5 (NOTE :PITCH 67 :VEL 93)) + (2 1 (NOTE :PITCH 62 :VEL 94)) + )) + +(test "score-sustain1" (score-sustain testscore 2) + '((0 0 (SCORE-BEGIN-END 0 10)) + (0.1 2 (NOTE :PITCH 60 :VEL 100)) + (1 2 (NOTE :PITCH 61 :VEL 91)) + (1 1 (NOTE :PITCH 68 :VEL 92)) + (1.5 1 (NOTE :PITCH 67 :VEL 93)) + (2 2 (NOTE :PITCH 62 :VEL 94)))) + +(test "score-sustain2" (score-sustain testscore 2 + :from-index 0 :to-index 1) + '((0 0 (SCORE-BEGIN-END 0 10)) + (0.1 2 (NOTE :PITCH 60 :VEL 100)) + (1 1 (NOTE :PITCH 61 :VEL 91)) + (1 0.5 (NOTE :PITCH 68 :VEL 92)) + (1.5 0.5 (NOTE :PITCH 67 :VEL 93)) + (2 1 (NOTE :PITCH 62 :VEL 94)))) + +(test "score-voice1" (score-voice testscore '((note violin))) + '((0 0 (SCORE-BEGIN-END 0 10)) + (0.1 1 (VIOLIN :PITCH 60 :VEL 100)) + (1 1 (VIOLIN :PITCH 61 :VEL 91)) + (1 0.5 (VIOLIN :PITCH 68 :VEL 92)) + (1.5 0.5 (VIOLIN :PITCH 67 :VEL 93)) + (2 1 (VIOLIN :PITCH 62 :VEL 94)))) + +(test "score-voice2" (score-voice testscore '((flute horn) (note violin)) + :from-index 0 :to-index 10) + '((0 0 (SCORE-BEGIN-END 0 10)) + (0.1 1 (VIOLIN :PITCH 60 :VEL 100)) + (1 1 (VIOLIN :PITCH 61 :VEL 91)) + (1 0.5 (VIOLIN :PITCH 68 :VEL 92)) + (1.5 0.5 (VIOLIN :PITCH 67 :VEL 93)) + (2 1 (VIOLIN :PITCH 62 :VEL 94)))) + +'(score-print (score-merge testscore + (score-shift + (score-voice testscore '((note violin))) + 0.1))) + + +(test "score-merge1" (score-merge testscore + (score-shift + (score-voice testscore '((note violin))) + 0.1)) + '((0 0 (SCORE-BEGIN-END 0 10.1)) + (0.1 1 (NOTE :PITCH 60 :VEL 100)) + (0.2 1 (VIOLIN :PITCH 60 :VEL 100)) + (1 1 (NOTE :PITCH 61 :VEL 91)) + (1 0.5 (NOTE :PITCH 68 :VEL 92)) + (1.1 0.5 (VIOLIN :PITCH 68 :VEL 92)) + (1.1 1 (VIOLIN :PITCH 61 :VEL 91)) + (1.5 0.5 (NOTE :PITCH 67 :VEL 93)) + (1.6 0.5 (VIOLIN :PITCH 67 :VEL 93)) + (2 1 (NOTE :PITCH 62 :VEL 94)) + (2.1 1 (VIOLIN :PITCH 62 :VEL 94)) + )) + +(test "score-merge2" (score-merge + '((0 0 (SCORE-BEGIN-END 0 10)) + (0 1 (NOTE :PITCH 60 :VEL 100))) + '((0 0 (SCORE-BEGIN-END 0 10)) + (1 1 (NOTE :PITCH 61 :VEL 91))) + '((0 0 (SCORE-BEGIN-END 0 10)) + (2 1 (NOTE :PITCH 62 :VEL 94)))) + '((0 0 (SCORE-BEGIN-END 0 10)) + (0 1 (NOTE :PITCH 60 :VEL 100)) + (1 1 (NOTE :PITCH 61 :VEL 91)) + (2 1 (NOTE :PITCH 62 :VEL 94)))) + +(test "score-append1" + (score-append testscore testscore) + '((0 0 (SCORE-BEGIN-END 0 20)) + (0.1 1 (NOTE :PITCH 60 :VEL 100)) + (1 1 (NOTE :PITCH 61 :VEL 91)) + (1 0.5 (NOTE :PITCH 68 :VEL 92)) + (1.5 0.5 (NOTE :PITCH 67 :VEL 93)) + (2 1 (NOTE :PITCH 62 :VEL 94)) + (10.1 1 (NOTE :PITCH 60 :VEL 100)) + (11 1 (NOTE :PITCH 61 :VEL 91)) + (11 0.5 (NOTE :PITCH 68 :VEL 92)) + (11.5 0.5 (NOTE :PITCH 67 :VEL 93)) + (12 1 (NOTE :PITCH 62 :VEL 94)))) + + +(test "score-select1" + (score-select testscore t :from-time 1 :to-time 1.5) + '((0 0 (SCORE-BEGIN-END 0 10)) + (1 1 (NOTE :PITCH 61 :VEL 91)) + (1 0.5 (NOTE :PITCH 68 :VEL 92)))) + +(test "score-select2" + (score-select testscore + '(lambda (time dur expr) (eql (expr-get-attr expr :pitch) 61)) + :from-time 1 :to-time 1.5) + '((0 0 (SCORE-BEGIN-END 0 10)) + (1 1 (NOTE :PITCH 61 :VEL 91)))) + +(test "score-select3" + (score-select testscore + '(lambda (time dur expr) (eql (expr-get-attr expr :pitch) 61)) + :reject t) + '((0 0 (SCORE-BEGIN-END 0 10)) + (0.1 1 (NOTE :PITCH 60 :VEL 100)) + (1 0.5 (NOTE :PITCH 68 :VEL 92)) + (1.5 0.5 (NOTE :PITCH 67 :VEL 93)) + (2 1 (NOTE :PITCH 62 :VEL 94)))) + +(test "score-filter-length" + (score-filter-length testscore 1.5) + '((0 0 (SCORE-BEGIN-END 0 10)) + (0.1 1 (NOTE :PITCH 60 :VEL 100)) + (1 0.5 (NOTE :PITCH 68 :VEL 92)))) + +(test "score-repeat" + (score-repeat testscore 3) + '((0 0 (SCORE-BEGIN-END 0 30)) + (0.1 1 (NOTE :PITCH 60 :VEL 100)) + (1 0.5 (NOTE :PITCH 68 :VEL 92)) + (1 1 (NOTE :PITCH 61 :VEL 91)) + (1.5 0.5 (NOTE :PITCH 67 :VEL 93)) + (2 1 (NOTE :PITCH 62 :VEL 94)) + (10.1 1 (NOTE :PITCH 60 :VEL 100)) + (11 1 (NOTE :PITCH 61 :VEL 91)) + (11 0.5 (NOTE :PITCH 68 :VEL 92)) + (11.5 0.5 (NOTE :PITCH 67 :VEL 93)) + (12 1 (NOTE :PITCH 62 :VEL 94)) + (20.1 1 (NOTE :PITCH 60 :VEL 100)) + (21 1 (NOTE :PITCH 61 :VEL 91)) + (21 0.5 (NOTE :PITCH 68 :VEL 92)) + (21.5 0.5 (NOTE :PITCH 67 :VEL 93)) + (22 1 (NOTE :PITCH 62 :VEL 94)))) + +(test "score-stretch-to-length" + (score-stretch-to-length testscore 20) + '((0 0 (SCORE-BEGIN-END 0 20)) + (0.2 2 (NOTE :PITCH 60 :VEL 100)) + (2 2 (NOTE :PITCH 61 :VEL 91)) + (2 1 (NOTE :PITCH 68 :VEL 92)) + (3 1 (NOTE :PITCH 67 :VEL 93)) + (4 2 (NOTE :PITCH 62 :VEL 94)) + )) + +(test "score-filter-overlap" + (score-filter-overlap testscore) + '((0 0 (SCORE-BEGIN-END 0 10)) + (0.1 1 (NOTE :PITCH 60 :VEL 100)) + (1.5 0.5 (NOTE :PITCH 67 :VEL 93)) + (2 1 (NOTE :PITCH 62 :VEL 94)))) + +(test "score-adjacent-events1" + (score-adjacent-events testscore #'(lambda (a b c) b)) + testscore) + +(test "score-adjacent-events2" + (score-adjacent-events testscore + #'(lambda (a b c) + (if (eql (event-get-attr b :pitch) 61) + nil b))) ; remove pitches with 61 + '((0 0 (SCORE-BEGIN-END 0 10)) + (0.1 1 (NOTE :PITCH 60 :VEL 100)) + (1 0.5 (NOTE :PITCH 68 :VEL 92)) + (1.5 0.5 (NOTE :PITCH 67 :VEL 93)) + (2 1 (NOTE :PITCH 62 :VEL 94)))) + +(test "score-indexof" + (score-indexof testscore #'(lambda (time dur expr) + (eql (expr-get-attr expr :pitch) 61))) + 2) + +(test "score-last-indexof" + (score-last-indexof testscore #'(lambda (time dur expr) + (> (expr-get-attr expr :pitch) 65))) + 4) + + +|# + + + |