; instrument algorithm "midiplunk" : Karplus-Strong plucked string algorithm,
;  similar to Library score-based instrument "plunk"

	instr	1
icps	cpsmidi
iamp	ampmidi	20000, 97

; some default and scalar values
; scalars
        i2 = octcps(icps)
        i3 = (18. - i2) * .1 ; scalar 
        i4 = 1./i3  ; scalar : 8.00 = 1. | 5.00 = .77 | 12.00 = 1.67
        i5 = i4 * i4 ; 8.00 = 1. | 5.00 = .625 | 12.00 = 2.78
        ibuffer = (i2 < 8. ? icps : icps/i5/i5)  ; large buffer for high pitches
iamp = iamp * i5

; ------ Clavinola pedals :  ------------------------
iatt = .03
    ; Clavinla RIGHT pedal, MIDI ctrl #  64 (continuous but very poor resolution)
    ; used as a sustain pedal :
     ; midictrl opcodes obsolete as of Csond 3.48
     ; these two lines & other midictrl lines below changed to imidic7
     ; by A.S. on 10/28/98
     ; isust  midictrl  64 
     ;idecay = (isust = 0 ? .2 : .4 * isust )  ; "fade-out" time after key released
isust  imidic7  64, .2, 40
idecay = (isust = 0 ? .2 : isust )  ; "fade-out" time after key released
iatdec  =  .02
idur = 6.

   ; Clavinola left and middle pedals
ileftped    imidic7 67, 0, 1.
imidped    imidic7 66, 0, 1.

 ; ----- pluck timbral "method"

   ;if ileftped > 2. igoto left  ; left ped is down
   ;if imidped > 2. igoto mid  ; middle ped is down
if ileftped > .5 igoto left  ; left ped is down
if imidped > .5 igoto mid  ; middle ped is down

default:  ; default decay method = stretched averaging when neither left nor middle
          ; pedal is down
        imeth = 2    ; stretched averaging method
    ;  iparm1 stretch factor, must be >=1 , decay rate of upper partials
        iveloc  ampmidi  .95  
        iparm1 = (iveloc + 1.) * i4 * .6
        iparm1 = (iparm1 > 1.01 ? iparm1 : 1.01)
        iparm1 = (iparm1 < 1.8 ? iparm1 : 1.8)
igoto gotmethod

left:    ;  use weighted averaging decay method
   ;  if both left & middle pedals are down, use default normal articulation values
if imidped > .5 igoto default 
   imeth = 5
   idur = 1
   iveloc  ampmidi  .7
   iparm1 =  (iveloc * i4 + .4)
   iparm1 =  (iparm1 < .7 ? iparm1 : .7)
   iparm1 = iparm1 + .3
   iparm2 =  (i4 * .5) * iparm1
   iparm1 =  iparm1 - iparm2
   iamp = iamp * i5 ; extra boost for high pitches & atten. for low pitches

igoto gotmethod
mid:   ;  use 1st order filter decay method
   imeth = 6
   idur = 4.
   iamp = iamp * i5 ; extra boost for high pitches & atten. for low pitches
; ;  ------- end of pedal controller input ----------
gotmethod:

kamp	expon	iamp, idur, iamp/icps   ;freq-dependent overall decay
kamp	linenr	kamp, iatt, idecay , iatdec
a1	pluck	kamp, icps, ibuffer, 0 , imeth , iparm1 , iparm2
