aboutsummaryrefslogtreecommitdiff
path: root/site/udo/synth_drums.udo
blob: 3d2ea102b8e1945e1a6da900f0bfe04e7b467019 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
#ifndef UDO_SYNTHDRUMS
#define UDO_SYNTHDRUMS ##
/*
	Synth drum generators
	
	This file is part of the SONICS UDO collection by Richard Knight 2021
		License: GPL-2.0-or-later
		http://1bpm.net
*/

#include "wavetables.udo"

opcode kick909, a, 0
	idur = p3
	ifreq = 200
	idct = .0001
	aampenv	expseg	1, .08, .3, .4, .001
	adclick	expseg .001, idct, 1, idur-(idct*2), 1, idct, .001
	aosc1 oscil 1, ifreq*aampenv
	xout aosc1*aampenv*adclick
endop


/*
	Clap derived from an instrument by Istvan Varga (2002)
*/
opcode clap1, a, jj
	idec, ifreq xin
	ibpfrq = (ifreq == -1) ? 1046.5 : ifreq
	kbpbwd port ibpfrq*0.25, 0.03, ibpfrq*4.0  ;bandpass filter bandwidth
	idec = (idec == -1) ? 0.5 : idec  ;decay time

	a1 = 1.0
	a1x delay1 a1
	a1 = a1 - a1x
	a2 delay a1, 0.011
	a3 delay a1, 0.023
	a4 delay a1, 0.031

	a1 tone a1, 60.0
	a2 tone a2, 60.0
	a3 tone a3, 60.0
	a4 tone a4, 1.0 / idec

	aenv1 = a1 + a2 + a3 + a4*60.0*idec
	aout unirand 2.0
	aout = aenv1 * (aout - 1.0)
	aout butterbp aout, ibpfrq, kbpbwd
	xout aout * 120
endop


/*
	Rim shot derived from an instrument by Istvan Varga (2002)
*/
opcode rim1, a, 0
	icps = 440.0*exp(log(2.0)*(57.0-69.0)/12.0)
	acps expon icps, 0.0025, icps * 0.5
	acps = acps + icps
	iamp = 1
	a1a phasor acps, 0.0	
	a1b phasor acps, 0.5
	afmenv expon 1.0, 0.02, 0.5
	a1 = (a1a-a1b)*6.0*afmenv
	acps = acps*(1.0+a1)
	a0 oscil3 1.0, acps
	a1 unirand 2.0
	a1 tone a1-1.0, 2000
	a0 = a0 + a1*0.1
	aenv expon 1.0, 0.005, 0.5

	a0 limit 4.0*iamp*a0*aenv, -1.0, 1.0
	a0 table3 a0*4096.0, gifnSine, 0, 0, 1

	kffrq expseg 20000, 0.07, 100, 1, 100

	a0x tone a0, 4000
	a0y = a0 - a0x
	a0x delay a0y, 0.0002
	a0 = a0 - a0x*4.0
	a0 pareq a0, kffrq, 0, 0.7071, 2

	a_ linseg 1, p3-0.1, 1, 0.025, 0, 1, 0
	a0 = a0*a_

	xout a0
endop


/*
	Snare derived from an instrument by Istvan Varga (2002)
*/
opcode snare1, a, 0
	icps0 = 150
	icps1 = 2.0 * icps0
	kcps port icps0, 0.007, icps1
	kcpsx = kcps * 1
	kfmd port 0.0, 0.01, 0.7
	aenv1 expon 1.0, 0.03, 0.5
	kenv2 port 1.0, 0.008, 0.0
	aenv2 interp kenv2
	aenv3 expon 1.0, 0.025, 0.5

	a_ oscili 1.0, kcps, gifnSine
	a1 oscili 1.0, kcps * (1.0 + a_*kfmd), gifnSine
	a_ oscili 1.0, kcpsx, gifnSine
	a2 oscili 1.0, kcpsx * (1.0 + a_*kfmd), gifnSine

	a3 unirand 2.0
	a3 =  a3 - 1.0
	a3 butterbp a3, 5000, 7500
	a3 = a3 * aenv2

	a0 = a1 + a2*aenv3 + a3*1.0
	a0 = a0 * aenv1
	xout a0
endop


