<info>
ESM Csound Library instrument algorithm ccsampringmod :
midiins algorithm : ccsampringmod
(applies ring modulation to input soundfiles)
Default score file includes the "clarall" functions
(a set of contrabass clarinet, bass clarinet and Bf clarinet tones)
Move the foot pedal before playing or you may get no sound.
CS1 controls amplitude (ring) modulation depth (0 - 100 % )
CS2 controls amplitude modulation  rate (.25 - 4. times base pitch)
Mod wheel has no effect.
Pitch bend wheel affects pitch.
Allan Schindler  1/97
</info>
<tk_interface>


</tk_interface>
<mono>
  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
       out a1 
       endin 
instr 16  ; global instrument
        ; in this algorithm, the only function of this global instrument
        ; is to zero out the gktest variable of the above instrument
        ; the actual global variables {gkfc2, gkcs1, gkcs2 etc.} should NOT be zeroed
gktest  =  0
endin

</mono>
<stereo>


</stereo>
<quad>


</quad>
<score>
; default example  score
;   CLARINET ALL (Bf, bass and contrabass clarinet) function tables 
f1 0 0 -1  "/sflib/wind/cbclar.fs1"  0 0 0; ; dur =  3.49
f2 0 0 -1  "/sflib/wind/cbclar.as1"  0 0 0; ; dur = 3.215
f3 0 0 -1  "/sflib/wind/cbclar.cs2"  0 0 0; ; dur = 3.687
f4 0 0 -1  "/sflib/wind/bclar.fs2"  0 0 0; ; dur = 3.417
f5 0 0 -1  "/sflib/wind/bclar.as2"  0 0 0; ; dur = 2.14
f6 0 0 -1  "/sflib/wind/clar.d3"  0 0 0; ; dur = 3.479
f7 0 0 -1  "/sflib/wind/clar.gs3"  0 0 0; ; dur = 3.55
f8 0 0 -1  "/sflib/wind/clar.cs4"  0 0 0; ; dur = 3.736
f9 0 0 -1  "/sflib/wind/clar.fs4"  0 0 0; ; dur = 3.509
f10 0 0 -1  "/sflib/wind/clar.b4"  0 0 0; ; dur = 3.19
f11 0 0 -1  "/sflib/wind/clar.e5"  0 0 0; ; dur = 4.037
f12 0 0 -1  "/sflib/wind/clar.a5"  0 0 0; ; dur = 3.46
f13 0 0 -1  "/sflib/wind/clar.d6"  0 0 0; ; dur = 3.91

    ; f99 = soundfile function numbers & keymap split points
f99 0 128 -17 0 1 33 2 36 3 40 4 44 5 48 6 53 7 59 8 64
 9 69 10 74 11 79 12 84 13 ; 	
    ; f98 = midi note numbers for base key { soundfile at original pitch}
f98 0  16  -2 0 30 34 37 42 46 50 56 61 66 71 76 81 86;

f97 0 128 5 1 128 33               ;  veloc to non-linear amplitude
f96 0 128 5 .005 120 1. 128 1.     ;  brightness scaling for midisampbright

f100 0 1024 10 1.       ; sine wave control function
 
f0 300 
i16 0.000 300
e 

</score>

