linux: shared memory interface - link with librt
[supercollider.git] / HelpSource / Tutorials / Mark_Polishook_tutorial / 18_Frequency_modulation.schelp
blob4ba6fe1ba8f3d6e71f3750c594ce881c21b70b08
1 title:: 18_Frequency_modulation
2 summary:: Mark Polishook tutorial
3 categories:: Tutorials>Mark_Polishook_tutorial
4 related:: Tutorials/Mark_Polishook_tutorial/00_Introductory_tutorial
6 section::Carriers and modulators
8 In its simplest form, frequency modulation (FM) synthesis - famous since the Yamaha DX7 of the 1980's - uses one oscillator to modulate the frequency of another. The modulating oscillator in FM synthesis usually runs at the audio rate and its amplitude often is shaped by an envelope or other controller, such as a low frequency oscillator.
10 code::
12 SynthDef("fm1", { arg bus = 0, freq = 440, carPartial = 1, modPartial = 1, index = 3, mul = 0.05;
14         // index values usually are between 0 and 24
15         // carPartial :: modPartial => car/mod ratio
17         var mod;
18         var car;
20         mod = SinOsc.ar(
21                 freq * modPartial,
22                 0,
23                 freq * index * LFNoise1.kr(5.reciprocal).abs
24         );
26         car = SinOsc.ar(
27                 (freq * carPartial) + mod,
28                 0,
29                 mul
30         );
32         Out.ar(
33                 bus,
34                 car
35         )
36 }).add;
40 Synth("fm1", [\bus, 0, \freq, 440, \carPartial, 1, \modPartial, 2.4]);
41 Synth("fm1", [\bus, 1, \freq, 442, \carPartial, 1, \modPartial, 2.401]);
45 s.queryAllNodes;
49 section::FM synthesis and reverb
51 code::
52 // ... a reverb adapted from the "01 Why SuperCollider document" in the SC2 distribution
54 SynthDef("preDelay", { arg inbus = 2;
55         ReplaceOut.ar(
56                 4,
57                 DelayN.ar(In.ar(inbus, 1), 0.048, 0.048)
58         )
59 }).add;
61 SynthDef("combs", {
62         ReplaceOut.ar(
63                 6,
64                 Mix.arFill(7, { CombL.ar(In.ar(4, 1), 0.1, LFNoise1.kr(Rand(0, 0.1), 0.04, 0.05), 15) })
65         )
66 }).add;
68 SynthDef("allpass", { arg gain = 0.2;
69         var source;
70         source = In.ar(6, 1);
71         4.do({ source = AllpassN.ar(source, 0.050, [Rand(0, 0.05), Rand(0, 0.05)], 1) });
72         ReplaceOut.ar(
73                 8,
74                 source * gain
75         )
76 }).add;
78 SynthDef("theMixer", { arg gain = 1;
79         ReplaceOut.ar(
80                 0,
81                 Mix.ar([In.ar(2, 1), In.ar(8, 2)]) * gain
82         )
83 }).add;
87 Synth("fm1", [\bus, 2, \freq, 440, \carPartial, 1, \modPartial, 1.99, \mul, 0.071]);
88 Synth("fm1", [\bus, 2, \freq, 442, \carPartial, 1, \modPartial, 2.401, \mul, 0.071]);
89 Synth.tail(s, "preDelay");
90 Synth.tail(s, "combs");
91 Synth.tail(s, "allpass");
92 Synth.tail(s, "theMixer", [\gain, 0.64]);
96 s.queryAllNodes;
100 section::Components
102 Dividing the "fm" synth def into two pieces, a synthdef for a modulator and a synthdef for the carrier, gives more functionality - carrier signals can shaped by two or more modulators.
104 code::
106 SynthDef("carrier", { arg inbus = 2, outbus = 0, freq = 440, carPartial = 1, index = 3, mul = 0.2;
108         // index values usually are between 0 and 24
109         // carPartial :: modPartial => car/mod ratio
111         var mod;
112         var car;
114         mod = In.ar(inbus, 1);
116         Out.ar(
117                 outbus,
118                 SinOsc.ar((freq * carPartial) + mod, 0, mul);
119         )
120 }).add;
122 SynthDef("modulator", { arg outbus = 2, freq, modPartial = 1, index = 3;
123         Out.ar(
124                 outbus,
125                 SinOsc.ar(freq * modPartial, 0, freq)
126                 *
127                 LFNoise1.kr(Rand(3, 6).reciprocal).abs
128                 *
129                 index
130         )
131 }).add;
135 var freq = 440;
136 // modulators for the left channel
137 Synth.head(s, "modulator", [\outbus, 2, \freq, freq, \modPartial, 0.649, \index, 2]);
138 Synth.head(s, "modulator", [\outbus, 2, \freq, freq, \modPartial, 1.683, \index, 2.31]);
140 // modulators for the right channel
141 Synth.head(s, "modulator", [\outbus, 4, \freq, freq, \modPartial, 0.729, \index, 1.43]);
142 Synth.head(s, "modulator", [\outbus, 4, \freq, freq, \modPartial, 2.19, \index, 1.76]);
144 // left and right channel carriers
145 Synth.tail(s, "carrier", [\inbus, 2, \outbus, 0, \freq, freq, \carPartial, 1]);
146 Synth.tail(s, "carrier", [\inbus, 4, \outbus, 1, \freq, freq, \carPartial, 0.97]);
150 s.queryAllNodes;
154 section::Reverberation and frequency modulation
156 code::
158 var freq;
159 // generate a random base frequency for the carriers and the modulators
160 freq = 330.0.rrand(500);
162 // modulators for the left channel
163 Synth.head(s, "modulator", [\outbus, 60, \freq, freq, \modPartial, 0.649, \index, 2]);
164 Synth.head(s, "modulator", [\outbus, 60, \freq, freq, \modPartial, 1.683, \index, 2.31]);
166 // modulators for the right channel
167 Synth.head(s, "modulator", [\outbus, 62, \freq, freq, \modPartial, 1.11, \index, 1.43]);
168 Synth.head(s, "modulator", [\outbus, 62, \freq, freq, \modPartial, 0.729, \index, 1.76]);
170 // left and right channel carriers
171 Synth.tail(s, "carrier", [\inbus, 60, \outbus, 100, \freq, freq, \carPartial, 1]);
172 Synth.tail(s, "carrier", [\inbus, 62, \outbus, 100, \freq, freq+1, \carPartial, 2.91]);
174 Synth.tail(s, "preDelay", [\inbus, 100]);
175 Synth.tail(s, "combs");
176 Synth.tail(s, "allpass");
177 Synth.tail(s, "theMixer", [\gain, 0.2]);
181 s.queryAllNodes;
185 ////////////////////////////////////////////////////////////////////////////////////////////////////
187 go to link::Tutorials/Mark_Polishook_tutorial/19_Scheduling::