; ### Eastman Orchestra Library Instrument  b_s_n ###
define([NEWPAR],19)dnl
ifelse(NCHNLS,2,[define([STEREO_OUT],[ipan	 = p18
[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
; Functions needed: linfuncs(50-53), 60, 100, 70 (detuning)
; p fields:
; p6 = rise time(ord. .06-.07)	; p7 = decay time
; p8 = atss (ord. range .5 - .9)  ; p9 = detuning p-field, mostly for chorusing
; p10 = attack hardness (default = 1.; normal range: .8 - 1.4)

; p11 = vibrato width (.2-.3 ord; .4 wide)(multiplied by .01 within instrument)
; p12 = low vib. rate		; p13 = high vib. rate
; p14 = vib. func.(usually 52 or 51, occasionally 50 or 53)
; p15 brightness (default = 1. ; range:  .7-1.3 or so)

; Presets
; p16 = small random value added to c:m and intonation
; p17 reseeds rand generators; also a flag to disable detuning if integer = 100
; p18 : stereo pan location {for stereo only}
; ;- - - - -

instr bsn
; Set defaults :
	p8 = (p8=0 ? .8 : p8)
	p10 = (p10=0 ? 1. : p10)
	p15 = (p15=0 ? 1. : p15)
if p4>12. goto contin
;Detuning unique to this algorithm :
if p17 = 0 igoto contin
if p4 < 6.02 igoto hiorlo
if p4 > 8.09 igoto hiorlo
; detuning for notes between D2 & Bf4
if int(p4)=6 igoto next
p4 = (int(p4)=7?p4-.88:p4-1.76)  ; all notes converted to 6.00-6.33 pch

next: i1 = (frac(p4)-.02)*100
i1 table i1,70
i1 = i1 * .0001
p4 = p4 + i1
igoto contin
hiorlo: p4 = (frac(p4)=.00? p4-.88:p4)   ;takes care of pitch class C
p4 = (p4<6.03? (p4+((octpch(p4))/10000)): p4-(1.3*(octpch(p4))/10000))
                                ; very low tones sharp,very high tones flat
contin: p17 = (p17>0?p17:.3)    ; get rid of the flag
i1 = (p4<13.? cpspch(p4):p4)
        ;  --- Detuning  module (mostly for use with "chorus" ) ---
  idetunepf = p9
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 -------

p16 = (p17>0?.001*p16:0)
i1 = i1+(p16*i1)                ; small random intonation factor added
i4 = octcps(i1)
i8 = (15-i4)*.13                    ; scalar ; c3=1.04,c4=.91,c2=1.17 etc
p7 = (p7<100?p7:(p7-100)*p3)
i10 = (frac(p4)=0?.0002:i8*p16)
p6 = p6*i8
p5 = ((i8+2)/3)*p5*(i4<8.5?1:1+((i4-7.5)*.3))
ibright = (p15 = 0 ? 1. : p15)

; Amplitude                         
;a1 envlpx p5,p6,p3,p7,60,p8,.01,p9; ORIGINAL,DESIRED CODING, BUT XMOD CAUSES
	; SAMPLES OUT OF RANGE
a1 envlpx p5,p6,p3,p7,60,p8,.01 
k1 rms a1
; 1. Tremolo : k2
p11 = (p11 = 0 ? .001 : p11)
p11 = p11*.01/i8
;  k2 randi .07*p11,2.6,p17
k2 randi .12*p11,3.3,p17  ; changed 3/29/86
k2 = (18*p11) * k1		; % tremolo based on vib.width
a1 = a1 - k2
k3 oscili p13-p12,1/p3,(p14 = 0 ? 50 : p14)
k3 = k3 + p12			; rate
k4 randi .17*k3,3.8,p17     ; changed 3/29/86
k7 = k3+k4
k2 oscili k2,k7,100     	; tremolo
; 2. Random amplitude deviation : k3
k3 randi (p10+1)/2*.11,30/p10,p17       

; For attack chiff
k4 linseg 0,.1/i8*p6,i8*.05,p10*.15*i8*p6,i8*.02,.3*p6,0,p3,0
k4 = k4*p10*p5
a1 = a1+k2+(k3*a1)+k4                ; total amplitude

; PITCH VARIATIONS
; 1. Vibrato :k2
; k2 randi .16*p11,2.8,p17         ; random width deviation
k2 randi .17*p11,2.8,p17         ; random width deviation
k2 oscili (p11+k2)*i1,k7,100    ;vibrato

; 2. Random deviation and attack chiff : k3
i5 = (12-i4)*i8*.45
; k3 expseg p10*i5,p10*i8*.75*p6,.59*p11,p3,.003
k3 expseg p10*i5,p10*i8*.8*p6,.62*p11,p3,.003
k3 = k3 * (.5*i1)
k4 expseg 999,.2*p6,999,.8*p6,(i1>160?i1/4:40),p3-p6,30/p10
k3 randi k3,k4

k2 = i1 + k2 + k3             
ifdef([PTSOURCE],[include(CSLIBDIR/Include/lpcptrack.h)])dnl
if i4 > 8.5 goto only2
; Third Carrier                      
i9 = ((8.6-i4)*.1)*ibright                           ; amplitude % for 3rd carrier
a3 linseg p10*i8*1.35,p10*.5*p6,p10*.5,1/p10*.6*p6,1.1,p6,1,p3-((2*p6)+p7),ibright*.7,p7,.2
a3 = a3*i9*ibright*a1
a1 = a1-a3
a3 foscili a3,k2,(i4<8.01?10:8),1.+i10,i8*((p10+1)/2)*3.,100 ; carrier 3

; Second carrier amplitude                
only2: a2 linseg p10*i8*.52,p6,.47/i8,p3-p6,.44/i8 
a2 = a2*((ibright+1)/2)
a2 = a2 * a1                    ; amplitude for 2nd carrier
a1 = a1 - a2

k3 expseg p10*i8*2.8,p10*i8*.5*p6,1/i8,.5/p10*p6,2.5,p6,2.2,p3-((2*p6)+(ibright*.9*p7)),2.0,p15*.9*p7,p15*1.5
k6 randi .06,9
k3 = (k3+k6)*ibright*i8
a1 foscili a1,k2,1.,(i4<8.76?4:2)+i10,k3,100      ; carrier 1
a2 foscili a2,k2,2,2.+i10,.95*k3,100  ; carrier 2(even harmonics)
a1 = a1+a2
if i4 > 8.5 goto formnt
a1 = a1+a3

; FORMANTS
formnt:                               
a2 tone a1,(p10+1)/2*530                                
; a3 reson .39/i8*a1,480,ibright*90,1
a3 reson .42/i8*a1,470,ibright*85,1
;a4 reson p10*.22*a1,1250,ibright*p10*70,1                       
a4 reson p10*.22*a1,1200,ibright*p10*70,1                       
a5 reson p10*ibright*.05*a1,980,p15/i8*p10*50,1
a6 reson p10*ibright/i8*.08*a1,2050,60,1
if i4>8.01 kgoto high
a2 balance (.01*a2)+a3+a4+a5+a6,a1
kgoto mix 
high: a2 areson (1.1/i8*a3)+a4+a5+a6,3000,1000,1
a3 reson a3,2*i1,.1*i1,1
a2 balance a2+.75*a3,1.05*a1
mix: i11 = (i4<8.5?i8*.02:i8*.001)        
k1 expseg p10*i8*.6,p10*i8*.6*p6,i11,p3,i11
a1 = (k1*a1)+((1-k1)*a2)

