(define (collect-randoms number-randoms) (if (= 0 number-randoms) nil (cons (random 1.0) (collect-randoms (- number-randoms 1))))) (define (linear) (let ((first-random (random 1.0)) (second-random (random 1.0))) (if (< first-random second-random) first-random second-random))) (define (triangular) (let ((first-random (random 1.0)) (second-random (random 1.0))) (* 0.5 (+ first-random second-random)))) (define pitch-gamut (list 0 3 6 8)) (define register-gamut (list 60 84 96 108)) (define onset-gamut (list 0.77 1.34 3.17 5.17 9.12)) (define duration-gamut (list 0.35 0.89 2.3 3.4)) (define amplitude-gamut (list 0.2 0.3 0.35)) (define (choose-from-gamut gamut) (nth (random (length gamut)) gamut)) (define (generate-chord number-pitches pitches registers start dur amp) (if (<= number-pitches 0) nil (cons (new midi :time start :keynum (+ (choose-from-gamut pitches) (choose-from-gamut registers)) :amplitude amp :duration dur) (generate-chord (- number-pitches 1) pitches registers start dur amp)))) (define (gamut-chords number-chords pitches registers onsets durations amplitudes start-time) (let* ((onset-time (choose-from-gamut onsets)) (next-onset (+ start-time onset-time))) (if (<= number-chords 0) nil (append (generate-chord 3 pitches registers onset-time (choose-from-gamut durations) (choose-from-gamut amplitudes)) (gamut-chords (- number-chords 1) pitches registers onsets durations amplitudes next-onset))))) (events (append (gamut-chords 20 pitch-gamut register-gamut onset-gamut duration-gamut amplitude-gamut 0.0) (gamut-chords 20 pitch-gamut register-gamut onset-gamut duration-gamut amplitude-gamut 0.0) (gamut-chords 20 pitch-gamut register-gamut onset-gamut duration-gamut amplitude-gamut 0.0)) "test.mid")