  gktest       init 0
; instrument algorithm ccsampringmod -- audio rate amplitude
; modulation with supression of original frequencies (ring modulation)

	instr	1
inum	notnum
ifno	table	inum, 99	;keyboard mapping to gen1 ftables 

ibasno	table	ifno, 98        ; returns midi notes of the sonudfile samples
ibasoct	=	ibasno/12. + 3.

icps	cpsmidi   ; needed only for CHAN options
kcps	cpsmidib 2 ; pitch with +/- 2 semitone bend from pitch bend wheel

;  ====== MIDI continuous controllers on MCS2:  ========================
        ; mod wheel =   controller 01    Not used in this algorithm
        ; Foot controllers Sliders:
        ; fc2       =   controller # 07    Amplitude (volume)
        ; fc1       =   controller # 04    Not used
        ; Continuous Sliders:
        ; cs1       =   controller # 06    Tremolo depth
        ; cs2       =   controller # 05    Tremolo rate
      
gktest =  gktest + 1    ; test to see if more than one note is playing on this MIDI
                        ; channel, so that these global variables are not recomputed
                        ; unnecessarily
if gktest > 1 kgoto gotcontrollers

     ; fc2 {foot controller 2} controls global AMPLITUDE {"volume"}
   gkfc2    midic7 7, 0, 1  ; foot controller # 2 = midi controller 07 {"volume"}
; "No Legal Opcode error   gkfc2    kpow  gkfc2, 2, 1    ; convert linear to exponential
  gkfc2 = sqrt(gkfc2)

; Audio rate Amplitude Modulation : time varying depth & rate
         ; continuous sliders 1 & 2 on MCS2 :
   gkcs1  midic7 8,0, 1.  ; continuous slider 1 = midi controller # 8
                         ; controls depth of  amplitude modulation
   gkcs2   midic7  5, 0, 4   ; continuous slider 2 = midi controller # 5
                           ; amp mod frequency (* base pitch)
gotcontrollers:

   kcs2     port  gkcs2, .02   ; smooth out abrupt changes in this controller`
amod    oscili .5 * gkcs1, kcs2 * kcps, 100    ; modulating oscillator
amod  = amod + .5       ; rescale output to 0 - 1.
;   ===========  end of MCS2 continuous controller inputs =======================

iatt  =  0  ; default no fade-in to soundfile, modified only for "legato" (left
            ; Clavinola pedal down

; ====== Clavinola pedals, used as 3 foot switches : ===============================
    ; Clavinla RIGHT pedal, MIDI ctrl #  64 (continuous but very poor resolution)
    ; used as a sustain pedal :
isust  imidic7  64, .2, 40
idecay = (isust = 0 ? .2 : isust )  ; "fade-out" time after key released
iatdec  =  .02

   ; Clavinola left and middle pedals
   ; Left pedal (ctrl # 66) creates staccato, CENTER pedal (ctrl # 67) creates legato
    ;  these 2 controllers are NOT continuous -- they are inits (either off or on)
ileftped    imidic7 67, 0, 1.
imidped    imidic7 66, 0, 1.

if imidped > .5 igoto legato  ; if middle ped down, legato articulation
if ileftped > .5 igoto staccato  ; if left ped down, staccato articulation
   igoto gotartic

legato:    ; MIDDLE pedal down
   ; if both left & middle pedals are down, use default normal articulation values
if imidped > .5 igoto gotartic 
      iatt    ampmidi  .5
      iatt  =  .5 - iatt
      iatt  = (iatt < .15 ? 0 : 2.2  * iatt)
      idecay  = 1.3 * idecay
      iatdec  =  .04
      igoto gotartic
staccato:   ; LEFT pedal down
      idecay  = .4 * idecay
      iatdec  =  .006
      igoto gotartic
gotartic:
;  ======= end of Clavinola foot pedal switch controller input ================

iamp	ampmidi	1, 97        ; max amp & non-linear scaling in f97
amp	linenr	iamp, iatt , idecay , .02

  kamp    port  gkfc2, .03   ; smooth out abrupt changes in this controller`
a1	loscil	kamp * amp, kcps , ifno, cpsoct(ibasoct)
amod = amod * a1
amod  balance  amod - a1, amod
a1   =  ((1. - gkcs1) * a1) +  amod
