;;; ********************************************************************** ;;; $Name: $ ;;; $Revision: 1.1.1.1 $ ;;; $Date: 2003/06/25 10:45:05 $ (in-package :cm) (define (piano-phase trope pulse amp stay move) (let* ((len (length trope)) (dur (- (* pulse 2) .01)) (stop (* len len (+ stay move)))) ;; stop is the number of notes to play. set to the ;; number notes in the trope times the number of times ;; the shifting happens to get back the first note ;; (also the length of the trope) times the number of ;; cycles of the trope perfomer 2 stays steady plus ;; the number of cycles the performer takes to move the ;; pattern ahead one sixteenth. ;; return two processes. the first keeps a regular beat ;; while the second plays the trope steadily for STAY ;; repetitions then moves one 16th ahead over MOVE ;; repetitions of the trope. (list (process with play = (new cycle :keynums trope) repeat stop output (new fm-violin :startime (now) :dur dur :frequency (hertz (next play)) :amplitude amp) wait pulse) ;; phasing tempo is represented as a ratio P/N where P is ;; the time the phasing takes (counted in pulses) and N is ;; the number of notes to play in that time. so 16/16 means ;; play 16 notes in the time of 16 pulses and 15/16 means ;; to play 16 notes in the time of 15 pulses. for piano ;; phase N is the length of the trope and P is one less. (process with play = (new cycle :keynums trope) and tempo = (new cycle :of (list (new cycle :of 1 :for (* len stay)) (new cycle :of (/ (1- (* len move)) (* len move)) :for (* len move)))) repeat stop output (new fm-violin :startime (now) :dur dur :frequency (hertz (next play)) :amplitude amp) wait (* pulse (next tempo)))))) (define pnotes '(e4 fs b cs5 d fs4 e cs5 b4 fs d5 cs)) (events (piano-phase pnotes .15 .05 5 3) "test.snd" :srate 44100)