8;;; -*- syntax: common-lisp; base: 10; mode: lisp -*-

;;; from VOIDAT.SAI[220,JDC] and GLSVOI.SAI[220,JDC]

(defvar fnc nil)
  ;; fnc[sex,vowel,formant number,formant freq,amp or fm index]
(defvar vibfreqfun nil)
(defvar i3fun1 nil)
(defvar i3fun2 nil)

(defun flipxy (env)
  (loop for y in env by #'cddr and 
            x in (cdr env) by #'cddr
    collect x 
    collect y))

(defun addenv (env1 sc1 off1 env2 sc2 off2)
  (envelope+ (scale-envelope env1 sc1 off1)
	(scale-envelope env2 sc2 off2)))

(defun checkpt (att dur)
  (if (or (zerop att)
	  (minusp att))
      (* 100 (/ .01 dur))
    (if (< att dur)
	(* 100 (/ att dur))
      100)))

(defun fillfnc ()
  (when (null fnc)

    (setf fnc (make-array '(3 6 4 4) :initial-element nil))
    (setf vibfreqfun (make-array 3 :initial-element nil))
    (setf i3fun1 (make-array 3 :initial-element nil))
    (setf i3fun2 (make-array 3 :initial-element nil))

    (setf (aref fnc 1 1 1 1) (flipxy '(350  130.8 524  261.6 392  392 523 523.2 784 784 1046 1064 1568 1568)))
    (setf (aref fnc 1 1 1 2) (flipxy '(.3   130.8   .8 261.6   .9 392  .9 523.2  .7 784   .86 1064 .86  1568)))
    (setf (aref fnc 1 1 1 3) (flipxy '(1.4  130.8  1.4 261.6  1.0 392  .8 523.2  .5 784   .3 1064 .2 1568)))
    (setf (aref fnc 1 1 2 1) (flipxy '(1100 130.8 1100 261.6 1100 392 1200 523.2 1500 784 1800 1064 2200 1568)))
    (setf (aref fnc 1 1 2 2) (flipxy '(.1   130.8   .2 261.6   .3 392   .3 523.2   .1 784  .05 1064 .05  1568)))
    (setf (aref fnc 1 1 2 3) (flipxy '(1.0  130.8  1.0 261.6   .4 392   .4 523.2   .2 784   .2 1064 .1 1568)))
    (setf (aref fnc 1 1 3 1) (flipxy '(3450 130.8 3400 261.6 3400 392 3600 523.2 4500 784 5000 1064 5800 1568)))
    (setf (aref fnc 1 1 3 2) (flipxy '(.04  130.8  .04 261.6  .04 392 .045 523.2  .03 784  .02 1064 .02  1568)))
    (setf (aref fnc 1 1 3 3) (flipxy '(3.5  130.8  2.0 261.6  1.5 392  1.2 523.2   .8 784   .8 1064 1.0  1568)))
    (setf (aref fnc 1 2 1 1) (flipxy '(175  130.8 262  261.6 392  392 523 523.2 784 784 1046 1064 1568 1568)))
    (setf (aref fnc 1 2 1 2) (flipxy '(.25  130.8   .6 261.6   .6 392  .6 523.2  .7 784   .86 1064 .86  1568)))
    (setf (aref fnc 1 2 1 3) (flipxy '(0.5  130.8  0.3 261.6  0.1 392 .05 523.2 .04 784  .03 1064 .02 1568)))
    (setf (aref fnc 1 2 2 1) (flipxy '(2900 130.8 2700 261.6 2600 392 2400 523.2 2300 784 2200 1064 2100 1568)))
    (setf (aref fnc 1 2 2 2) (flipxy '(.01  130.8  .05 261.6  .08 392   .1 523.2   .1 784  .1  1064 .05  1568)))
    (setf (aref fnc 1 2 2 3) (flipxy '(1.5  130.8  1.0 261.6  1.0 392  1.0 523.2  1.0 784  1.0 1064 .5 1568)))
    (setf (aref fnc 1 2 3 1) (flipxy '(4200 130.8 3900 261.6 3900 392 3900 523.2 3800 784 3700 1064 3600 1568)))
    (setf (aref fnc 1 2 3 2) (flipxy '(.01  130.8  .04 261.6  .03 392 .03  523.2  .03 784  .03 1064 .02  1568)))
    (setf (aref fnc 1 2 3 3) (flipxy '(1.2  130.8   .8 261.6   .8 392   .8 523.2   .8 784   .8 1064 .5  1568)))
    (setf (aref fnc 1 3 1 1) (flipxy '(175  130.8 262  261.6 392  392 523 523.2 784 784 1046 1064 1568 1568)))
    (setf (aref fnc 1 3 1 2) (flipxy '(.3   130.8   .7 261.6   .8 392  .6 523.2  .7 784   .86 1064 .86  1568)))
    (setf (aref fnc 1 3 1 3) (flipxy '(0.4  130.8  0.2 261.6  0.4 392 .4  523.2 .7  784  .5  1064 .2  1568)))
    (setf (aref fnc 1 3 2 1) (flipxy '(1000 130.8 1000 261.6 1100 392 1200 523.2 1400 784 1800 1064 2200 1568)))
    (setf (aref fnc 1 3 2 2) (flipxy '(.055 130.8  .1  261.6  .15 392  .13 523.2   .1 784  .1  1064 .05  1568)))
    (setf (aref fnc 1 3 2 3) (flipxy '(0.3  130.8  0.4 261.6  0.4 392  0.4 523.2  0.3 784  0.2 1064 0.1  1568)))
    (setf (aref fnc 1 3 3 1) (flipxy '(2600 130.8 2600 261.6 3000 392 3400 523.2 4500 784 5000 1064 5800 1568)))
    (setf (aref fnc 1 3 3 2) (flipxy '(.005 130.8  .03 261.6  .04 392  .04 523.2  .02 784  .02 1064 .02  1568)))
    (setf (aref fnc 1 3 3 3) (flipxy '(1.1  130.8  1.0 261.6  1.2 392 1.2  523.2  0.8 784  0.8 1064 1.0  1568)))
    (setf (aref fnc 1 4 1 1) (flipxy '(353  130.8 530  261.6 530  392 523 523.2 784 784 1046 1064 1568 1568)))
    (setf (aref fnc 1 4 1 2) (flipxy '(.5   130.8   .8 261.6   .8 392  .6 523.2  .7 784   .86 1064 .86  1568)))
    (setf (aref fnc 1 4 1 3) (flipxy '(0.6  130.8  0.7 261.6  1.0 392 0.8 523.2  .7 784  .5  1064 .2  1568)))
    (setf (aref fnc 1 4 2 1) (flipxy '(1040 130.8 1040 261.6 1040 392 1200 523.2 1400 784 1800 1064 2200 1568)))
    (setf (aref fnc 1 4 2 2) (flipxy '(.050 130.8  .05 261.6  .1  392  .2  523.2   .1 784  .1  1064 .05  1568)))
    (setf (aref fnc 1 4 2 3) (flipxy '(0.1  130.8  0.1 261.6  0.1 392  0.4 523.2  0.3 784  0.2 1064 0.1  1568)))
    (setf (aref fnc 1 4 3 1) (flipxy '(2695 130.8 2695 261.6 2695 392 3400 523.2 4500 784 5000 1064 5800 1568)))
    (setf (aref fnc 1 4 3 2) (flipxy '( .05 130.8  .05 261.6  .04 392  .04 523.2  .02 784  .02 1064 .02  1568)))
    (setf (aref fnc 1 4 3 3) (flipxy '(1.2  130.8  1.2 261.6  1.2 392 1.2  523.2  0.8 784  0.8 1064 1.0  1568)))
    (setf (aref fnc 1 5 1 1) (flipxy '(175  130.8 262  261.6 392  392 523 523.2 784 784 1046 1064 1568 1568)))
    (setf (aref fnc 1 5 1 2) (flipxy '(.4   130.8   .4 261.6   .8 392  .8 523.2  .8 784   .8 1064 .8   1568)))
    (setf (aref fnc 1 5 1 3) (flipxy '(0.1  130.8  0.1 261.6  0.1 392 0.1 523.2  .0 784  .0  1064 .0  1568)))
    (setf (aref fnc 1 5 2 1) (flipxy '( 350 130.8  524 261.6  784 392  950 523.2 1568 784 2092 1064 3136 1568)))
    (setf (aref fnc 1 5 2 2) (flipxy '(.8   130.8  .8  261.6  .4  392  .2  523.2   .1 784  .1  1064 .0   1568)))
    (setf (aref fnc 1 5 2 3) (flipxy '(0.5  130.8  0.1 261.6  0.1 392  0.1 523.2  0.0 784  0.0 1064 0.0  1568)))
    (setf (aref fnc 1 5 3 1) (flipxy '(2700 130.8 2700 261.6 2500 392 2450 523.2 2400 784 2350 1064 4500 1568)))
    (setf (aref fnc 1 5 3 2) (flipxy '( .1  130.8  .15 261.6  .15 392  .15 523.2  .15 784  .1  1064 .1   1568)))
    (setf (aref fnc 1 5 3 3) (flipxy '(2.0  130.8  1.6 261.6  1.6 392 1.6  523.2  1.6 784  1.6 1064 1.0  1568)))
    (setf (aref fnc 2 1 1 1) (flipxy '( 33   16.5  33   24.5  33 32.7  49  49.0  65 65.41    98   98 131 130.8)))
    (setf (aref fnc 2 1 1 2) (flipxy '( .3   16.5  .5   24.5  .6 32.7  .5  49.0  .47 65.41   .135 98 .2  130.8)))
    (setf (aref fnc 2 1 1 3) (flipxy '(2.4   16.5  2.0  24.5 1.8 32.7 1.6  49.0  1.5 65.41    1.2 98 .8  130.8)))
    (setf (aref fnc 2 1 2 1) (flipxy '(400   16.5  400  24.5 400 32.7  400 49.0 400 65.41    400  98 400 130.8)))
    (setf (aref fnc 2 1 2 2) (flipxy '( .2   16.5  .2   24.5 .35 32.7  .37 49.0  .4  65.41   .6   98 .8  130.8)))
    (setf (aref fnc 2 1 2 3) (flipxy '(6.0   16.5  5.0  24.5 4.0 32.7 3.0  49.0  2.7 65.41    2.2 98 1.8  130.8)))
    (setf (aref fnc 2 1 3 1) (flipxy '(2142  16.5  2142 24.5 2142 32.7 2142 49.0 2142 65.41 2142 98 2142 130.8)))
    (setf (aref fnc 2 1 3 2) (flipxy '(.02   16.5  .025 24.5 .05  32.7  .09 49.0  .13 65.41  .29 98 .4  130.8)))
    (setf (aref fnc 2 1 3 3) (flipxy '(9.0   16.5  8.0  24.5 7.2  32.7 5.5  49.0  3.9 65.41   3.0 98 1.8  130.8)))
    (setf (aref fnc 2 2 1 1) (flipxy '( 33   16.5  33   24.5  33 32.7  49  49.0  65  65.41    98  98 131 130.8)))
    (setf (aref fnc 2 2 1 2) (flipxy '( .75  16.5  .83  24.5 .91 32.7 .91  49.0  .91 65.41   .79  98 .67 130.8)))
    (setf (aref fnc 2 2 1 3) (flipxy '(2.5   16.5  2.5  24.5 2.5 32.7 2.1  49.0  1.8 65.41    1.4 98 1.0  130.8)))
    (setf (aref fnc 2 2 2 1) (flipxy '(1500  16.5 1500 24.5 1500 32.7 1500 49.0 1500 65.41   1500 98 1500 130.8)))
    (setf (aref fnc 2 2 2 2) (flipxy '( .01  16.5  .02  24.5 .02 32.7  .02 49.0  .02 65.41   .08  98 .08 130.8)))
    (setf (aref fnc 2 2 2 3) (flipxy '(1.5   16.5  1.37 24.5 1.25 32.7 1.07 49.0 0.9 65.41    0.7 98 0.5  130.8)))
    (setf (aref fnc 2 2 3 1) (flipxy '(2300  16.5  2300 24.5 2300 32.7 2325 49.0 2350 65.41 2375 98 2400 130.8)))
    (setf (aref fnc 2 2 3 2) (flipxy '(.05   16.5  .065 24.5 .70  32.7  .07 49.0  .07 65.41  .16 98 .2  130.8)))
    (setf (aref fnc 2 2 3 3) (flipxy '(11.0  16.5  10.0 24.5 10.0 32.7 7.7  49.0  5.4 65.41   3.7 98 2.0  130.8)))
    (setf (aref fnc 2 3 1 1) (flipxy '( 33   16.5  33   24.5  33 32.7  49  49.0  65  65.41    98  98 131 130.8)))
    (setf (aref fnc 2 3 1 2) (flipxy '( .75  16.5  .83  24.5 .87 32.7 .88  49.0  .90 65.41   .87  98 .85 130.8)))
    (setf (aref fnc 2 3 1 3) (flipxy '(1.4   16.5  1.4  24.5 1.4 32.7 1.4  49.0  1.4 65.41    1.4 98 1.4  130.8)))
    (setf (aref fnc 2 3 2 1) (flipxy '( 450  16.5  450 24.5  450 32.7  450 49.0  450 65.41    450 98 450 130.8)))
    (setf (aref fnc 2 3 2 2) (flipxy '( .01  16.5  .02  24.5 .08 32.7 .065 49.0  .05 65.41   .05  98 .05 130.8)))
    (setf (aref fnc 2 3 2 3) (flipxy '(3.0   16.5  2.6  24.5 2.1  32.7 1.75 49.0 1.4 65.41   1.05 98 0.7  130.8)))
    (setf (aref fnc 2 3 3 1) (flipxy '(2100  16.5  2100 24.5 2100 32.7 2125 49.0 2150 65.41 2175 98 2100 130.8)))
    (setf (aref fnc 2 3 3 2) (flipxy '(.05   16.5  .05  24.5 .05  32.7  .05 49.0  .05 65.41 .075 98 .1  130.8)))
    (setf (aref fnc 2 3 3 3) (flipxy '( 9.0  16.5   8.0 24.5  7.0 32.7 4.5  49.0  2.1 65.41  1.75 98 1.4  130.8)))
    (setf (aref fnc 2 4 1 1) (flipxy '( 33   16.5  33   24.5  33 32.7  49  49.0  65  65.41    98  98 131 130.8)))
    (setf (aref fnc 2 4 1 2) (flipxy '( .35  16.5  .40  24.5 .43 32.7 .47  49.0  .50 65.41   .57  98 .45 130.8)))
    (setf (aref fnc 2 4 1 3) (flipxy '(1.4   16.5  1.4  24.5 1.0 32.7 1.0  49.0  1.0 65.41    1.1 98 1.0  130.8)))
    (setf (aref fnc 2 4 2 1) (flipxy '( 300  16.5  300 24.5  300 32.7  300 49.0  300 65.41    300 98 300 130.8)))
    (setf (aref fnc 2 4 2 2) (flipxy '( .75  16.5  .80  24.5 .85 32.7 .90  49.0  .95 65.41   .99  98 .99 130.8)))
    (setf (aref fnc 2 4 2 3) (flipxy '(3.0   16.5  2.5  24.5 2.0  32.7 1.9  49.0 1.8 65.41   1.65 98 0.25 130.8)))
    (setf (aref fnc 2 4 3 1) (flipxy '(2200  16.5  2200 24.5 2200 32.7 2225 49.0 2250 65.41 2275 98 2300 130.8)))
    (setf (aref fnc 2 4 3 2) (flipxy '(.02   16.5  .02  24.5 .02  32.7 .035 49.0  .05 65.41 .07  98 .05  130.8)))
    (setf (aref fnc 2 4 3 3) (flipxy '( 5.0  16.5   4.0 24.5  3.0 32.7 2.8  49.0  2.6 65.41  1.9  98 1.2  130.8)))
    (setf (aref fnc 2 5 1 1) (flipxy '(175   16.5  262  24.5 392 32.7  523 49.0  784 65.41  1046  98 1568 130.8)))
    (setf (aref fnc 2 5 1 2) (flipxy '( .40  16.5  .40  24.5 .80 32.7 .80  49.0  .80 65.41   .80  98 .80 130.8)))
    (setf (aref fnc 2 5 1 3) (flipxy '(0.1   16.5  0.1  24.5 0.1 32.7 0.1  49.0  0.0 65.41    0.0 98 0.0  130.8)))
    (setf (aref fnc 2 5 2 1) (flipxy '( 350  16.5  524 24.5  784 32.7  950 49.0 1568 65.41   2092 98 3136 130.8)))
    (setf (aref fnc 2 5 2 2) (flipxy '( .80  16.5  .80  24.5 .40 32.7 .20  49.0  .10 65.41   .10  98 .00 130.8)))
    (setf (aref fnc 2 5 2 3) (flipxy '(0.5   16.5  0.1  24.5 0.1  32.7 0.1  49.0 0.0 65.41   0.0  98 0.0  130.8)))
    (setf (aref fnc 2 5 3 1) (flipxy '(2700  16.5  2700 24.5 2500 32.7 2450 49.0 2400 65.41 2350 98 4500 130.8)))
    (setf (aref fnc 2 5 3 2) (flipxy '(.10   16.5  .15  24.5 .15  32.7 .15  49.0  .15 65.41 .10  98 .10  130.8)))
    (setf (aref fnc 2 5 3 3) (flipxy '( 2.0  16.5   1.6 24.5  1.6 32.7 1.6  49.0  1.6 65.41  1.5  98 1.0  130.8)))

    ;; these are vibrato frequencies functions (pitch dependent);

    (setf (aref vibfreqfun 1) (flipxy '(4.5 138.8 5 1568)))
    (setf (aref vibfreqfun 2) (flipxy '(4.5  16.5 5 130.8)))

    ;; these are index functions for cascade modulater (pitch dependent);

    (setf (aref i3fun1 1) (flipxy '(4 138.8 4 784 1 1568)))
    (setf (aref i3fun1 2) (flipxy '(4  16.5 4 65.41 1 130.8)))

    (setf (aref i3fun2 1) (flipxy '(.4 138.8 .1 1568)))
    (setf (aref i3fun2 2) (flipxy '(.4  16.5 .1 130.8)))))

(defun fncval (ptr pitch)
  (envelope-interp pitch ptr))

(definstrument fm-voice (beg dur pitch amp vowel-1 sex-1 ampfun1 ampfun2 ampfun3 indxfun skewfun vibfun ranfun
			 dis pcrev deg vibscl pcran skewscl ranpower glissfun glissamt)
  (fillfnc)
  (let* ((c 261.62)
	 (vowel (floor vowel-1))
	 (sex (floor sex-1))
	 (ampref (expt amp .8))
	 (deg (- deg 45))
	 (vibfreq (fncval (aref vibfreqfun sex) pitch))
	 (vibpc (* .01 (/ (log pitch) (log 2)) (+ .15 (sqrt amp)) vibscl))
	 (ranfreq 20)
	 (ranpc (* .002 (/ (log pitch) (log 2)) (- 2 (expt amp .25)) pcran))
	 (skewpc (if (= sex 1)
		     (* (sqrt (+ .1 (* .05 ampref (- 1568 130.8)))) skewscl)
		   (* (sqrt (+ .1 (* .05 ampref (- 130.8 16.5)))) skewscl)))
	 (form1 (/ (fncval (aref fnc sex vowel 1 1) pitch) pitch))
	 (form2 (/ (fncval (aref fnc sex vowel 2 1) pitch) pitch))
	 (form3 (/ (fncval (aref fnc sex vowel 3 1) pitch) pitch))
	 (fmntfreq1 (round form1))
	 (fmntfreq2 (round form2))
	 (fmntfreq3 (round form3))
	 (fm2 3)
	 (mscale 1)
	 (mconst 0)
	 (mfq (+ (* pitch mscale) mconst))
	 (freqratios1 fm2)
	 (freqratios2 mscale)
	 (freqratios3 mscale)
	 (freqratios4 mscale)
	 (freqratios5 fmntfreq1)
	 (freqratios6 fmntfreq2)
	 (freqratios7 fmntfreq3)
	 (amp1 (sqrt amp))
	 (amp2 (expt amp 1.5))
	 (amp3 (* amp amp))
	 (formscl1 (abs (- form1 fmntfreq1)))
	 (formscl2 (abs (- form2 fmntfreq2)))
	 (formscl3 (abs (- form3 fmntfreq3)))
	 (caramp1sc (* (fncval (aref fnc sex vowel 1 2) pitch) (- 1 formscl1) amp1))
	 (caramp2sc (* (fncval (aref fnc sex vowel 2 2) pitch) (- 1 formscl2) amp2))
	 (caramp3sc (* (fncval (aref fnc sex vowel 3 2) pitch) (- 1 formscl3) amp3))
	 (scdev1 (fncval (aref fnc sex vowel 1 3) pitch))
	 (scdev2 (fncval (aref fnc sex vowel 2 3) pitch))
	 (scdev3 (fncval (aref fnc sex vowel 3 3) pitch))
	 (indx0 (if (or (= vowel 3) (= vowel 4)) 0 1.5))
	 (indx1 1)
	 (i3 (if (< pitch (/ c 2)) (fncval (aref i3fun1 sex) pitch) (fncval (aref i3fun2 sex) pitch)))
	 (dev (hz->radians (* i3 mfq)))
	 (dev0 (hz->radians (* indx0 mfq)))
	 (dev1 (hz->radians (* (- indx1 indx0) mfq))))
    (let* ((gens1 (make-oscil :frequency 0))
	   (gens2 (make-oscil :frequency 0 :initial-phase (/ pi 2.0)))
	   (gens2ampenv (make-env :envelope indxfun  :duration dur
				  :scaler (* scdev1 dev1)
				  :offset (* scdev1 dev0)))
	   (gens3 (make-oscil :frequency 0 :initial-phase (/ pi 2.0)))
	   (gens3ampenv (make-env :envelope indxfun  :duration dur
				  :scaler (* scdev2 dev1)
				  :offset (* scdev2 dev0)))
	   (gens4 (make-oscil :frequency 0 :initial-phase (/ pi 2.0)))
	   (gens4ampenv (make-env :envelope indxfun  :duration dur
				  :scaler (* scdev3 dev1)
				  :offset (* scdev3 dev0)))
	   (gens5 (make-oscil :frequency 0))
	   (gens5ampenv (make-env :envelope ampfun1 :duration dur
				  :scaler (* amp caramp1sc .75)))
	   (gens6 (make-oscil :frequency 0))
	   (gens6ampenv (make-env :envelope ampfun2 :duration dur
				  :scaler (* amp caramp2sc .75)))
	   (gens7 (make-oscil :frequency 0))
	   (gens7ampenv (make-env :envelope ampfun3 :duration dur
				  :scaler (* amp caramp3sc .75)))
	   (freqenv (make-env :envelope (addenv glissfun (* glissamt pitch) 0 skewfun (* skewpc pitch) pitch) :duration dur
			      :scaler (hz->radians 1.0)))
	   (pervenv (make-env :envelope vibfun :duration dur
			      :scaler vibpc))
	   (ranvenv (make-env :envelope ranfun :duration dur
			      :scaler ranpc))
	   (per-vib (make-triangle-wave :frequency vibfreq
					:amplitude (hz->radians pitch)))
	   (ran-vib (make-rand-interp :frequency ranfreq
				:amplitude (hz->radians pitch)))
	   (loc (make-locsig :degree deg :distance dis :reverb pcrev))
	   (vib 0.0)
	   (cascadeout 0.0)
	   (start (floor (* *srate* beg)))
	   (end (+ start (floor (* *srate* dur)))))
      (run
       (loop for i from start to end do
	 (setf vib (+ (env freqenv) 
		      (* (env pervenv) 
			 (triangle-wave per-vib)) 
		      (* (env ranvenv) 
			 (rand-interp ran-vib))))
	 (setf cascadeout (* dev (oscil gens1 (* vib freqratios1))))
	 (locsig loc i (+ (* (env gens5ampenv) 
			     (oscil gens5 (+ (* vib freqratios5) 
					     (* (env gens2ampenv) 
						(oscil gens2 (+ cascadeout (* vib freqratios2)))))))
			  (* (env gens6ampenv) 
			     (oscil gens6 (+ (* vib freqratios6)
					     (* (env gens3ampenv) 
						(oscil gens3 (+ cascadeout (* vib freqratios3)))))))
			  (* (env gens7ampenv) 
			     (oscil gens7 (+ (* vib freqratios7)
					     (* (env gens4ampenv) 
						(oscil gens4 (+ cascadeout (* vib freqratios4))))))))))))))


;;;(let ((ampf '(0 0 1 1 2 1 3 0))) 
;;;  (with-sound (:wait t) (fm-voice 0 1 300 .8 3 1 ampf ampf ampf ampf ampf ampf ampf 1 0 0 .25 1 .01 0 ampf .01)))

#|
(defmacro voi (beg dur pitch amp vowel-1 sex-1 ampfun1 ampfun2 ampfun3 indxfun skewfun vibfun ranfun
	       dis pcrev deg vibscl skewscl ranpower)
  `(fm-voice ,beg ,dur ,pitch ,amp ,vowel-1 ,sex-1 ,ampfun1 ,ampfun2 ,ampfun3 ,indxfun ,skewfun ,vibfun ,ranfun
		  ,dis ,pcrev ,deg ,vibscl 0 ,skewscl ,ranpower '(0 0 100 0)))
|#
