;-+q0 -+K1 -+O -m0 -+M -+q0 -+* -+K -+p8 -b256 ;-+q1 -+* -+K0 -+O -+p4 -b256 -+e ;---------------------------------------------------------------- sr = 44100 kr = 441 ksmps = 100 nchnls = 2 ;---------------------------------------------------------------- ga11L init 0 ga11R init 0 ga12 init 0 ga13 init 0 massign 1,10 ;map midi channel 1 to instr 10 ctrlinit 1,7,80 ;initialize controller 7 on chan 1 to 80 ctrlinit 1,91,10 ;---------------------------------------------------------------- ; PANEL ;---------------------------------------------------------------- FLcolor 200,150,150,100,255,255 FLpanel "Sawlaw by Nolv, jan 2002",590,310 ;FLcolor 200,100,100,100,255,255 ;FLcolor 50,100,80,230,230,30 gih40 FLvalue " ", 30, 20, 285,10 ih41L FLvalue " ", 50, 20, 75,190 ih41R FLvalue " ", 50, 20, 275,190 FLcolor 50,100,80,230,230,30 gkAttack,ih1 FLknob "Attack", 0.0001, 1, 0 ,1 , -1, 50, 20,30 gkDecay,ih2 FLknob "Decay", 0, 1, 0 ,1 , -1, 50, 75,30 gkSustain,ih3 FLknob "Sustain", 0, 1, 0 ,1 , -1, 50, 130,30 gkRelease,ih4 FLknob "Release", 0.01, 1, 0 ,1 , -1, 50, 185,30 gkBend,ih5 FLknob "Bend", 0, 24, 0,1, gih40, 50, 275,30 gkTune,ih6 FLknob "Detune", -0.01, 0.01, 0,1, -1, 50, 330,30 gkDelSendL, ih13L FLknob "Send", 0, 1, 0, 1, -1, 50, 20,210 gkDelTimeL, ih14L FLknob "Time", 0, 2, 0 ,1 , ih41L, 50, 75,210 gkDelFeedL, ih15L FLknob "Feedback", 0, 1, 0 ,1 , -1, 50,130,210 gkDelSendR, ih13R FLknob "Send", 0, 1, 0, 1, -1, 50, 220,210 gkDelTimeR, ih14R FLknob "Time", 0, 2, 0 ,1 , ih41R, 50, 275,210 gkDelFeedR, ih15R FLknob "Feedback", 0, 1, 0 ,1 , -1, 50,330,210 ;FLcolor 50,50,150,255,255,100 gkCutoff, ih16 FLknob "Cutoff", 1, 100, 0 ,1 , -1, 50, 20,110 gkQ, ih17 FLknob "Q", 0.1, 5, 0 ,1 , -1, 50, 125,110 gkCutC, ih30 FLbutton " ", 2, 0, 2, 30, 30, 75, 120,-1 ;FLcolor 100,100,50,150,205,255 gkPre, ih18 FLknob "Pre", 0, 30, 0 ,1 , -1, 50, 220,110 gkPost, ih19 FLknob "Post", 0, 2, 0 ,1 , -1, 50, 275,110 gkVol, ih20 FLknob "Vol", 0, 1.2, 0, 1, -1, 50, 330,110 gkStore,ihp1 FLcount "New preset",0,8,1,10,21,150,20,415,240,-1,40,0,0 gk9,ihp3 FLbutton "Store", 3, 0, 11, 150, 25, 415, 210, 0, 40, 0, 0 gk9,ihp4 FLbutton "Save to disk",1,0, 11,150,25,415,170,0,50,0,0 gk9,ihp5 FLbutton "Load from disk", 1,0, 11,150,25, 415,140,0,60,0,0 gkGet,ihp2 FLbutBank 12, 3,3, 150,100, 415,25, 0, 70, 0, 0 FLsetVal_i 0.5, ih1 FLsetVal_i 0, ih2 FLsetVal_i 1, ih3 FLsetVal_i 0.01, ih4 FLsetVal_i 2, ih5 FLsetVal_i 0, ih6 FLsetVal_i 0, ih13L FLsetVal_i 1, ih14L FLsetVal_i 0.25, ih15L FLsetVal_i 0, ih13R FLsetVal_i 1, ih14R FLsetVal_i 0.25, ih15R FLsetVal_i 10, ih16 FLsetVal_i 1, ih17 FLsetVal_i 1, ih18 FLsetVal_i 1, ih19 FLsetVal_i 1, ih20 FLpanel_end FLrun ;------------------------------------------------------------------------------- instr 10 ;Saw wave ;-------------------------------------------------------------------------------- ;Various data iAttack = i(gkAttack) iDecay = i(gkDecay) iSustain = i(gkSustain) iRelease = i(gkRelease) ivibwth = .025 ivibhz = 6 iwheel = int(i(gkBend)); kmodwh midictrl 1,0,1 ;get controller 1 (ModWheel) kvol midictrl 7,0,1 ;get controller 7 (Volume) gkmidcut midictrl 91,1,100 kscale tablei kvol,2,1 ;function 2 has an exponential rise iamp ampmidi 5000 kcps cpsmidib iwheel kamp = iamp*kscale ;vibrato kvibwth = kmodwh*ivibwth klfohz = kmodwh*ivibhz klfo oscil kvibwth,klfohz,1 kvib = 1 + klfo kcps2 = kcps * kvib ;Oscil xtratim iRelease ;extra-time, i.e. release dur krel init 0 krel release ;outputs release-stage flag (0 or 1 values) if (krel > .5) kgoto rel ;if in relase-stage goto relase section ; attack and sustain section kmp1 linseg 0,iAttack,1,iDecay,iSustain kmp = kmp1*kamp kgoto done ; release section rel: kmp2 linseg 1,iRelease,0 kmp = kmp1*kmp2*kamp done: a2L oscil kmp,kcps2*(1+gkTune),1 a2R oscil kmp,kcps2*(1-gkTune),1 ;Output to instr 11 ga11L = ga11L+a2L ga11R = ga11R+a2R endin ;---------------------------------------------------------------- instr 11 ;filter+disto ;---------------------------------------------------------------- ;Filter ga11L init 0 ga11R init 0 kcut = gkCutoff if gkCutC < 1 kgoto next kcut = gkmidcut next: a4L lowres ga11L, kcut, gkQ a4R lowres ga11R, kcut, gkQ ;Distorsion a5L distort1 a4L, i(gkPre), i(gkPost) a5R distort1 a4R, i(gkPre), i(gkPost) ga12 = gkDelSendL*a5L ; delay send ga13 = gkDelSendR*a5R ; delay send outs a5L*gkVol, a5R*gkVol ga11L = 0 ga11R = 0 endin ;---------------------------------------------------------------- instr 12 ;DelayL ;---------------------------------------------------------------- ga12 init 0 idlytim = 2 a1 delayr idlytim a2 deltap gkDelTimeL afdbk = gkDelFeedL*a2 + ga12 delayw afdbk outs1 a2*gkVol ga12 = 0 endin ;---------------------------------------------------------------- instr 13 ;DelayR ;---------------------------------------------------------------- ga13 init 0 idlytim = 2 a1 delayr idlytim a2 deltap gkDelTimeR afdbk = gkDelFeedR*a2 + ga13 delayw afdbk outs2 a2*gkVol ga13 = 0 endin ;---------------------------------------------------------------- ; Snapshots ;---------------------------------------------------------------- instr 40 inumsnap,inumval FLsetsnap i(gkStore) endin instr 50 FLsavesnap "Saw_snap.txt" endin instr 60 FLloadsnap "Saw_snap.txt" endin instr 70 inumel FLgetsnap i(gkGet) endin ;saw wave f1 0 8192 7 0 8192 1 0 -1 8192 0 ;exponential curve for amp scaling f2 0 129 5 .1 129 1 ;Let the instrument play for 3600 seconds i11 0 3600 ; Turn on Filter i12 0 3600 ; Turn on Delay i13 0 3600 ; Turn on Delay f0 3600 e