Merge pull request #506 from andrewcsmith/patch-2
[supercollider.git] / HelpSource / Classes / GrainFM.schelp
blob2f64902158b9d9f890ff0c7b93ad39d9a95ebdc9
1 class:: GrainFM
2 summary:: Granular synthesis with frequency modulated sine tones
3 categories:: UGens>Generators>Granular
4 related:: Classes/GrainIn, Classes/GrainSin, Classes/GrainBuf
6 classmethods::
7 private:: categories
9 method:: ar
11 argument:: numChannels
12 the number of channels to output. If 1, mono is returned and pan is ignored.
14 argument:: trigger
15 a kr or ar trigger to start a new grain. If ar, grains after the start of the synth are sample accurate.
17 argument:: dur
18 size of the grain (in seconds).
20 argument:: carfreq
21 the carrier freq of the grain generators internal oscillator
23 argument:: modfreq
24 the modulating freq of the grain generators internal oscillator
26 argument:: index
27 the index of modulation
29 argument:: pan
30 determines where to pan the output.
31 list::
32 ## If numChannels = 1, no panning is done.
33 ## If numChannels = 2, panning is similar to Pan2.
34 ## If numChannels > 2, pannins is the same as PanAz.
37 argument:: envbufnum
38 the buffer number containing a singal to use for the grain envelope. -1 uses a built-in Hann envelope.
40 argument:: maxGrains
41 the maximum number of overlapping grains that can be used at a given time. This value is set at the UGens init time and can't be modified. Defaults to 512. This can be set lower for more efficient use of memory.
43 warning:: The above parameter is new (post SC 3.3.1) and has the potential to break code written <= 3.3.1. This parameter is BEFORE the mul slot, and you may need to update code to account for this difference. ::
45 argument:: mul
47 argument:: add
49 discussion:: All args except numChannels and trigger are polled at grain creation time.
50 instancemethods::
51 private:: init, argNamesInputsOffset
53 examples::
54 code::
55 s.boot;
58 var winenv;
59 // a custom envelope
60 winenv = Env([0, 1, 0], [0.5, 0.5], [8, -8]);
61 z = Buffer.sendCollection(s, winenv.discretize, 1);
63 SynthDef(\fm_grain_test, {arg gate = 1, amp = 1, envbuf;
64         var pan, env, freqdev;
65         // use mouse x to control panning
66         pan = MouseX.kr(-1, 1);
67         // use WhiteNoise and mouse y to control deviation from center pitch
68         freqdev = WhiteNoise.kr(MouseY.kr(0, 400));
69         env = EnvGen.kr(
70                 Env([0, 1, 0], [1, 1], \sin, 1),
71                 gate,
72                 levelScale: amp,
73                 doneAction: 2);
74         Out.ar(0,
75                 GrainFM.ar(2, Impulse.kr(10), 0.1, 440 + freqdev, 200, LFNoise1.kr.range(1, 10),
76                         pan, envbuf) * env)
77         }).send(s);
81 // use built-in env
82 x = Synth(\fm_grain_test, [\envbuf, -1])
84 // switch to the custom env
85 x.set(\envbuf, z)
86 x.set(\envbuf, -1);
88 x.set(\gate, 0);