scide: implement selectionLength for openDocument
[supercollider.git] / HelpSource / Classes / StereoConvolution2L.schelp
blob7248e065178e1a0c0b550cd150a6f024aeb0f54e
1 class:: StereoConvolution2L
2 summary:: Stereo real-time convolver with linear interpolation
3 categories:: UGens>FFT, UGens>Convolution
4 related:: Classes/Convolution, Classes/Convolution2L
6 description::
7 Strict convolution with fixed kernel which can be updated using a trigger signal. There is a linear crossfade between the buffers upon change.
9 Like link::Classes/Convolution2L::, but convolves with two buffers and outputs a stereo signal. This saves one FFT transformation per period, as compared to using two copies of link::Classes/Convolution2L::.
11 Useful applications could include stereo reverberation or HRTF convolution.
13 See Steven W Smith, The Scientist and Engineer's Guide to Digital Signal Processing: chapter 18: http:// www.dspguide.com/ch18.htm
15 classmethods::
16 method:: ar
18 argument:: in
19 processing target.
20 argument:: kernelL
21 buffer index for the fixed kernel of the left channel, may be modulated in combination with the trigger.
22 argument:: kernelR
23 buffer index for the fixed kernel of the right channel, may be modulated in combination with the trigger.
24 argument:: trigger
25 update the kernel on a change from <= 0 to > 0.
26 argument:: framesize
27 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.
28 argument:: crossfade
29 The number of periods over which a crossfade is made. The default is 1. This must be an integer.
30 argument:: mul
31 argument:: add
33 examples::
34 code::
35 (//allocate three buffers
36 b = Buffer.alloc(s, 2048);
37 c = Buffer.alloc(s, 2048);
38 d = Buffer.alloc(s, 2048);
40 b.zero;
41 c.zero;
42 d.zero;
46 50.do({ |it| c.set(20 * it + 10, 1.0.rand); });
47 3.do({ |it| b.set(400 * it + 100, 1); });
48 20.do({ |it| d.set(40 * it + 20, 1); });
53 SynthDef(\conv_test, { arg kernel1, kernel2, t_trig = 0;
54         var input;
56         input = Impulse.ar(1);
58         // must have power of two framesize
59         Out.ar(0, StereoConvolution2L.ar(input, kernel1, kernel2, t_trig, 2048, 1, 0.5));
60 }).add
65 x = Synth(\conv_test, [\kernel1, b, \kernel2, c]);
67 // changing the buffer number:
68 x.set(\kernel1,d);
69 x.set(\t_trig,1); // after this trigger, the change will take effect.
70 x.set(\kernel2,d);
71 x.set(\t_trig,1); // after this trigger, the change will take effect.
73 d.zero;
74 40.do({ |it| d.set(20 * it + 10, 1); });// changing the buffers' contents
75 x.set(\t_trig, 1); // after this trigger, the change will take effect.
77 x.set(\kernel1, b);
78 x.set(\t_trig, 1); // after this trigger, the change will take effect.
80 x.free;