;-+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