;;; agn.scm -- Bill Schottstaedt's agn.cl ;;; (see clm-2/clm-example.clm and clm-2/bess5.cl) ;; Translator/Author: Michael Scholz ;; Created: Tue Jun 24 19:05:06 CEST 2003 ;; Changed: Sat Jul 28 00:33:36 CEST 2012 ;; Try (do-agn) (define *clm-c-version* #t) (if (not (provided? 'sndlib)) (let ((hsndlib (dlopen "libsndlib.so"))) (if (string? hsndlib) (snd-error (format #f "script needs the sndlib module: ~A" hsndlib)) (dlinit hsndlib "Init_sndlib")))) (if *clm-c-version* (if (not (provided? 'sndins)) (let ((hsndins (dlopen "libsndins.so"))) (if (string? hsndins) (snd-error (format #f "script needs the sndins module: ~A" hsndins)) (dlinit hsndins "Init_sndins")))) (load "v.scm")) (if (not (provided? 'snd-ws.scm)) (load "ws.scm")) (if (not (provided? 'snd-env.scm)) (load "env.scm")) (define *clm-play* #t) (define *clm-statistics* #t) (define *clm-verbose* #t) (define *clm-srate* 44100) (define *clm-channels* 2) (define *clm-reverb* jc-reverb) (define *clm-reverb-data* '(:volume 0.8)) (define *clm-reverb-channels* 2) (define *clm-delete-reverb* #t) (define (snd-msg frm . args) (snd-print (apply format (append (list #f frm) args)))) (define (main args) (do-agn (if (= 2 (length args)) (cadr args) "agn.clm"))) (define* (do-agn (file "agn.clm")) (let ((sndfile (format #f "~A.snd" "agn"))) (snd-msg ";; Writing ~S~%" file) (agn file) (with-sound (:output sndfile) (snd-msg ";; Loading ~S~%" file) (load file)))) (define lim 256) (define time 60) (define mode (list->vector '(0 0 2 4 11 11 5 6 7 0 0 0 0))) (define rats (list->vector '(1.0 256/243 9/8 32/27 81/64 4/3 1024/729 3/2 128/81 27/16 16/9 243/128 2.0))) (define bell '(0 0 10 0.25 90 1.0 100 1.0)) (define octs (make-vector (1+ lim))) (define pits (make-vector (1+ lim))) (define rhys (make-vector (1+ lim))) (define amps (make-vector (1+ lim))) (define (tune x) (let* ((pit (modulo x 12)) (oct (inexact->exact (floor (/ x 12)))) (base (vector-ref rats pit))) (* base (expt 2 oct)))) (define (rbell x) (envelope-interp (* x 100) bell)) (define* (glog r b) (if (<= r 0) (error "r must be > 0")) (if (and b (<= b 0)) (error "b must be > 0")) (if b (/ (log r) (log b)) (log r))) (define (agn file) (let ((wins (list->vector '((0 0 40 0.1 60 0.2 75 0.4 82 1 90 1 100 0) (0 0 60 0.1 80 0.2 90 0.4 95 1 100 0) (0 0 10 1 16 0 32 0.1 50 1 56 0 60 0 90 0.3 100 0) (0 0 30 1 56 0 60 0 90 0.3 100 0) (0 0 50 1 80 0.3 100 0) (0 0 40 0.1 60 0.2 75 0.4 82 1 90 1 100 0) (0 0 40 0.1 60 0.2 75 0.4 82 1 90 1 100 0) (0 0 10 1 32 0.1 50 1 90 0.3 100 0) (0 0 60 0.1 80 0.3 95 1 100 0) (0 0 80 0.1 90 1 100 0))))) (do ((i 0 (1+ i))) ((= i (+ lim 1))) (vector-set! octs i (inexact->exact (floor (+ 4 (* 2 (rbell (random 1.0))))))) (vector-set! pits i (vector-ref mode (inexact->exact (floor (* 12 (random 1.0)))))) (vector-set! rhys i (inexact->exact (floor (+ 4 (* 6 (random 1.0)))))) (vector-set! amps i (inexact->exact (floor (+ 1 (* 8 (rbell (random 1.0)))))))) (call-with-output-file file (lambda (out-port) (format out-port ";; from agn.cl (see clm-2/clm-example.clm and clm-2/bess5.cl)~%") (do ((i 1 (1+ i))) ((> i 3)) (let ((cellbeg 0) (cellsiz 4) (cellctr 0) (whichway 1) (base i) (mi (- i 1)) (winnum 0) (mytempo 0.2) (nextbeg 0.0) (revamt 0.0) (ranamt 0.0) (beg 0.0) (dur 0.0) (freq 0.0) (ampl 0.0) (ind 0.0)) (while (and (< beg time) (< cellctr lim)) (set! beg (+ beg nextbeg)) (set! nextbeg (max 0.25 (* mytempo (+ 0.9 (* 0.2 (random 0.1))) (vector-ref rhys cellctr)))) (set! freq (* (/ 16.352 (expt 2 mi)) (tune (vector-ref pits cellctr)) (expt 2 (vector-ref octs cellctr)))) (set! dur nextbeg) (if (< freq 100) (set! dur (+ dur dur))) (set! ampl (max 0.003 (* (vector-ref amps cellctr) (/ (* 60 base))))) (set! ind (* (random 1.0) 2 base)) (set! cellctr (1+ cellctr)) (set! revamt (* base 0.1)) (set! winnum (inexact->exact (floor (* 10 (- beg (floor beg)))))) (set! ranamt (* 0.00001 (expt (- (glog freq 2.0) 4) 4))) (format out-port " (fm-violin ~F ~F ~F ~F :fm-index ~F :amp-env '~S :reverb-amount ~F :noise-amount ~F)" beg dur freq ampl ind (vector-ref wins winnum) revamt ranamt) (set! cellctr (1+ cellctr)) (if (> cellctr (+ cellsiz cellbeg)) (begin (set! cellbeg (1+ cellbeg)) (if (> (random 1.0) 0.5) (set! cellsiz (+ cellsiz whichway))) (if (and (> cellsiz 16) (> (random 1.0) 0.99)) (begin (set! whichway -2) (if (and (> cellsiz 12) (> (random 1.0) 0.999)) (begin (set! whichway -1) (if (< cellsiz 4) (set! whichway 1)))))) (set! cellbeg (+ cellbeg 3)) (set! cellctr cellbeg)))))) (format out-port "~%~%;; ~A ends here~%" file)))) file) ;; agn.scm ends here