; COMMENT    ***** TRPT ***** 
define([NEWPAR],23)dnl

ifelse(NCHNLS,2,[define([STEREO_OUT],[ipan	 = p22
[a2 = a1*sqrt(1-ipan)  ; stereo orchestra : right channel output]
[a1 = a1*sqrt(ipan)  ; left channel output]
[outs a1, a2]
])])dnl
ifdef([PTSOURCE],[define([PTPITCH],k2)])dnl
ifdef([DYNAMICS],,define(DYNAMICS,[p19=(p19=0?.001:p19)
i30 = (p19>.001?p19*p3:abs(p19))

p20=(p20=0?.001:p20)
p21=(p21=0?.001:p21)
k5 expseg 1,i30,p20,p3-(i30+p7),p21,p7,1]))

; Functions needed 50 51 52  54 100
; p fields:          
; p6 = rise time (.06 - .12)	; p7 = decay time
; p8 = atss (c. .8-9) (xmod is p17)
; p9 = brightness(neutreal default value = 1.; normal range: .65-1.2)
; p10 = hardness of attack (default neutral value = 1.; normal range: .6 - 1.7 or so)                    
; Tremolo and vibrato
; p11 = vib. width (.2-.3 ord.,.4 wide)(*.01)
; p12 = 1st vib. rate		; p13 = 2nd vib. rate
; p14 = vib. func.(usually 52 or 50, occasionally 51)     
; p15 = chorus detuning p-field

; Presets: p15,p16,p17
; p16 = value for intonation
; p17 alters basic pitch by up to +/- 10 cents; also reseed for rand generators
; for exact pitch, make p17 "0"

; p18 mutes : 0 = open, 1= straight, 2= cup, 3= harmon

; Optional Parameters For Crescendo,Diminuendo,Fortepiano,etc.
; p19 dur.1(%p3)        ; p20 middle value(c. .3-.7)
; p21 closing value(c. 1.3-1.6)   [dur.3,middle to end,=p3-(p19*p3)+p7)]
; p22 : stereo pan location {for stereo only}

instr trptinst
; set defaults
	p9 = (p9 = 0 ? 1. : p9)
	p10 = (p10 = 0 ? 1. : p10)
	p11 = (p11 = 0 ? .001 : p11)
	p12 = (p12 = 0 ? .001 : p12)
	p13 = (p13 = 0 ? .001 : p13)
	p14 = (p14 = 0 ? 50 : p14)
p4 = (p4>0?p4:(abs(p4))/100)  ; for microtones; -800.050 = quarter tone above c
i13 = (p18<1?1.:.5)
i13 = (frac(p4) > 0? i13:.25*i13) ; removes warble on pitch class "c"
p4 = (frac(p4)=.00?p4-.88:p4)
if p4 > 15. igoto jump
i1 = p4 + ((p17-.1)*.01)
jump:
i1 = (p4>13.?p4:cpspch(i1))
        ;  --- Detuning  module (mostly for use with "chorus" ) ---
  idetunepf = p15
if idetunepf = 0 goto detunedone ;skip all this if detuning set to 0 in score
       idtcount init 0  ; counter
       idtmult =  (idetunepf > 0 ? 1.05946 : .94387) ;1/2 step freqency ratios
  idetune init 1.  ; detuning multiplier for p4 pitch
        icheck = abs(idetunepf)
        icheck = int(icheck)

   dumbloop:
	      idtcount = idtcount + 1   ; increment counter
	      idtmult = (icheck = 0 ? 1 : idtmult)
	      idetune = idetune * idtmult 
   if idtcount < icheck igoto dumbloop
 ; microtonal detuning:
	idtmult = abs(idetunepf)
	idtmult = frac(idtmult)
	idtmult = idtmult * .05496
	idtmult = (idetunepf > 0 ? idtmult : - idtmult)
	idetune = idetune + idtmult
i1 = i1 * idetune 
detunedone:   ; ---end of detuning module -------
i4 = octcps(i1)
i6 = (18.25-i4)*.1                                      
i6 = (i6+1)/2                   ; e4 = 1,e5=.95,e3=1.05
p11 = p11*.01*i6*i13               
p5 = p5*i6
i11 = (p10+1)/2
p6 = (i4 < 8.5?p6*i6*i11: p6/i6*i11)
p7 = (p7<100?p7:(p7-100)*p3)
p8 = (p19=0?p8:.93)

; Intensity vibrato (tremolo,vibrato,index,% higher harmonics)
k1 randi .08,3,p17
k2 oscili p13-p12,1/p3,p14
k2 = k2 + p12			; rate
k3 randi .1*k2,2,p17
k7 oscili i6+k1,k2+k3,100

;AMPLITUDE : k1                           
;  i12 = p19=0?p10*p??:(p10*1.5*p15<.95?p10*1.5*p15:.95)
;  a1 envlpx p5,p6,p3,p7,54,p8,.01,i12  ; WANT THIS
a1 envlpx p5,p6,p3,p7,54,p8,.01,0  ; BUT XMOD NOT WORKING

; Attack blips
if i4 > 9.8 goto noblip
i2 = p10*p10*i6*.007               ; duration of blips
if i4>8.2 goto two      
a2 linseg 0,.18*p6,0,.3*i2,1.,.3*i2,.7,.2*i2,0,.35*p6,0,.25*i2,.8,.4*i2,.6,.3*i2,0,.12*p6,0,.4*i2,.6,.2*i2,.4,.3*i2,0,p3,0
goto scalar
two: if i4 > 9.2 goto one      
a2 linseg 0,i6*i11*.22*p6,0,.4*i2,.9,.4*i2,.8,.2*i2,0,.22*p6,0,.3*i2,.7,.3*i2,.5,.3*i2,0,p3,0
goto scalar
one: a2 linseg 0,i6*i11*.3*p6,0,.3*i2,.6,.3*i2,.4,.3*i2,0,p3,0
goto scalar
noblip: a2 = 0       

scalar: a2 = a2*p10*i6
a1 = a1 + (a2*i6*.025*p5)

; 1. Tremolo : k2
tremolo:  k2 randi 1.5,1.5,p17
;a2 = ((k2+14)*p11) * a1		; % tremolo based on vib.width
a2 = ((k2+10.5)*p11) * a1		; % tremolo based on vib.width
a1 = a1 - k2
a2 = a2*k7

; 2. Random amplitude deviation : k3
a3 randi p10*.07,50/p10,p17       

if p19> .02 goto cresc
a1 = a1+a2+(a3*a1)
k5 = 1
goto pitch
; 3. Crescendo
cresc: 
DYNAMICS
a1 = (a1+a2+(a3*a1))*k5
k5 = k5*k5

pitch: ; PITCH VARIATIONS
; 1. Vibrato :k2
k2 = p11*i1*k7

; 2. Random deviation and attack chiff : k3
i5 = ((12.-i4) *.2)+.25
k3 expseg p10*i5,p10*.02,1.4*p11,p3,.003
k3 = k3 * (.5*i1)
k4 expseg 999,p6,(i1>160?i1/4:40),p3-p6,50
k3 randi k3,k4

; 3. Intonation : k4
i7 = p16*i1                    
k4 linseg i7,.4*p6,i7,.6*p6,-(p12/10*i7),(frac(p12))*p6,0,p3,0

k2 = i1+k2+k3+k4        ; p4,vibrato,random dev.,intonation added    
ifdef([PTSOURCE],[include(CSLIBDIR/Include/lpcptrack.h)])dnl

; frequency modulation -- 1,2 or 3 carriers
if i4 > 10.25 goto only1
a2 expseg p10*i6*.3,p10*i6*.4*p6,.15,.7/p10*p6,.25,p3-((1.1*p6)+p7),.2,p7,.01
i10 = ( i4>9.25? 10.25-i4:1+((9.25-i4)*.1) )
a2 = p9*p10*a1*i6*i10 *k5* a2
if i4 > 9. goto only2

