DECLARE SUB ViewLoop ()
DECLARE SUB DETERMIN ()
DECLARE SUB SECTOFOR (T1!, K!)
DECLARE SUB RECORD (tme!)
DECLARE FUNCTION SampleByte% (BP%)
DECLARE SUB WriteDSP (byte%, BP%)
DECLARE SUB SBReset (BP%)
DIM SHARED LS%, LS2%, LS3%, T1, K, DIR$, Y, Y2, VOC, VOC2
DIM SHARED SMP%(32766)
'DIM SHARED SM%(32766)
'DIM SHARED SM2%(3276)
CONST BP% = &H220
CALL SBReset(BP%)
CONST UP = 1
CONST DOWN = 2
SCREEN 12
Y = 0: Y2 = -50
PRINT "SAY: HELLO"
RECORD 20
FOR q = 1 TO 2000
'PRINT SMP%(q)
NEXT q
ViewLoop
SYSTEM

SUB DETERMIN
IF Y = -50 THEN VOC = 80
IF Y = -40 THEN VOC = 70
IF Y = -30 THEN VOC = 60
IF Y = -10 THEN VOC = 50
IF Y = 0 THEN VOC = 40
IF Y = 10 THEN VOC = 16
IF Y = 20 THEN VOC = 22
IF Y = 30 THEN VOC = 28
IF Y = 40 THEN VOC = 34

IF Y2 = -50 THEN VOC2 = 0
IF Y2 = -40 THEN VOC2 = 1
IF Y2 = -30 THEN VOC2 = 2
IF Y2 = -20 THEN VOC2 = 3
IF Y2 = -10 THEN VOC2 = 4
IF Y2 = 0 THEN VOC2 = 5
IF Y2 = 10 THEN VOC2 = 6
IF Y2 = 20 THEN VOC2 = 7
IF Y2 = 30 THEN VOC2 = 8
IF Y2 = 40 THEN VOC2 = 9
END SUB

SUB PLAYBACK
'DETERMIN
'CALL WriteDSP(&HD1, BP%)  'Turn speaker on
'FOR T% = 1 TO LS%
'        CALL WriteDSP(&H10, BP%)
'        CALL WriteDSP(SMP%(T%), BP%)
'        FOR I = 1 TO VOC2: NEXT
'NEXT T%
'FOR T% = 1 TO LS2%
'        CALL WriteDSP(&H10, BP%)
'        CALL WriteDSP(SM%(T%), BP%)
'        FOR I = 1 TO VOC2: NEXT
'NEXT T%
'FOR T% = 1 TO LS3%
'        CALL WriteDSP(&H10, BP%)
'        CALL WriteDSP(SM2%(T%), BP%)
'        FOR I = 1 TO VOC2: NEXT
'NEXT T%
'CALL WriteDSP(&HD3, BP%)  'Turn speaker off
END SUB

SUB RECORD (tme)
T1 = 1: K = 1
SECTOFOR T1, K
DETERMIN
N = 3.5
LS% = tme * 100
FOR t% = 1 TO LS%
        SMP%(t%) = SampleByte(BP%)
        SMP%(t%) = SMP%(t%) * N
        LINE ((t% MOD 640), 128 * N)-((t% MOD 640), SMP%(t%)), 2
        FOR U% = 1 TO VOC: NEXT U%
        IF t% MOD 640 = 0 THEN CLS
NEXT t%
'FOR T% = 1 TO LS2%
'        SM%(T%) = SampleByte(BP%)
'        SM%(T%) = SM%(T%) * N
'        LINE ((T% MOD 640), 128 * N)-((T% MOD 640), SM%(T%)), 2
'        FOR U% = 1 TO 40 + VOC: NEXT U%
'        IF T% MOD 640 = 0 THEN CLS
'NEXT T%
'FOR T% = 1 TO LS3%
'        SM2%(T%) = SampleByte(BP%)
'        SM2%(T%) = SM2%(T%) * N
'        LINE ((T% MOD 640), 128 * N)-((T% MOD 640), SM2%(T%)), 2
'        FOR U% = 1 TO 40 + VOC: NEXT U%
'        IF T% MOD 640 = 0 THEN CLS
'NEXT T%
'BEEP
END SUB

