ifdef([OUTBIGTSAMP],,define(OUTBIGTSAMP,[ifelse(NCHNLS,1,[],
[; mono in, stereo output : left-right output spatial placement
if p13 = -1 goto leftlow
if p13 = -2 goto  rightlow
if p13 = -3 goto  randrand
if p13 = -4 goto  randper
if p13 = -5 goto  done
a2 = (1. - p13) * a1
a1 = p13 * a1
goto done

leftlow: ;  p13 = -1 : lowest notes to LC, highest notes to RC 
        iplace = (p4 > 12. ? 12. : p4)
        iplace = (p4 < -12. ? -12. : p4)
        iplace = .5 + (iplace * .0416)
     a2 = sqrt(iplace) * a1
     a1 = sqrt(1. - iplace) * a1
goto  done

rightlow:  ; p13 = -2 : lowest notes to RC, highest notes to LC 
        iplace = (p4 > 12. ? 12. : p4)
        iplace = (p4 < -12. ? -12. : p4)
        iplace = .5 + (iplace * .0416)
     a2 = sqrt(1. - iplace) * a1
     a1 = sqrt(iplace) * a1
goto done

randrand:  ; p13 = -3 : random spatial placement with random moving pan : 
        iseed = frac(icps + iamp - idur) 
kplace  randi .25, 2. + (frac(iamp - icps + idur)) 
        kplace = kplace + .25 
        isign = (iseed > .5 ? -1 : 1 ) 
        kplace = (kplace * isign) + iseed 
     a2 = sqrt(1. - kplace) * a1
     a1 = sqrt(kplace) * a1
goto done

randper:   ; p13 = -4 : random spatial placement with periodic moving pan 
        iseed = frac(icps + iamp - idur) * .9
        iseed2 = ((1. - iseed) + .2) * .6
        ipancenter = (iseed * .5) + .25 
kspeed  linseg iseed*1.3,.2*idur, .8*iseed ,.3*idur,iseed2 , .35*idur ,.7*iseed ,.15*idur, .4*iseed2 
kspeed  linseg 1., .2 * idur , .4 , .3*idur , .9 , .35*idur , .4 , .15*idur, .3 
kplace  oscil .25, kspeed * 1.6 + (frac(icps - iamp)), 100,iseed 
        kplace = kplace + .25 
        isign = (iseed > .5 ? -1 : 1 ) 
        kplace = (kplace * isign) + ipancenter 
     a2 = sqrt(1. - kplace) * a1
     a1 = sqrt(kplace) * a1

done:
])]))dnl

; p4 = transposition 
; p5  = amplitude (0 -1 ) integer 0 -127 = midi veloc or 1000 - 32000 raw value
; p6 = detuning (additional transposition, mostly for chorusing)
; p7 = input gen1 function # { if f99 & f98 not used}

COMMENT  TSAMP   inexplicably the character string "tsamp" aborts  with m4 as bad macro name
instr bigtsamp

idur = p3
icps = 261.626  ; initial input pitch level for loscil
ibasepitch = 261.626  ; middle C reference input pitch for loscil
p12 = (p12 = 0 ? 2 : p12 ) ; dummy end loop point for loscil
                           ; csound aborts without an end loop value, even
                           ; if no looping is specified
;========get transposition {p4 & p6}
itransp init 1.  
idetune = p4 + p6  ; total pitch offset: transposition (p4) + detuning (p6)
if idetune = 0 goto gottransp ;skip all this if no transposition or detuning
       icount init 0  ; counter
       imult =  (idetune > 0 ? 1.05946 : .94387) ;1/2 step freqency ratios
        icheck = abs(idetune)
        icheck = int(icheck)

     dumbloop:
	      icount = icount + 1   ; increment counter
	      imult = (icheck = 0 ? 1 : imult)
	      itransp = itransp * imult 
     if icount < icheck igoto dumbloop
 ; microtonal transposition &/or detuning:
	imult = abs(idetune)
	imult = frac(imult)
	imult = imult * .05496
	imult = (idetune > 0 ? imult : - imult)
	itransp = itransp + imult
gottransp:
icps = icps * itransp
; ------------------------------------------
; get gen01 audio function number 
ifno = (p7 = 0 ? 1 : p7 )      ; input soundfile function number
; -----------------------------------------------------------
; optional TURN OFF INSTRUMENT when p9 time reached {only a portion of the
; input soundfile, specified in p9,  is used}
if p9 = 0 goto playon
        istoptime = p9   ; 