/*
	RK kick1
*/
opcode kick1, a, 0
	/* p3 should be between 0.1 and 0.3 really */
	kax linseg 500, p3*0.05, 200, p3*0.1, 40, p3*0.8, 20
	kenv linseg 1,p3*0.2,0.6,p3*0.2,0.4,p3*0.2,0.1,p3*0.2,0
	kpit linseg 300, p3*0.2, 200, p3*0.4, 80, p3*0.2, 50, p3*0.2, 30
	a1 oscil 0.6, kax*1
	a2 oscil 0.85,kpit*0.4
	a3 oscil 0.95,kpit*0.2
	an noise 0.3,-0.1
	ax1 oscil 0.05, 200
	ax2 oscil 0.02, 900
	kaxenv linseg 0.2, p3*0.02, 0
	akx = (ax1*ax2)*kaxenv
	aout = (a1+a2+a3)*0.25
	amix = ((aout*kenv)+akx)
	adist distort amix, 0.3, gifnSine
	aeq1 pareq adist, 90, 0, 1.4
	aeq2 pareq aeq1, 60, 1.8, 0.9
	aout pareq aeq2, 9000, 2.8, 0.5
	xout aout
endop


/*
	RK kick2, a bit 808 ish unless harsh mode is on
*/
opcode kick2, a, oo
	iharsh, itune xin
	if (iharsh == 1) then
		idist = 0.5
		idistwave = gifnSquare
	else
		idist = 0.1
		idistwave = gifnSine
	endif
	xtratim 0.1
	krelease release
	ktune init itune
	kmul transeg 0.2, p3*0.5, -15, 0.01, p3*0.5, 0, 0
	kbend transeg 0.5, 1.2, -4, 0, 1, 0, 0
	asig gbuzz 0.5, 50*octave(ktune)*semitone(kbend), 20, 1, kmul, gifnCosine
	aenv transeg 1, p3-0.004, -6, 0
	gkpump = k(aenv)
	aatt linseg 0, 0.004, 1
	asig = asig*aenv*aatt
	aenv linseg 1, 0.07, 0
	acps expsega 400, 0.07, 0.001, 1, 0.001
	aimp oscili aenv, acps*octave(ktune*0.25)
	amix = ((asig*0.7)+(aimp*0.35))
	gkpump = min(rms(amix) * 7, 1)
	aout1 pareq amix, 100, 0.01, 0.7
	aout1 distort aout1, idist, idistwave
	aout1 pareq aout1, 50, 2, 0.4
	aout1 pareq aout1, 190, 0.7, 0.6
	aout1 pareq aout1, 4900, 2, 0.7
	aout1 pareq aout1, 8900, 2, 0.7
	xout aout1
endop



opcode hihat1, a, 0
	idel = random(0.001, 0.02)
	xtratim idel
	kfreq line 300, p3, 100
	aenv expsega .1, .0005, 1, p3 - .0005, .01
	asqr1 oscil 1, kfreq, gifnSquare, -1
	asqr2 oscil 1, kfreq*1.4471, gifnSaw, -1
	asqr3 oscil 1, kfreq*1.6170, gifnSaw, -1
	asqr4 oscil 1, kfreq*1.9265, gifnSaw, -1
	asqr5 oscil 1, kfreq*2.5028, gifnSaw, -1
	asqr6 oscil 1, kfreq*2.6637, gifnSaw, -1
	a808 sum asqr1, asqr2, asqr3, asqr4, asqr5, asqr6
	a808 butterhp a808, 4270
	a808 butterhp a808, 4270
	aout = a808 * aenv * 0.5
	aout delay aout, idel
	xout aout
endop



opcode hihat2, aa, 0
	idel1 = random(0.005, 0.02)
	idel2 = random(0.005, 0.02)
	xtratim(max(idel1, idel2))

	kfreq line 800, p3, 300
	aenv expsega .1, .0005, 1, p3 - .0005, .01
	asqr1 oscil 1, kfreq, gifnSquare, -1
	asqr2 oscil 1, kfreq*1.4471, gifnSquare, -1
	asqr3 oscil 1, kfreq*1.6170, gifnSquare, -1
	asqr4 oscil 1, kfreq*1.9265, gifnSquare, -1
	asqr5 oscil 1, kfreq*2.5028, gifnSaw, -1
	asqr6 oscil 1, kfreq*2.6637, gifnSaw, -1
	a808 sum asqr1, asqr2, asqr3, asqr4, asqr5, asqr6
	a808 butterhp a808, 3270
	a808 butterhp a808, 3270
	aout = a808 * aenv * 0.5
	aL delay aout, idel1
	aR delay aout, idel2
	xout aL, aR
endop


#end