; ### Eastman Orchestra Library Instrument  r_e_s_y_n ###
; linear predictor resynthesis instrument
; p4  lp.m#
; p5 = amplitude multiplier (default 0 = 1.)
; p6  time in orig. s.f. to begin read-in
; p7  time in orig. s.f. to end read-in ;
;     if 0 = p3 - p6
;     if neg. = index to tables 96 & 97, but DO NOT USE  0 (start with -1)
; p8  number of harmonics for buzz (pos. = highest pch or cps, neg. = actual
;      number of harmonics)
; OPTIONAL PARAMETERS :
; p9  flag : 0,1 or 2
;    if 0, ptrack kcps used, p10 is multiplier
;    if 1,  "   "    "   " , p10 is transposition, in semitones (or microtones)
;    if 2 , ptrack analysis NOT used, p10 is new fixed pitch, in pch or cps
; p10  mulitplier or offset for pitch, or new pitch
; p11 multiplier for formants (lpfreson) ; if 0, = p9
; p12 fade-in time;  p13  fade-out time (zeros are ok)
; p14 brightness modifier : range is -1 (least bright) to +1 (brightest)
;     0 = no change
; p15 modifies % noise in driver : range is -1. (no noise) to +1. (all noise)
;     0 = default % based on kerr

instr	resyn
p5 = (p5 = 0? 1: p5)
; READ IN LP.M FILE
; if p7 <= 0 igoto tables
if p7 < 0 igoto tables
	i3 = (p7 = 0 ? p3-p6 : p7)    ; default dur. is p3-p6
	i4 init p6
	igoto doit
tables: i4 table abs(p7), 96          ; f96 is table of skips (p6 ignored)
	i3 table abs(p7), 97          ; f97 is table of surs.
	igoto doit
doit:   ktime	line  i4, p3, i3
krmsr,krmso,kerr,kcps	lpread	ktime, p4
a1 = 0            ; needed only if skipping to end (next line)
if krmso = 0 kgoto output ;skip resynthesis during silences in orig. soundfile
	;	display	kerr, p3
	;	display	krmsr, p3
	;	display	krmso, p3
;PITCH
if p9 > 0 goto case2
	; if p9 = 0, pitch = p10 * kcps (from ptrack analysis file)
	p10 = (p10=0 ? 1 : p10)
	i1 = p10   ; multiplier for kcps
	kcps = kcps * i1
	goto gotpitch
case2:	if p9 > 1 goto case3
 ; if p9 = 1, int (p10) = semitone freq. offset, frac (p10) = microtonal offset
	i6 init 0
	i1 init 1.
	doitagain:   ; stupid loop, but it works
	      i6 = i6+1   ; counter
	      i7 =  (p10 > 0 ? 1.05946 : .94387) ; 1/2 step freqency ratios
	      i10 = (int(p10) = 0 ? 1 : i7)
	      i1 = i1*i10  ; multiplier for kcps
	      i8 = abs(p10)
	      if i6 < int(i8) igoto doitagain
        i9 = i7-1           ; microtonal frequency offset
	i9 = frac(i8) * i9
	i1 = i1 + i9        ; add microtonal frequency ratio, if any
	kcps = kcps * i1
	goto gotpitch
case3:	; if p9 = 2, p10 = new pitch (cps or pch); ptrack file NOT USED
	i1 = (p10 < 13.01 ? cpspch(p10) : p10)
	kcps = i1
gotpitch:
; NUMBER OF HARMONICS FOR BUZZ :
if p8 > 0 igoto getit
	inum = abs(p8)
        inum = (inum = 0 ? 1 : inum)
	igoto gotit
getit:  i2 = (p8 < 13.01 ? cpspch(p8) : p8)
	inum = (sr/2 < 12000? sr/2 : 12000) ; no freqs. > Nyquist or 12000
	inum = int(inum/i2)
		; the p5 multipler in next line is to help when Samps. out 
		;of range produced ; it could probably be omitted
gotit:  krmsr = p5 * krmsr
		inumberofharmonics = inum
		print inumberofharmonics
; VOICED SOURCE :
apitch	buzz	krmsr, kcps, inum, 1
; UNVOICED SOURCE :
asig  rand krmsr
if kerr > .3  kgoto res
kdiff = (.3 - kerr) * 3.33
kdiff = (kdiff > .03 ? kdiff : .03)
; MODIFY % NOISE WITH P15:
	if p15 = 0 goto mixem
	if p15 < 0 goto lessnoise
	; for positive p15 values up to +1., noise % increased
	kdiff = kdiff - p15
	kdiff = (kdiff > 0 ? kdiff : 0)
	goto mixem
lessnoise:  ; for negative p15 values down to -1., noise % decreased
	i13 = abs(p15)
	kdiff = kdiff + i13
	kdiff = (kdiff < 1.? kdiff : 1.)
mixem: asig = (kdiff * apitch) + ((1-kdiff) * asig)  ; mix voc. & unvoc. sources
; SUPPLY FORMANTS :
; i5 = transposition of formant frequencies
if p9 = 2 igoto case3formants
   i5 = (p11 = 0 ? i1 : p11 )  ; if p11 0, Formant_Shift = pitch_Shift (if any)
   igoto res
case3formants: i5 = (p11 = 0 ? 1. : p11)  ; if p11 = 0 or 1, no Formant Shift
res:   asig  lpfreson  asig,i5
; BRIGHTNESS
if p14 = 0 goto fade
	ihi = p14+1
	ilo = (2 - ihi)
	i12 = (ihi + 1)/2
	asiglo reson  p5*.4*asig, i12 * kcps, i12 * 1.5 * kcps , 1
	asighi areson p5*.4*asig, i12 * kcps, i12 * 1.5 * kcps , 1
	asig balance (ihi * asighi) + (ilo * asiglo), asig
fade:   ; FADE-IN & FADE-OUT :
	p12 = (p12 = 0 ? .0001 : p12)
	p13 = (p13 = 0 ? .0001 : p13)
	kfade  expseg  .005, p12, p5, p3 - (p12+p13), p5, p13 , .005
	a1 = asig * kfade
output:

