48 lines
1.2 KiB
Scheme
48 lines
1.2 KiB
Scheme
;; shepard tones (alberto de campo)
|
|
|
|
(import (rnrs) (sosc) (rsc3) (rhs))
|
|
|
|
(define iota
|
|
(lambda (n l j)
|
|
(if (= n 0)
|
|
nil
|
|
(cons l (iota (- n 1) (+ l j) j)))))
|
|
|
|
(define indxs
|
|
(lambda (n l r)
|
|
(iota n l (/ (- r l) n))))
|
|
|
|
(define hanning-window
|
|
(lambda (n)
|
|
(let* ((lp (* pi -0.5))
|
|
(rp (+ lp (* 2 pi)))
|
|
(hf (lambda (i) (+ (* (sin i) 0.5) 0.5))))
|
|
(map hf (indxs n lp rp)))))
|
|
|
|
(define square (lambda (x) (* x x)))
|
|
|
|
(define amp-table (map square (hanning-window 1024)))
|
|
|
|
(define amp-f (lambda (i) (* (expt 0.5 i) 20000)))
|
|
|
|
(define freq-table (map amp-f (indxs 1024 0 10)))
|
|
|
|
(define shepard-tones
|
|
(let* ((rate-scale (/ (/ 1024 44100) 10))
|
|
(rate 0.1)
|
|
(ph (phasor ar 0 (* rate rate-scale) 0 1024 0))
|
|
(phases (make-mce
|
|
(map
|
|
(lambda (n) (add (mul3 n 0.1 1024) ph))
|
|
(enum-from-to 0 9))))
|
|
(freqs (buf-rd-c 1 ar 1 phases 1))
|
|
(amps (buf-rd-c 1 ar 2 phases 1)))
|
|
(mul (mix (mul (sin-osc ar freqs 0) amps)) 0.1)))
|
|
|
|
(with-sc3
|
|
(lambda (fd)
|
|
(async fd (b-alloc 1 1024 1))
|
|
(async fd (b-alloc 2 1024 1))
|
|
(send fd (b-setn1 1 0 freq-table))
|
|
(send fd (b-setn1 2 0 amp-table))
|
|
(audition (out 0 shepard-tones))))
|