(define pitch-list (list 60 61 63 67 64 66 70 69 72)) (define rhythm-list (list 1.5 1.125 1.375 1.0 1.625 1.875 2.0)) (define dynamics-list (list 0 0.75 1.0 0.33 0.66)) (define (make-note start pitch length dynamic voice) (new midi :time start :keynum pitch :duration length :amplitude dynamic :channel voice)) (define (rotate-left input-list) (append (cdr input-list) (list (car input-list)))) (define (make-isorhythm notes start pitches durations dynamics voice) (if (<= notes 0) nil (cons (make-note start (car pitches) (car durations) (car dynamics) voice) (make-isorhythm (- notes 1) (+ start (car durations)) (rotate-left pitches) (rotate-left durations) (rotate-left dynamics) voice)))) (define (transpose transposition pitch-list) (if (null? pitch-list) nil (cons (+ transposition (car pitch-list)) (transpose transposition (cdr pitch-list))))) (define (make-canon transpositions entrances voices notes start pitches durations dynamics) (if (or (null? transpositions) (null? entrances)) nil (let ((current-pitches (transpose (car transpositions) pitches))) (append (make-isorhythm notes (+ start (car entrances)) current-pitches durations dynamics (car voices)) (make-canon (cdr transpositions) (cdr entrances) (rotate-left voices) notes start pitches durations dynamics))))) (define (prolate scale duration-list) (if (null? duration-list) nil (cons (* scale (car duration-list)) (prolate scale (cdr duration-list))))) (define (make-prolation-canon transpositions entrances prolations voices notes start pitches durations dynamics) (if (or (null? transpositions) (null? entrances) (null? prolations)) nil (let ((current-pitches (transpose (car transpositions) pitches)) (current-rhythms (prolate (car prolations) durations))) (append (make-isorhythm notes (+ start (car entrances)) current-pitches current-rhythms dynamics (car voices)) (make-prolation-canon (cdr transpositions) (cdr entrances) (cdr prolations) (rotate-left voices) notes start pitches durations dynamics)))))