#lang scribble/manual
@(require (for-label racket))

@title{(convolution in kernel framesize)}


Strict convolution of two continuously changing inputs. Also see
[convolution2] for a cheaper CPU cost alternative for the case of a
fixed kernel which can be changed with a trigger message.

in        - processing target
kernel    - processing kernel.
framesize - size of fft frame, must be a power of two


@racketblock[
(audition
 (let ((input (sound-in (mce2 0 1)))
       (kernel (white-noise ar)))
   (out 0 (mul (convolution input kernel 2048) 0.1))))
]


@racketblock[
(let ((a 2048)
      (b 0))
  (with-sc3
   (lambda (fd)
     (async fd (b-alloc b a 1))
     (send fd (b-set1 b 0 1.0))
     (replicate-m 100 (send fd (b-set1 b (random-integer a) (random 0.0 1.0))))
     (play fd (out 0 (mul (convolution 
			   (sound-in (mce2 0 1)) 
			   (play-buf 1 b (buf-rate-scale kr b) 1 0 1)
			   (* 2 a))
			  0.2))))))
]


