class:: GrainFM summary:: Granular synthesis with frequency modulated sine tones categories:: UGens>Generators>Granular related:: Classes/GrainIn, Classes/GrainSin, Classes/GrainBuf classmethods:: private:: categories method:: ar argument:: numChannels the number of channels to output. If 1, mono is returned and pan is ignored. argument:: trigger a kr or ar trigger to start a new grain. If ar, grains after the start of the synth are sample accurate. argument:: dur size of the grain (in seconds). argument:: carfreq the carrier freq of the grain generators internal oscillator argument:: modfreq the modulating freq of the grain generators internal oscillator argument:: index the index of modulation argument:: pan determines where to pan the output. list:: ## If numChannels = 1, no panning is done. ## If numChannels = 2, panning is similar to Pan2. ## If numChannels > 2, pannins is the same as PanAz. :: argument:: envbufnum the buffer number containing a signal to use for the grain envelope. -1 uses a built-in Hann envelope. argument:: maxGrains 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. 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. :: argument:: mul argument:: add discussion:: All args except numChannels and trigger are polled at grain creation time. instancemethods:: private:: init, argNamesInputsOffset examples:: code:: s.boot; ( var winenv; // a custom envelope winenv = Env([0, 1, 0], [0.5, 0.5], [8, -8]); z = Buffer.sendCollection(s, winenv.discretize, 1); SynthDef(\fm_grain_test, {arg gate = 1, amp = 1, envbuf; var pan, env, freqdev; // use mouse x to control panning pan = MouseX.kr(-1, 1); // use WhiteNoise and mouse y to control deviation from center pitch freqdev = WhiteNoise.kr(MouseY.kr(0, 400)); env = EnvGen.kr( Env([0, 1, 0], [1, 1], \sin, 1), gate, levelScale: amp, doneAction: Done.freeSelf); Out.ar(0, GrainFM.ar(2, Impulse.kr(10), 0.1, 440 + freqdev, 200, LFNoise1.kr.range(1, 10), pan, envbuf) * env) }).add; ) // use built-in env x = Synth(\fm_grain_test, [\envbuf, -1]) // switch to the custom env x.set(\envbuf, z) x.set(\envbuf, -1); x.set(\gate, 0); ::