a3 expseg p10*.2,p10*i6*.3*p6,.05,.4/p10*p6,.01,.5*p6,.14,p3-((1.2*p6)+p7),.1,p7,.001
i9 = (i4>8.?9.-i4:1)
a3 = p9*p10*a1*i6*i9*k5*a3
a1 = a1-(a2+a3)
k3 expseg p10*2.,p6,1.7,p3,1.7                                         
;   k3 = ((p9+1)/2)*(k3+(.4*k6))*((k5+1)/2)   don't know where k6 came from
k3 = ((p9+1)/2)*k3*((k5+1)/2)
a3 foscili a3,k2,10.,1+(i11*i4*i13*.0004),k3,100             ; carrier 3
goto fmtime

only2: a1 = a1-a2
fmtime:
k3 expseg p10*i6*2.1,p6,1.7,p3,1.7                                  
;  k3 = (p9+1)/2*i6*(k3+(p10*.4*k6))*((k5+2)/3)   k6 again
k3 = ((p9+1)/2)*i6*k3*p10*((k5+2)/3)                        
a2 foscili a2,k2,6.,1+(i4<9.5?i11*i4*i13*.0004:i11*i6*i6*.0004),k3,100;carrier 2
only1: k3 expseg p10*i6*3,p10*i6*.2*p6,1.5,.8/p10*p6,2.8,p3,2.8
;   k3 = ((p9+1)/2)*i6*(k3+(.2*k6))  k6 again
k3 = ((p9+1)/2)*i6*k3           
a1 foscili a1,k2,1.,1+i13*(i4<9.5?i11*i4*.0004:i11*i6*i6*.0004),k3,100;carrier1
if i4>10.25 goto formnt
a1 = a1+a2
if i4 > 9 goto formnt
a1 = a1 + a3

; FILTERING
formnt: if p18 = 1 goto mutes
a2 reson a1,p10*400,p10*800,1
k1 linseg 0,p10*.2*p6,1,.8/p10*p6,0,p3-(p6+p7),0,p7,.6
a1 = (k1*a2)+((1-k1)*a1)
a2 areson a1,2*i1,.02*i1,1              ;reduces 2nd harmonic
a3 reson a1,i1,.01*i1,1
a1 balance .75*a1+.21*a2+.05/p9*a3,a1
a2 reson p9*p10*.18*a1,((p10+p9)/2)*1100,(p9+p10)/2*2400,1
a3 areson .3/k5*a1,(p10+1)/2*2400,2400/i11,1
a4 reson .06*p10*p10*p9*a1,((p10+2)/3)*3200,300/p10,1
a2 balance a2+a3+a4+(i11*i6*k5*.45*a1),a1

mutes:   ;(p18 0 =open,1 = straight, 2 = cup, 3 = harmon
if p18 = 0 goto output
if p18 > 1 goto cup
if i4>9 kgoto high
a2 = (.15*a1)+a2+a3
kgoto filt
high: a2 = (.35*a1)+a2
filt: a3 areson a2,210,4800,1
a4 reson a1,1700,35,1
a2 balance a3+(.12*a4)+(.01*a2),.8*a1
goto muteout
cup: if p18 > 2 goto harmon
a3 reson a2,1000,100,1
a4 reson a2,1550,40,1
a5 reson a2,2200,90,1
a6 reson a2,3100,50,1
a7 reson a2,4000,80,1
a2 balance a3+(i11*.72*k5*(a6+a7))+(i11*k5*.5*(a4+a5))+(i11*.01*a2),a1
goto muteout
harmon: a3 reson a2,1580,60,1
a4 reson a2,1890,70,1
a5 reson a2,2830,25,1
a6 reson a2,3860,30,1
a2 balance a3+a4+(i10/i6*k5*.6*(a5+a6)),.9*a1            
muteout: a1 =.8*a2
goto theend

output: a3 linseg 1,p10*.2*p6,0,p3,0
a1 = .9*a2+(a3*a1)                              
theend:        