FUNCTION SampleByte% (BP%)
CALL WriteDSP(&H20, BP%)
datavail% = BP% + 14
dly:
        IF INP(datavail%) AND &H80 = 0 THEN GOTO dly
datread% = BP% + 10
bt% = INP(datread%)
SampleByte% = bt%

END FUNCTION

SUB SAYSELECT (FILE$)
CALL WriteDSP(&HD1, BP%)
OPEN FILE$ FOR INPUT AS #1
FOR I% = 1 TO 8000
LINE INPUT #1, A$
SMP%(I%) = ASC(A$)
NEXT
CLOSE
FOR t% = 1 TO 8000
        CALL WriteDSP(&H10, BP%)
        CALL WriteDSP(SMP%(t%), BP%)
NEXT t%
CALL WriteDSP(&HD3, BP%)
END SUB

SUB SBReset (BP%)
dspreset% = BP% + 6
OUT dspreset%, 1
FOR t% = 1 TO 10
        A% = INP(dspreset%)
NEXT t%
OUT dspreset%, 0
dspread% = BP% + 10
FOR t% = 1 TO 10
        A% = INP(dspread%)
NEXT t%
END SUB

SUB SECTOFOR (T1, K)
IF T1 = 1 AND K = 0 THEN LS% = 32766: LS2% = 21844
IF T1 = 1 AND K = 1 THEN LS% = 32766: LS2% = 27305
IF T1 = 1 AND K = 2 THEN LS% = 32766: LS2% = 32766
IF T1 = 1 AND K = 3 THEN LS% = 32766: LS2% = 32766: LS3% = 5461
IF T1 = 1 AND K = 4 THEN LS% = 32766: LS2% = 32766: LS3% = 10922
IF T1 = 1 AND K = 5 THEN LS% = 32766: LS2% = 32766: LS3% = 16383
IF T1 = 1 AND K = 6 THEN LS% = 32766: LS2% = 32766: LS3% = 21844
IF T1 = 1 AND K = 7 THEN LS% = 32766: LS2% = 32766: LS3% = 27305
IF T1 = 1 AND K = 8 THEN LS% = 32766: LS2% = 32766: LS3% = 32766
IF T1 = 0 AND K = 1 THEN LS% = 5461
IF T1 = 0 AND K = 2 THEN LS% = 10922
IF T1 = 0 AND K = 3 THEN LS% = 16383
IF T1 = 0 AND K = 4 THEN LS% = 21844
IF T1 = 0 AND K = 5 THEN LS% = 27305
IF T1 = 0 AND K = 6 THEN LS% = 32766
IF T1 = 0 AND K = 7 THEN LS% = 32766: LS2% = 5461
IF T1 = 0 AND K = 8 THEN LS% = 32766: LS2% = 10922
IF T1 = 0 AND K = 9 THEN LS% = 32766: LS2% = 16383
END SUB

SUB ViewLoop
DIM t AS DOUBLE
N = 3.5
N2 = 2
DO
        t = t + 1
        SP% = SampleByte(BP%)
        SP% = SP% * N
        LINE ((t MOD 640), 128 * N)-((t MOD 640), SP%), 2
        FOR U% = 1 TO VOC: NEXT U%
        IF t MOD 640 = 0 THEN CLS
        IF (SP% / N) MOD 2 = 0 THEN X% = (SP% / N) ELSE X% = (SP% / N) + 1
        IF X% > 125 AND X% < 135 THEN  ELSE SOUND ABS((X% / N2) - 255) * N, 1
LOOP WHILE INKEY$ = ""
END SUB

SUB WriteDSP (byte%, BP%)
dspcmd% = BP% + 12
FOR t% = 1 TO 8
        q% = INP(dspcmd%)
NEXT t%
OUT dspcmd%, byte%
END SUB

