#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