rsc3/doc/examples/ugen/fft/convolution2.help.scm

81 lines
1.9 KiB
Scheme

;; (convolution2 in bufnum trigger framesize)
#|
Strict convolution with fixed kernel which can be updated using a
trigger signal.
in - processing target
bufnum - buffer index for the fixed kernel, may be modulated in
combination with the trigger
trigger - update the kernel on a change from <=0 to >0
framesize - size of fft frame, must be a power of two. convolution
uses twice this number internally, maximum value you
can give this argument is 2^16=65536. Note that it gets
progressively more expensive to run for higher powers!
512, 1024, 2048, 4096 standard.
|#
(with-sc3
(lambda (fd)
(for-each
(lambda (b)
(async fd (b-alloc b 2048 1)))
(list 10 11 12))
(for-each
(lambda (n)
(send fd (b-set1 10 (+ (* 400 n) 100) 1)))
(enum-from-to 0 2))
(for-each
(lambda (n)
(send fd (b-set1 11 (+ (* 20 n) 10) (random 0 1))))
(enum-from-to 0 49))
(for-each
(lambda (n)
(send fd (b-set1 12 (+ (* 40 n) 20) 1)))
(enum-from-to 0 19))
(send-synth
fd "c"
(letc ((k 0) (t 0))
(let ((i (impulse ar 1 0)))
(out 0 (mul (convolution2 i k t 2048) 0.5)))))))
(define send-to
(lambda (m)
(with-sc3
(lambda (fd)
(send fd m)))))
(define async-to
(lambda (m)
(with-sc3
(lambda (fd)
(async fd m)))))
(send-to (s-new1 "c" 1001 1 1 "k" 10))
(send-to (n-set1 1001 "k" 11))
(send-to (n-set1 1001 "t" 0))
(send-to (n-set1 1001 "t" 1))
(send-to (n-set1 1001 "k" 12))
(send-to (n-set1 1001 "t" 0))
(send-to (n-set1 1001 "t" 1))
(async-to (b-zero 12))
(for-each
(lambda (n)
(send-to (b-set1 12 (+ (* 20 n) 10) 1)))
(enum-from-to 0 39))
(send-to (n-set1 1001 "t" 0))
(send-to (n-set1 1001 "t" 1))
;; With soundfile.
(async-to (b-alloc-read 10 "/home/rohan/audio/metal.wav" 0 0))
(let ((i (sound-in 0)))
(audition (out 0 (mul (convolution2 i 10 0 512) 0.5))))