SCDoc: Use proper static string constants instead of comparing string literals.
[supercollider.git] / examples / demonstrations / DrumSynths.scd
blob75acccf3d8fa95d2c4e0f1510454f55c833f3190
2 // SOS Drums by Renick Bell, renick_at_gmail.com
3 // recipes from Gordon Reid in his Sound on Sound articles
6 // SOSdrums
9 // SOSkick -------
10 // http://www.soundonsound.com/sos/jan02/articles/synthsecrets0102.asp
11 // increase mod_freq and mod_index for interesting electronic percussion
13 SynthDef(\SOSkick,
14         { arg out = 0, freq = 50, mod_freq = 5, mod_index = 5, sustain = 0.4, amp = 0.8, beater_noise_level = 0.025;
15         var pitch_contour, drum_osc, drum_lpf, drum_env;
16         var beater_source, beater_hpf, beater_lpf, lpf_cutoff_contour, beater_env;
17         var kick_mix;
18         pitch_contour = Line.kr(freq*2, freq, 0.02);
19         drum_osc = PMOsc.ar(    pitch_contour,
20                                 mod_freq,
21                                 mod_index/1.3,
22                                 mul: 1,
23                                 add: 0);
24         drum_lpf = LPF.ar(in: drum_osc, freq: 1000, mul: 1, add: 0);
25         drum_env = drum_lpf * EnvGen.ar(Env.perc(0.005, sustain), 1.0, doneAction: 2);
26         beater_source = WhiteNoise.ar(beater_noise_level);
27         beater_hpf = HPF.ar(in: beater_source, freq: 500, mul: 1, add: 0);
28         lpf_cutoff_contour = Line.kr(6000, 500, 0.03);
29         beater_lpf = LPF.ar(in: beater_hpf, freq: lpf_cutoff_contour, mul: 1, add: 0);
30         beater_env = beater_lpf * EnvGen.ar(Env.perc, 1.0, doneAction: 2);
31         kick_mix = Mix.new([drum_env, beater_env]) * 2 * amp;
32         Out.ar(out, [kick_mix, kick_mix])
33         }
34         ).add
36 Synth(\SOSkick)
40 // SOSsnare -------
41 // http://www.soundonsound.com/sos/Mar02/articles/synthsecrets0302.asp
44 SynthDef(\SOSsnare,
45         {arg out = 0, sustain = 0.1, drum_mode_level = 0.25,
46         snare_level = 40, snare_tightness = 1000,
47         freq = 405, amp = 0.8;
48         var drum_mode_sin_1, drum_mode_sin_2, drum_mode_pmosc, drum_mode_mix, drum_mode_env;
49         var snare_noise, snare_brf_1, snare_brf_2, snare_brf_3, snare_brf_4, snare_reson;
50         var snare_env;
51         var snare_drum_mix;
53         drum_mode_env = EnvGen.ar(Env.perc(0.005, sustain), 1.0, doneAction: 2);
54         drum_mode_sin_1 = SinOsc.ar(freq*0.53, 0, drum_mode_env * 0.5);
55         drum_mode_sin_2 = SinOsc.ar(freq, 0, drum_mode_env * 0.5);
56         drum_mode_pmosc = PMOsc.ar(     Saw.ar(freq*0.85),
57                                         184,
58                                         0.5/1.3,
59                                         mul: drum_mode_env*5,
60                                         add: 0);
61         drum_mode_mix = Mix.new([drum_mode_sin_1, drum_mode_sin_2, drum_mode_pmosc]) * drum_mode_level;
63 // choose either noise source below
64 //      snare_noise = Crackle.ar(2.01, 1);
65         snare_noise = LFNoise0.ar(20000, 0.1);
66         snare_env = EnvGen.ar(Env.perc(0.005, sustain), 1.0, doneAction: 2);
67         snare_brf_1 = BRF.ar(in: snare_noise, freq: 8000, mul: 0.5, rq: 0.1);
68         snare_brf_2 = BRF.ar(in: snare_brf_1, freq: 5000, mul: 0.5, rq: 0.1);
69         snare_brf_3 = BRF.ar(in: snare_brf_2, freq: 3600, mul: 0.5, rq: 0.1);
70         snare_brf_4 = BRF.ar(in: snare_brf_3, freq: 2000, mul: snare_env, rq: 0.0001);
71         snare_reson = Resonz.ar(snare_brf_4, snare_tightness, mul: snare_level) ;
72         snare_drum_mix = Mix.new([drum_mode_mix, snare_reson]) * 5 * amp;
73         Out.ar(out, [snare_drum_mix, snare_drum_mix])
74         }
75 ).add
77 Synth(\SOSsnare)
81 // SOShats -------
82 // http://www.soundonsound.com/sos/Jun02/articles/synthsecrets0602.asp
85 SynthDef(\SOShats,
86         {arg out = 0, freq = 6000, sustain = 0.1, amp = 0.8;
87         var root_cymbal, root_cymbal_square, root_cymbal_pmosc;
88         var initial_bpf_contour, initial_bpf, initial_env;
89         var body_hpf, body_env;
90         var cymbal_mix;
91         
92         root_cymbal_square = Pulse.ar(freq, 0.5, mul: 1);
93         root_cymbal_pmosc = PMOsc.ar(root_cymbal_square,
94                                         [freq*1.34, freq*2.405, freq*3.09, freq*1.309],
95                                         [310/1.3, 26/0.5, 11/3.4, 0.72772],
96                                         mul: 1,
97                                         add: 0);
98         root_cymbal = Mix.new(root_cymbal_pmosc);
99         initial_bpf_contour = Line.kr(15000, 9000, 0.1);
100         initial_env = EnvGen.ar(Env.perc(0.005, 0.1), 1.0);
101         initial_bpf = BPF.ar(root_cymbal, initial_bpf_contour, mul:initial_env);
102         body_env = EnvGen.ar(Env.perc(0.005, sustain, 1, -2), 1.0, doneAction: 2);
103         body_hpf = HPF.ar(in: root_cymbal, freq: Line.kr(9000, 12000, sustain),mul: body_env, add: 0);
104         cymbal_mix = Mix.new([initial_bpf, body_hpf]) * amp;
105         Out.ar(out, [cymbal_mix, cymbal_mix])
106         }).add
109 Synth(\SOShats)
113 // SOStom -------
114 // http://www.soundonsound.com/sos/Mar02/articles/synthsecrets0302.asp
117 SynthDef(\SOStom,
118         {arg out = 0, sustain = 0.4, drum_mode_level = 0.25,
119         freq = 90, drum_timbre = 1.0, amp = 0.8;
120         var drum_mode_sin_1, drum_mode_sin_2, drum_mode_pmosc, drum_mode_mix, drum_mode_env;
121         var stick_noise, stick_env;
122         var drum_reson, tom_mix;
124         drum_mode_env = EnvGen.ar(Env.perc(0.005, sustain), 1.0, doneAction: 2);
125         drum_mode_sin_1 = SinOsc.ar(freq*0.8, 0, drum_mode_env * 0.5);
126         drum_mode_sin_2 = SinOsc.ar(freq, 0, drum_mode_env * 0.5);
127         drum_mode_pmosc = PMOsc.ar(     Saw.ar(freq*0.9),
128                                                                 freq*0.85,
129                                                                 drum_timbre/1.3,
130                                                                 mul: drum_mode_env*5,
131                                                                 add: 0);
132         drum_mode_mix = Mix.new([drum_mode_sin_1, drum_mode_sin_2, drum_mode_pmosc]) * drum_mode_level;
133         stick_noise = Crackle.ar(2.01, 1);
134         stick_env = EnvGen.ar(Env.perc(0.005, 0.01), 1.0) * 3;
135         tom_mix = Mix.new([drum_mode_mix, stick_env]) * 2 * amp;
136         Out.ar(out, [tom_mix, tom_mix])
137         }
138 ).add
141 Synth(\SOStom)