#ifndef UDO_INSTRUMENTS #define UDO_INSTRUMENTS ## /* Debugger - Unfixed Bugs : BUG #7 Sound generators Names should correspond to those used in BID file, prepended with play_ */ #include "wavetables.udo" #include "bussing.udo" #include "oprepare.udo" #include "bid.udo" gi3031index = 1 instr play_3031 iamp = bid_getparameter(p4, p5, 2) inote1 = table(gi3031index, gibid_chordfn, 0, 0, 1) if (gi3031index < 5) then gi3031index += 1 else gi3031index = 1 endif ifilter = random(20, 40) ifrq1 = 440 * exp(log(2) * (ifilter - 69) / 12) ; filter start freq. kamp linseg 1, p3*0.8, 1, p3*0.2, 0 kcps init cpsmidinn(inote1) kffrq port 0, 60/150, ifrq1 ; filter frequency a1 phasor kcps ; oscillator a1 = 1 - 2 * a1 a1x butterbp a1, kffrq, kcps * 1.0 ; filters a1x = a1x * (2 + kffrq / kcps) ; correct amplitude a1 = a1x + a1 * 0.25 ; 0.5 a1 butterlp a1, kffrq a1 = taninv(a1 * 2.5 * iamp) ; distortion ; 2.5 keqf limit kffrq * 4, 10, sr * 0.48 ; EQ frequency a1 pareq a1 * 0.6, keqf, 4.0, 1.0, 2 a1 pareq a1, 50, 1.3, 0.6 a1 pareq a1, 130, 0.6, 0.6 a1 = a1 * kamp * 1.2 aL, aR pan2 a1, random(0.3, 0.7) bus_mix("delay1", aL*0.3, aR*0.3) bus_mix("master", aL, aR) endin gi3032index = 3 instr play_3032 iamp = bid_getparameter(p4, p5, 2) inote1 = table(gi3032index, gibid_chordfn, 0, 0, 1) if (gi3032index < 9) then gi3032index += 1 else gi3032index = 3 endif ifilter = random(20, 40) ifrq1 = 440 * exp(log(2) * (ifilter - 69) / 12) ; filter start freq. kamp linseg 1, p3*0.8, 1, p3*0.2, 0 kcps init cpsmidinn(inote1) kffrq port 0, 60/150, ifrq1 ; filter frequency a1 phasor kcps ; oscillator a1 = 1 - 2 * a1 a1x butterbp a1, kffrq, kcps * 1.0 ; filters a1x = a1x * (2 + kffrq / kcps) ; correct amplitude a1 = a1x + a1 * 0.25 ; 0.5 a1 butterlp a1, kffrq a1 = taninv(a1 * 2.5 * iamp) ; distortion ; 2.5 keqf limit kffrq * 4, 10, sr * 0.48 ; EQ frequency a1 pareq a1 * 0.6, keqf, 4.0, 1.0, 2 a1 pareq a1, 50, 1.3, 0.6 a1 pareq a1, 130, 0.6, 0.6 a1 = a1 * kamp * 1.2 aL, aR pan2 a1, random(0.3, 0.7) bus_mix("delay1", aL*0.3, aR*0.3) bus_mix("master", aL, aR) endin instr play_vox iamp = bid_getparameter(p4, p5, 2) * 2.4 * random(0.5, 1) ifn = giopreparedfns[0] ;oprepare_getfn("vox") apos phasor (1/(ftlen(ifn)/sr)) ioffset1 random 0, 1 ioffset2 random 0, 1 ioffset3 random 0, 1 ioffset4 random 0, 1 aL1 table3 apos+ioffset1, ifn, 1 aR1 table3 apos+ioffset2, ifn, 1 aL2 table3 apos+ioffset3, ifn, 1 aR2 table3 apos+ioffset4, ifn, 1 kamp = linseg(0, p3*0.2, 1, p3*0.7, 1, p3*0.1, 0) aL = aL1 + aL2 aR = aR1 + aR2 aL butterhp aL, 240 aR butterhp aR, 240 aL *= iamp * kamp aR *= iamp * kamp bus_mix("delay1", aL*random(0, 1), aR*random(0, 1)) if (random(0, 1) > 0.99) then bus_mix("delay2", aL*random(0, 1), aR*random(0, 1)) endif bus_mix("master", aL, aR) endin instr play_vox2 iamp = bid_getparameter(p4, p5, 2) * 4.4 * random(0.5, 1) ispecial = bid_getparameter(p4, p5, 4) ifn = giopreparedfns[0] ;oprepare_getfn("vox") apos phasor -(1/(ftlen(ifn)/sr)) a1 table3 apos, ifn, 1 ir = 256 f1 pvsanal a1, ir, ir/4, ir, 1 if (ispecial = 1) then kshift = -abs:k(oscil:k(500, 1)) else kshift init -random(100, 400) endif f2 pvshift f1, kshift, 300 aL pvsynth f2 aL butterhp aL, 700 aL *= iamp * 4 aR = aL if (ispecial == 1) then bus_mix("delay2", aL*0.8, aR*0.8) else bus_mix("delay1", aL, aR) endif ;bus_mix("master", aL, aR) endin instr play_clap iamp = bid_getparameter(p4, p5, 2) * random(0.4, 1) * 0.8 aL noise 1, 0.3 aR noise 1, 0.4 aL butterbp aL, random(1200, 1800), random(800, 1200) aR butterbp aR, random(1200, 1800), random(800, 1200) aL taninv aL*7 aR taninv aR*7 kamp linseg 2, p3*0.1, 0, p3*0.1, 2, p3*0.1, 0, p3*0.1, 1.5, p3*0.1, 0, p3*0.1, 1, p3*0.4, 0 aL *= kamp * iamp aR *= kamp * iamp bus_mix("clap", aL, aR) endin instr play_hat1 iamp = bid_getparameter(p4, p5, 2) idel1 = random(0.005, 0.02) idel2 = random(0.005, 0.02) xtratim(max(idel1, idel2)) kfreq = 380 + oscil(50, 23);550 ;line 600, p3, 600 aenv expsega .1, .0005, 1.5, p3 - .0005, .01 asqr1 oscil 1, kfreq, gifnSquare, -1 asqr2 oscil 1, kfreq*1.4471, gifnSquare, -1 asqr3 oscil 1, kfreq*1.6170, gifnSaw, -1 asqr4 oscil 1, kfreq*1.9265, gifnSaw, -1 asqr5 oscil 1, kfreq*4.5028, gifnSine, -1 asqr6 oscil 1, kfreq*3.6637, gifnSine, -1 a808L sum asqr1, asqr2, asqr3 a808R sum asqr4, asqr5, asqr6 a808L butterhp a808L, 4270 a808R butterhp a808R, 4270 aoutL = a808L * aenv * iamp aoutR = a808R * aenv * iamp aL delay aoutL, idel1 aR delay aoutR, idel2 bus_mix("hat1", aL, aR) endin instr play_hat2 iamp = bid_getparameter(p4, p5, 2) * 0.7 kfreq line 880, p3, 400 aenv expsega .1, .0005, 1.5, 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, gifnSquare, -1 asqr6 oscil 1, kfreq*2.6637, gifnSquare, -1 a808L sum asqr4, asqr5, asqr6 a808R sum asqr1, asqr2, asqr3 a808L butterhp a808L, 3270 a808R butterhp a808R, 3270 aL = a808L * aenv * iamp aR = a808R * aenv * iamp bus_mix("master", aL, aR*0.7) endin instr rim icps = p4 ;1000 iamp = p5 acps expon icps, 0.0025, icps * 0.5 acps = acps + icps iamp = iamp * 0.3 a1a phasor acps, 0 a1b phasor acps, random(0, 1) afmenv expon 1.0, 0.02, 0.4 a1 = (a1a-a1b)*random(1, 10)*afmenv acps = acps*(1.0+a1) a0 oscil3 1.0, acps aenv expon 1.0, 0.005, 0.5 a0 limit 4.0*a0*aenv, -1.0, 1.0 a0 butterhp a0, 230 aL, aR pan2 a0*iamp, random(0.3, 0.8) bus_mix("rim", aL, aR) bus_mix("delay1", butterlp(aL*0.6, 2000), butterlp(aR*0.6, 2000)) endin instr blip1 iup = p4 iamp = p5 inote1 = table(p4+3, gibid_chordfn, 0, 0, 1) + iup inote2 = table(p4+5, gibid_chordfn, 0, 0, 1) + iup a1 oscil 0.7, cpsmidinn(inote1) a2 oscil 0.7, cpsmidinn(inote2) kamp linseg 1, p3*0.2, 0, p3*0.8, 0 a1 *= kamp a2 *= kamp a1 butterhp a1, 250 a2 butterhp a2, 250 a1 butterhp a1, 250 a2 butterhp a2, 250 aL1, aR1 pan2 a1, random(0, 1) aL2, aR2 pan2 a2, random(0, 1) bus_mix("master", aL1+aL2, aR1+aR2) bus_mix("delay1", butterlp(aL1*0.5, 4000), butterlp(aR2*0.5, 4000)) endin instr play_rim iamp = bid_getparameter(p4, p5, 2) if (random(0, 1) > 0.6) then event_i "i", "rim", 0, 0.4, 3000, iamp endif if (random(0, 1) > 0.6) then event_i "i", "rim", 0, 0.4, 1000, iamp endif if (random(0, 1) > 0.6) then event_i "i", "rim", 0, 0.4, 2000, iamp endif if (random(0, 1) > 0.6) then event_i "i", "rim", 0, 0.4, 2500, iamp endif if (random(0, 1) > 0.6) then event_i "i", "rim", 0, 0.4, 3500, iamp endif if (random(0, 1) > 0.6) then event_i "i", "blip1", 0, random(0.01, 0.1), 48, iamp endif if (random(0, 1) > 0.6) then event_i "i", "blip1", 0, random(0.01, 0.1), 24, iamp endif if (random(0, 1) > 0.6) then event_i "i", "blip1", 0, random(0.01, 0.1), 36, iamp endif endin instr play_kick ; 808 style kick iamp = bid_getparameter(p4, p5, 2) idist = 0.5 ;= (i(gksection) == 1) ? 0.55 : 0.35 xtratim 0.1 krelease release ktune init -1.5 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 linseg 0, p3*0.8, 1, p3*0.2, 0 gkpump = k(aenv) asig = asig*aenv aenv linseg 0, 0.07, 1 acps expsega 400, 0.07, 0.001, 1, 0.001 amix = (asig*0.7)*1*iamp ;gkpump = min(rms(amix) * 7, 1) aout1 pareq amix, 100, 0.01, 0.7 aout1 distort aout1, idist, gifnSquare aout1 pareq aout1, 50, 2, 0.4 aout1 pareq aout1, 190, 0.7, 0.6 aout1 butterlp aout1, 140 aout1 *= 2 bus_mix("kick", aout1, aout1) endin instr play_kick2 ; 808 style kick iamp = bid_getparameter(p4, p5, 2) idist = 0.2 ;= (i(gksection) == 1) ? 0.55 : 0.35 xtratim 0.1 krelease release ktune init 1 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 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))*2*iamp gkpump = min(rms(amix) * 7, 1) aout1 pareq amix, 150, 0.2, 0.7 aout1 distort aout1, idist, gifnSaw aout1 pareq aout1, 350, 0.1, 0.7 aout1 pareq aout1, 90, 1.4, 0.7 ;aout1 pareq aout1, 190, 0.7, 0.6 aout1 pareq aout1, 4900, 2, 0.7 aout1 pareq aout1, 8900, 2, 0.7 aout1 *= 1.3 bus_mix("delay2", aout1, aout1) bus_mix("master", aout1, aout1) endin instr play_koffer iamp = bid_getparameter(p4, p5, 2) ifreq = cpsmidinn(tab_i(ftlen(gibid_chordfn) - 2, gibid_chordfn)+12) aL buzz 2, ifreq, random(7, 12), gifnSquare aL butterhp aL, 500 aR buzz 2, ifreq, random(7, 12), gifnSquare aR butterhp aR, 500 kamp linseg 0, p3*0.2, 1, p3*0.1, 0, p3*0.7, 0 aL *= kamp aR *= kamp bus_mix("koffer", aL, aR) endin instr stringin ifqc = cpsmidinn(p4) iamp = 1 idur = p3 ifm1 = ifqc ifm2 = ifqc*3 ifm3 = ifqc*4 indx1 = 7.5/log(ifqc) ;range from ca 2 to 1 indx2 = 15/sqrt(ifqc) ;range from ca 2.6 to .5 indx3 = 1.25/sqrt(ifqc) ;range from ca .2 to .038 irise = 0.1 idec = 0.4 inoisdur = .1 ivibdel = 0.25 ivibwth = 0.01 ivibrte = 5.5 kvib init 0 kvbctl linen 1,.5,p3-ivibdel,.1 ; vibrato control envelope krnd randi .0075,2 ; random deviation vib width kvib oscili kvbctl*ivibwth+krnd,ivibrte*kvbctl ; generator ktrans linseg 1,inoisdur,0,1,0 ; transient envelope anoise randi ktrans*iamp/4,.2*ifqc ; attack noise... attack oscili anoise,2000 ; ...centered around 2kHz amod1 oscili ifm1*(indx1+ktrans),ifm1 amod2 oscili ifm2*(indx2+ktrans),ifm2 amod3 oscili ifm3*(indx3+ktrans),ifm3 asig oscili iamp,(ifqc+amod1+amod2+amod3)*(1+kvib) asig linen (asig+attack),irise,idur,idec asig butterhp asig, 800 asig butterhp asig, 200 kenv linseg 0, p3*0.5, 0.1, p3*0.3, 0.3, p3*0.1, 0.6, p3*0.1, 1 asig *= kenv * (abs:k(oscil:k(0.9, random(0.01, 1), -1, random(0, 1)))) asig *= 0.1 aL, aR pan2 asig, abs:k(oscil:k(1, random(0.1, 3), -1, random(0, 1))) bus_mix("master", aL, aR) endin /* Convenience opcode for playing current chord on given instrument, passing p4 as note and p5 as amp chordinstrument Sinstrument Sinstrument the instrument name ipos position in pattern idataindex section specific data index; pointer to ftable */ opcode chordinstrument, 0, Sii Sinstrument, ipos, idataindex xin iamp = bid_getparameter(ipos, idataindex, 2) index = 1 ; index 0 is chordgroup length while (index < ftlen(gibid_chordfn)) do event_i "i", Sinstrument, 0, p3, tab_i(index, gibid_chordfn), iamp index += 1 od endop instr play_stringchord chordinstrument "stringin", p4, p5 turnoff endin #end