(FILECREATED "30-Jul-84 12:34:59" {ERIS}<SPEECH>SPEECHFIX.;6 9046   

      changes to:  (FNS SYNTHESIZE ARRAY.TO.FILE SPEECH.BOUT INVERSELOGTRANSFORMATION 
			MAKE.INVERSE.LOG.TABLE MAKE.LOG.TABLE LOGTRANSFORMATION SPEECH.BIN MEEF)
		   (VARS SPEECHFIXCOMS LOGARRAY INVERSELOGARRAY)

      previous date: "25-Jul-84 22:51:34" {ERIS}<SPEECH>SPEECHFIX.;2)


(* Copyright (c) 1984 by Xerox Corporation. All rights reserved.)

(PRETTYCOMPRINT SPEECHFIXCOMS)

(RPAQQ SPEECHFIXCOMS ((FNS ARRAY.TO.FILE INVERSELOGTRANSFORMATION LOGTRANSFORMATION 
			   MAKE.INVERSE.LOG.TABLE MAKE.LOG.TABLE SPEECH.BIN SPEECH.BOUT 
			   SPEECH.SYNTHSLICE SPEECH.SYNTHTRAJ SYNTHESIZE)
		      (VARS INVERSELOGARRAY LOGARRAY)))
(DEFINEQ

(ARRAY.TO.FILE
  [LAMBDA (FILENAME)                                         (* pkh: "28-Jul-84 17:39")
    (PROG (STREAM)
          (SETQ STREAM (OPENSTREAM (PACKFILENAME 'HOST '{ERIS} 'DIRECTORY '<SPEECH>WAVE>
						 'NAME FILENAME 'EXTENSION 'WAVE)
				   'OUTPUT
				   'OLD/NEW))
          (for I from 1 to (OR (COND
				 ([NOT (EQUAL 'NOBIND (EVALV 'CUTOFF]
				   CUTOFF))
			       (ARRAYSIZE SPEECH.*WAVE*))
	     do (SPEECH.BOUT STREAM (ELT SPEECH.*WAVE* I)))
          (CLOSEF STREAM])

(INVERSELOGTRANSFORMATION
  [LAMBDA (LOGNUM)                                           (* pkh: "27-Jul-84 13:12")

          (* The "Alto" speech board is not linear; we take the log of the synthesizer output (range -128 to 128) and 
	  multiply with 26.38071 to regain the correct dynamic range (=256))


    (FIXR (COND
	    ((>$ LOGNUM 0.0)
	      (ANTILOG (FQUOTIENT LOGNUM 26.38071)))
	    [(<$ LOGNUM 0.0)
	      (0-$ (ANTILOG (0-$ (FQUOTIENT LOGNUM 26.38071]
	    (T 0.0])

(LOGTRANSFORMATION
  [LAMBDA (CODE)                                             (* pkh: "27-Jul-84 12:18")

          (* The "Alto" speech board is not linear; we take the log of the synthesizer output (range -128 to 128) and 
	  multiply with 26.38071 to regain the correct dynamic range (=256))


    (FIXR (COND
	    ((>$ CODE 0.0)
	      (x$ 26.38071 (LOG CODE)))
	    [(<$ CODE 0.0)
	      (x$ 26.38071 (0-$ (LOG (0-$ CODE]
	    (T 0.0])

(MAKE.INVERSE.LOG.TABLE
  [LAMBDA (MIN MAX)                                          (* pkh: "27-Jul-84 15:28")
    (PROG ((INVERSELOGARRAY (ARRAY (ARRAYSIZE LOGARRAY)
				   'FIXP 0 1)))
          (for X from MIN to MAX as N from 1 do (SETA INVERSELOGARRAY N (INVERSELOGTRANSFORMATION
							X)))
          (RETURN INVERSELOGARRAY])

(MAKE.LOG.TABLE
  [LAMBDA (MIN MAX)                                          (* pkh: "27-Jul-84 12:30")
    (PROG ((LOGARRAY (ARRAY (ADD1 (IDIFFERENCE MAX MIN))
			    'FIXP 0 1)))
          (for X from MIN to MAX as N from 1 do (SETA LOGARRAY N (LOGTRANSFORMATION X)))
          (RETURN LOGARRAY])

(SPEECH.BIN
  [LAMBDA (STREAM)                                           (* pkh: "27-Jul-84 18:19")
    (PROG (CODE)                                             (* Comensate for "Alto" speech board format)
          (SETQ CODE (\BIN STREAM))
          [COND
	    ((> CODE 128)                                    (* Get back the negatives)
	      (SETQ CODE (IDIFFERENCE 128 CODE]              (* Shift up for the array)
                                                             (* The signal has range -128 128%, but the array for the
							     log lookup is 1 to 257)
                                                             (* Un logarithmitize)
          (SETQ CODE (FPLUS CODE 129))
          (SETQ CODE (ELT INVERSELOGARRAY CODE))
          (RETURN CODE])

(SPEECH.BOUT
  [LAMBDA (STREAM CODE)                                      (* pkh: "28-Jul-84 16:44")
                                                             (* Compensates for the special file format required by 
							     the "Alto" speech board)
    (PROG [(X (ELT LOGARRAY (IPLUS 129 CODE]

          (* The "Alto" speech board wants all positive (values; we put the negative output from the synthesizer 
	  (-1 to -128) in the 128 to 256 range))


          [COND
	    ((ILESSP X 0)
	      (SETQ X (- 128 X]
          (\BOUT STREAM X)
          (RETURN X])

(SPEECH.SYNTHSLICE
  (LAMBDA (SLICE)                                            (* edited: "25-Jul-84 14:28")
                                                             (* SPEECH.WAVE created according to contents of SLICE We
							     do 4 periods%, then fake the rest.
							     *)
    (COND
      ((NULL SLICE)
	(SETQ SLICE SPEECH.SLICE)))
    (PROG (PERIOD0)
          (COEWAVE.INIT.COEFF SPEECH.COEFF)
          (COEWAVE.INIT.MEMORY SPEECH.MEMORY)                (* PERIOD0 = glottal period. *)
          (SETQ PERIOD0 (/ SR (PVECTOR.F0 SLICE)))
          (COND
	    ((ZEROP PERIOD0)
	      (SETQ PERIOD0 100)))
          (FOR (N ← 1) BY (+ N PERIOD0) WHILE (< N (ARRAYSIZE SPEECH.WAVE)) AS I FROM 1 TO 4
	     DO (PARCOE.PTC SLICE SPEECH.COEFF)
		(COEWAVE.CTW SPEECH.COEFF SPEECH.MEMORY SPEECH.WAVE N (IMIN (+ N PERIOD0 -1)
									    (ARRAYSIZE SPEECH.WAVE))))
          (FOR N FROM (1+ (x 4 PERIOD0)) TO (ARRAYSIZE SPEECH.WAVE)
	     DO (SETF (ELT SPEECH.WAVE N)
		      (ELT SPEECH.WAVE (+ (x 3 PERIOD0)
					  (\ N PERIOD0))))
		(COND
		  (COEWAVE.TRACE (WDISPLAY.DRAWXY N (ELT SPEECH.WAVE N)
						  COEWAVE.WINDOW))))
          (RETURN SPEECH.WAVE))))

(SPEECH.SYNTHTRAJ
  (LAMBDA (TRAJ)                                             (* edited: "25-Jul-84 14:28")
                                                             (* SPEECH.WAVE created according to contents of TRAJ *)
    (COND
      ((NULL TRAJ)
	(SETQ TRAJ SPEECH.TRAJ)))
    (PROG NIL
          (COEWAVE.INIT.COEFF SPEECH.COEFF)
          (COEWAVE.INIT.MEMORY SPEECH.MEMORY)                (* Synthesize%, updating SPEECH.COEFF every 50 samples 
							     *)
          (FOR (N ← 1) BY (+ N 50) WHILE (< N (ARRAYSIZE SPEECH.WAVE))
	     DO (PARCOE.INTERPOLATE N TRAJ SPEECH.SLICE)
		(PARCOE.PTC SPEECH.SLICE SPEECH.COEFF)
		(COEWAVE.CTW SPEECH.COEFF SPEECH.MEMORY SPEECH.WAVE N (IMIN (+ N 49)
									    (ARRAYSIZE SPEECH.WAVE))))
          (RETURN SPEECH.WAVE))))

(SYNTHESIZE
  [LAMBDA (TRANSCRIPTION OUTTOFILEFLG)                       (* pkh: "28-Jul-84 18:15")
    (PROG (STREAM)
          (SETQ USER.TRAJS (SPEAK TRANSCRIPTION))
          (SPEECH.TEST)
          (SETQ STREAM (OPENSTREAM (PACKFILENAME 'HOST '{ERIS} 'DIRECTORY '<SPEECH>WAVE>
						 'NAME TRANSCRIPTION 'EXTENSION 'WAVE)
				   'OUTPUT
				   'OLD/NEW))
          (for I from 1 to (OR (COND
				 ([NOT (EQUAL 'NOBIND (EVALV 'CUTOFF]
				   CUTOFF))
			       (ARRAYSIZE SPEECH.*WAVE*))
	     do (SPEECH.BOUT STREAM (ELT SPEECH.*WAVE* I)))
          (CLOSEF STREAM])
)

(RPAQ INVERSELOGARRAY (READARRAY 257 (QUOTE FIXP) 1))
(-128 -123 -119 -114 -110 -106 -102 -98 -95 -91 -88 -84 -81 -78 -75 -72 -70 -67 -65 -62 -60 -58 -56 
-54 -52 -50 -48 -46 -44 -43 -41 -40 -38 -37 -35 -34 -33 -31 -30 -29 -28 -27 -26 -25 -24 -23 -22 -22 
-21 -20 -19 -19 -18 -17 -17 -16 -15 -15 -14 -14 -13 -13 -12 -12 -11 -11 -10 -10 -10 -9 -9 -9 -8 -8 -8 
-7 -7 -7 -7 -6 -6 -6 -6 -6 -5 -5 -5 -5 -5 -4 -4 -4 -4 -4 -4 -3 -3 -3 -3 -3 -3 -3 -3 -3 -2 -2 -2 -2 -2 
-2 -2 -2 -2 -2 -2 -2 -2 -2 -1 -1 -1 -1 -1 -1 -1 -1 -1 -1 0 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2 2
 2 2 3 3 3 3 3 3 3 3 3 4 4 4 4 4 4 5 5 5 5 5 6 6 6 6 6 7 7 7 7 8 8 8 9 9 9 10 10 10 11 11 12 12 13 13 
14 14 15 15 16 17 17 18 19 19 20 21 22 22 23 24 25 26 27 28 29 30 31 33 34 35 37 38 40 41 43 44 46 48 
50 52 54 56 58 60 62 65 67 70 72 75 78 81 84 88 91 95 98 102 106 110 114 119 123 128 NIL
)

(RPAQ LOGARRAY (READARRAY 257 (QUOTE FIXP) 1))
(-128 -128 -128 -127 -127 -127 -127 -127 -126 -126 -126 -126 -125 -125 -125 -125 -124 -124 -124 -124 
-124 -123 -123 -123 -123 -122 -122 -122 -121 -121 -121 -121 -120 -120 -120 -120 -119 -119 -119 -118 
-118 -118 -118 -117 -117 -117 -116 -116 -116 -115 -115 -115 -114 -114 -114 -113 -113 -112 -112 -112 
-111 -111 -111 -110 -110 -109 -109 -108 -108 -108 -107 -107 -106 -106 -105 -105 -104 -104 -103 -103 
-102 -102 -101 -100 -100 -99 -99 -98 -97 -97 -96 -95 -95 -94 -93 -92 -91 -91 -90 -89 -88 -87 -86 -85 
-84 -83 -82 -80 -79 -78 -76 -75 -73 -71 -70 -68 -66 -63 -61 -58 -55 -51 -47 -42 -37 -29 -18 0 0 0 18 
29 37 42 47 51 55 58 61 63 66 68 70 71 73 75 76 78 79 80 82 83 84 85 86 87 88 89 90 91 91 92 93 94 95 
95 96 97 97 98 99 99 100 100 101 102 102 103 103 104 104 105 105 106 106 107 107 108 108 108 109 109 
110 110 111 111 111 112 112 112 113 113 114 114 114 115 115 115 116 116 116 117 117 117 118 118 118 
118 119 119 119 120 120 120 120 121 121 121 121 122 122 122 123 123 123 123 124 124 124 124 124 125 
125 125 125 126 126 126 126 127 127 127 127 127 128 128 128 NIL
)
(PUTPROPS SPEECHFIX COPYRIGHT ("Xerox Corporation" 1984))
(DECLARE: DONTCOPY
  (FILEMAP (NIL (712 6973 (ARRAY.TO.FILE 722 . 1245) (INVERSELOGTRANSFORMATION 1247 . 1742) (
LOGTRANSFORMATION 1744 . 2202) (MAKE.INVERSE.LOG.TABLE 2204 . 2573) (MAKE.LOG.TABLE 2575 . 2909) (
SPEECH.BIN 2911 . 3712) (SPEECH.BOUT 3714 . 4305) (SPEECH.SYNTHSLICE 4307 . 5554) (SPEECH.SYNTHTRAJ 
5556 . 6370) (SYNTHESIZE 6372 . 6971)))))
STOP