;	inotedur = ( p3 < istoptime ? p3 : istoptime)
;	inoteoff = inotedur + p2
        itransp = ibasepitch/icps
	istoptime = istoptime * itransp 
	istoptime = istoptime - .005
	inotedur = ( p3 < istoptime ? p3 : istoptime)
        idur = inotedur
	inoteoff = inotedur + p2

        print p2, p4, inotedur, inoteoff  ; print note start time, dur & end time for user
	timout istoptime , p3 , shutdown
	goto playon
		shutdown: 
		turnoff
		kgoto output
playon:
; ================ new bigtsamp code not in tsamp :==================
; OPTIONAL PITCH PROCESSING : (1) glissando (2) freq. mod. (3) random deviation
kcps  = icps
;  (1) GLISSANDO : 
;     p21 = 2nd transposition ; p22 = duration of p4 transposition
;     p23 = duration of gliss . ; p24 = gliss. function {default = 60}
if p21 == 0  goto gotgliss
if p22 == 0  goto gotgliss
   ; determine 2nd transposit	on :
   if p21 < 100. igoto glisstransp
      ;  if p21 > 100, (p21-100) is multiplier for p4 transpsotion value:
       icps2 = (p21 - 100) * icps
       igoto dogliss
   glisstransp:  ; here p21 is a 2nd transpsotion value
			itransp2 init 1
			icount2 init 0
			iabsolute = abs(p21)
			imult2 = (p21 > 0? 1.059463 : .94387)
		findpitch2:
		itransp2 = itransp2 * imult2
			icount2 = icount2 + 1
		if icount2 < int(iabsolute) igoto findpitch2
		; if frac(p21) = 0 igoto dogliss
			; microtones
			imicro2 = frac(p21) * .059463
			imicro2 = (p21 > 0 ? imicro2 : -imicro2)
			itransp2 = itransp2 + imicro2
                        icps2 = itransp2 * ibasepitch
dogliss:
   ; if p22 = 0 no gliss
       iglissdur1 = (p22 < 100 ? p22 : (p22 - 100) * idur)
       iglissdur1 = (p22 < 0 ? abs(p22) * idur : iglissdur1)
       iglissdur2 init p3 - iglissdur1

       iglissdur2 = (p23 > 100 ? (p23 - 100) * idur : iglissdur2)
       iglissdur2 = (p23 < 0 ? abs(p23) * idur : iglissdur2)
       iglissdur2 = (p23 > 0  && p23 < 100 ?  p23 : iglissdur2)
       iglissfunc = (p24 = 0 ? 60 : p24)  ; default gliss function shape
   kgliss  oscil1i  iglissdur1,  icps2 - icps, iglissdur2, iglissfunc
   kcps = icps + kgliss
gotgliss:
 ; ------------------------------------------------------
 ;  (2) PERIODIC FREQUENCY MODULATION : VIBRATO, TRILL, audio rate FREQ. MOD.
; p25 = freq. mod. fade-in duration  ; p26 = initial rate ; p27 = closing rate
; p28 = initial depth  ; p29 = closing depth
ifmtest =  p28 + p29
if ifmtest = 0 goto gotfm
        ifmfade = (p25 = 0 ? .001 : p25)
        ifmfade = (p25  < 0 ? abs(p25) * idur : ifmfade)
        ifmfade = (p25  > 100 ? (p25 - 100) * idur : ifmfade)
        ifmfunc = (p30 = 0 ? 100 : p30)

        p28 = (p28 = 0 ? .001 : .0595 * p28)   ; initial depth
        p29 = (p29 = 0 ? .001 : .0595 * p29)   ; closing depth
kfmdepth expseg .001, ifmfade, p28,idur - (ifmfade + (.15 * idur)), p29,.15*idur,.8*p29
kfmrate  linseg 0, ifmfade, p26,idur - (ifmfade  + (.1 * idur)), p27
     afm    oscil  kfmdepth * kcps, kfmrate, ifmfunc, frac(idur + icps)
     kfm  downsamp  afm
kcps = kcps + kfm
gotfm:
 ; ------------------------------------------------------
 ; (3) RANDOM FREQUENCY DEVIATION
irfdtest = p31 + p32
if irfdtest == 0 goto gotfreqrd
     p31 = (p31 = 0 ? .001 : p31 * .059)
     p32 = (p32 = 0 ? .001 : p32 * .059)
k1   expon  p31 , idur, p32
krandfreq   randi  k1, p33
kcps = kcps + (krandfreq * kcps)

gotfreqrd:
 ; ==============================================================
       ; Determine "peak" amplitude:
	iamp init 0
	iamp = (p5  < 10.1 ? p5  : iamp) ; p5  = multiplier for original soundfile amp.
	iamp = (p5  > 10.1 ? p5/32767 : iamp) ; p5  gives new raw amplitude
	iamp = (iamp = 0 ? 1. : iamp)
a1	loscil	iamp, kcps , ifno, ibasepitch , p10, p11, p12
 ; ==============================================================
; FADE OUT and OPTIONAL NEW AMPLITUDE ENVELOPE
	irise = (p14 = 0? .0001 : p14)
	irise = (p14 < 100 ? irise : (p14 - 100)  * idur)
	irise = (p14 < 0 ? abs(p14)  * idur : irise)
	iatss = (p16 = 0  ? 1 : p16)
	idec = (p15 = 0? .0001 : p15)
	idec = (p15 < 100 ? idec : (p15 - 100)  * idur)
	idec = (p15 < 0 ? abs(p15)  * idur : idec)

        idec = (idec > .04 ? idec : .04) ; default decay of .04 to avoid clicks
                               ; if p3 is less than duration of input soundfile
	amp expseg .005, irise, 1., idur - (irise + idec), iatss , idec, .005
        a1 = a1 * amp

; ======= bigtsamp code for amplitude AM & r.d. not in tsamp ============
 ;  AMPLITUDE MODULATION : Tremolo or audio rate {sidebands}
; p34 = freq. mod. fade-in duration  ; p35 = initial am freq. ; p36 = closing freq.
; p37 = initial depth  ; p38 = closing depth ; p39 = function
iamtest =  p37 + p38
if iamtest = 0 goto gotam
        iamfade = (p34 = 0 ? .001 : p34)
        iamfade = (p34  < 0 ? abs(p34) * idur : iamfade)
        iamfade = (p34  > 100 ? (p34 - 100) * idur : iamfade)
        iamfunc = (p39 = 0 ? 100 : p39)

        p37 = (p37 = 0 ? .001 : p37)   ; initial depth
        p38 = (p38 = 0 ? .001 : p38)   ; closing depth
kamdepth expseg .001, iamfade, p37,idur - (iamfade) , p38
     kamfreq  linseg 0, iamfade, p35,idur - (iamfade  + (.1 * idur)), p36
     kam    oscili  kamdepth , kamfreq, iamfunc, frac(idur + icps)
     a1 = ((1. - kamdepth) * a1) + (kam * a1)

gotam:
;--------------------------------------------------------
 ; RANDOM AMPLITUDE DEVIATION
iramdtest = p40 + p41
if iramdtest == 0 goto gotamrd
        p40 = (p40 = 0 ? .001 : p40 )
        p41 = (p41 = 0 ? .001 : p41 )
   k1   expon  p40 , idur, p41
   krandam   randi  k1, p42
   a1 =  ((1. - k1) * a1) + (krandam * a1) 
gotamrd:

; ------------------------------------------
; OPTIONAL BRIGHTNESS -- use with new envelope for cresc & dim.
bright:  ibrightest = p17 + p18
if ibrightest = 0 goto output
kbright init p17
if p18 = 0 goto brightscale
   ip19 = (p19 > 100 ? ((p19 - 100) * idur) - .1 : p19)
   ip19 = (p19 < 0 ? (abs(p19) * idur) - .1 : ip19)
   ip19 = (ip19 = 0 ? (.9*idur) - idec : ip19)

   ip20 init icps
if p20 = 0 igoto gotcf
   ip20 = (p20 < 13.1 ? cpspch(p20) : p20 )
gotcf:
   kbright expseg p17, .1,p17,ip19, p18, idur, p18
brightscale:
      ihp = icps*1.5
        iscale = octcps(ihp)
        iscale = (18.25 - iscale) * .1
        iscale = (iscale < 1. ? iscale : iscale * iscale )
      ihp = ihp * iscale
   ahi atone .9*a1, ihp
   alo tone  .9*a1, ihp
   a1 balance (kbright*ahi) + ((2. - kbright)* alo), a1
 ; --------------------------------------------------------
output:
OUTBIGTSAMP

