; ### Eastman Orchestra Library Instrument c_b_s_n  ###
; Functions needed: 50 51 52 60 100 70 (detuning)
define([NEWPAR],20)dnl
ifelse(NCHNLS,2,[define([STEREO_OUT],[ipan	 = p19
[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],k1)])dnl
; p6 = rise time(.07-.09)     	; p7 = decay time
; p8 = atss (c. .8)    	; p9 = chorus detuning p-field

; p10 = hardness of attack(1.ord); p11 = vib. width (.2-3 ord,.4 wide)(*.01)
; p12 = 1st vib. rate		; p13 = 2nd vib. rate
; p14 = function for vibrato rate change.(default = 50)
; p15 =  brightness  (.6-1.4 or so)

; Presets
; p16 = small random value added to c:m and intonation
; p17 reseeds rand generators
; p18 : flag:  0 = contrabassoon,1=bassoon
; p19 : stereo pan location {for stereo only}
; ;- - - - -

instr cbsn 
; Set defaults :
	p8 = (p8=0 ? .8 : p8)
	p10 = (p10=0 ? 1. : p10)
	p15 = (p15=0 ? 1. : p15)
p7 = (p7<100?p7:(p7-100)*p3)
if p4>12 igoto contin
;DETUNING (not CHORUS detuning)                                            
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
; the following line bombs ("token stoprage LENTOT exceeded")  :
; p4 = (p4<6.03? (p4+(1.2*(octpch(p4))/10000)): p4-(1.3*(octpch(p4))/10000))

p4 = (p4<6.03? (p4+((octpch(p4))/10000)): p4-(1.3*(octpch(p4))/10000))
; - - -                         ; very low tones sharp,very high tones flat
contin: i1 = (p4<12? cpspch(p4): p4)    ; pch or cps input
        ;  --- 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 -------
i4 = octcps(i1)
i8 = (15.-i4)*.13                ; scalar                       
p16 = i8*.01*p16
i1 = i1+((i4<7.75?p16:i8*i8*p16)*i1)     ; small random intonation factor added
p6 = (i4<7? p6*i8:p6/((i8+1)/2))
p5 = ((i8+3)/4)*.96*p5
ibright = (p15 = 0 ? 1. : p15)

; AMPLITUDE :                       
;  a1 envlpx p5,p6,p3,p7,60,p8,.005,p10*p9 ; XMOD DOESN'T WORK IN CSOUND
a1 envlpx p5,p6,p3,p7,60,p8,.005 ; REPLACE WITH LINE ABOVE WHEN XMOD WORKS
; 1. Tremolo : k2
p11 = (p11 = 0 ? .001 : p11)
p11 = p11*.01/i8
k2 randi .075,2.4 + (.1*ibright),p17
k2 = (1+k2)*(18*p11)		; % tremolo based on vib.width
k3 oscili p13-p12,1/p3,(p14 = 0 ? 50 : p14)
k3 = k3 + p12			; rate
k4 randi .12*k3,2,p17
k7 = k3+k4
a3 oscili k2*a1,k7,100     	; tremolo
; 2. Random amplitude deviation : k3
a4 randi (p10+1)/2*.07,50/p10,p17       
a4 = a4*a1
; For attack chiff
a2 linseg 0,.08*p6,.045,.1*p6,.025,p10*.4*p6,0,p3,0
a2 = a2*p10*p5
a1 = a1+a2+a3+a4                     ; total amplitude

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

; 2. Random deviation and attack chiff : k3
i5 = (12-i4)*.4
k3 expseg p10*i5,p10*.75*p6,p10*.72*p11,p3,.002
k3 = k3 * (.5*i1)
k4 expseg 999,.2*p6,999,.8*p6,34+p12/p10,p3-p6,46
k3 randi k3,k4

k1 = i1 + k2 + k3             
ifdef([PTSOURCE],[include(CSLIBDIR/Include/lpcptrack.h)])dnl

if i4>8.00 goto only2
; Third Carrier (for notes below c4)
i9 = (8.-i4)*(p18=1?.13:.15)*ibright                ; amplitude % for 3rd carrier
a3 linseg p10*i8*1.35,p10*.5*p6,p10*.7,1/p10*.6*p6,1.08,p6,1,p3-((2*p6)+p7),ibright*.7,p7,.2
a3 = a3*i9*ibright*a1
a1 = a1-a3
a3 foscili a3,k1,10,1+(p16*i8*i8),i8*((p10+1)/2)*ibright*(p18=1?3.:4.),100;carrier 3
; Double Carrier F M                       
only2: a2 linseg p10*i8*.52,p6,.47/i8,p3-p6,.44/i8 
i12 = (p18=1?1:1.15)
a2 = a2*i12*((ibright+1)/2)*a1
a1 = a1 - a2
        
k3 expseg p10*i8*2.8,p10*.5*p6,1.8,.5/p10*p6,2.5,p6,2.2,p3-((2*p6)+(ibright*.9*p7)),2.0,p15*.9*p7,p15*1.5
k6 randi .05,k7
k3 = (k3+k6*k3)*ibright*i8*i12
a1 foscili a1,k1,1.,4+(p16*i8),k3,100      ; carrier 1
a2 foscili a2,k1,2,2.+(p16*i8),.95*k3,100  ; carrier 2(even harmonics)
a1 = a1+a2
if i4>8.00 kgoto formnt
a1 = a1+a3                      ; add third carrier

; FORMANTS
formnt:                                 
i13 = (p18=1?1:.57)
i14 = (p18=1?1:ibright*.7)
k1 linseg p10*i8*3,p10*.04,1,p3,.9
a2 tone a1,(p10+1)/2*k1*680                                
; a3 reson .39/i8*a1,i13*485,ibright*i14*k1*90,1
a3 reson .41/i8*a1,i13*485,ibright*i14*k1*90,1
i10 = (1.5-((10-i4)*.25))/i14     ; scalar: c5=1.25,c4=1.,c3=.75
a4 reson p10*i10*.22*a1,i13*1180,ibright*p10*i14*k1*85,1        
a5 reson p10*ibright*i10*.05*a1,i13*970,p15/i8*p10*i14*k1*70,1
a6 reson p10*ibright*i8*.08*a1,i13*2020,p15*i14*k1*80,1              
if i4> 8.01 kgoto high
if i4<6.8 kgoto lowest
a2 balance (i8*.03*a2)+a3+a4+a5+a6,(i8+1)/2*a1
kgoto mix 
high: a2 areson (1.1/i8*a3)+a4+a5+a6,i13*3000,i14*1200,1                   
a3 reson a3,2*i1,.1*i1,1
a2 balance a2+.75*a3,a1                            
kgoto mix
lowest: i15 = (6.8-i4)*.2
a2 balance (i8*.03*a2)+a3+a4+a5+a6+i15*a1,a1
mix:                                           
i16 = (p10*i8*.7<.95?p10*i8*.7:.95)
a3 expseg i16,p10*i8*.75*p6,i8*i8*.008,p3,i8*i8*.004                        
a1 = (a3*a1)+((1-a3)*a2)
ifelse(NCHNLS,2,[ipan	 = p19
 a2 = a1*sqrt(1-ipan)  ; stereo orchestra : right channel output
a1 = a1*sqrt(ipan)  ; left channel output
])dnl
