home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Nibble Magazine
/
nib30b.dsk
/
ASE.bas
< prev
next >
Wrap
BASIC Source File
|
2023-02-26
|
13KB
|
289 lines
10 REM ***********************
20 REM * ASE *
30 REM * ARCADE SOUND EDITOR *
40 REM * BY S & S ZIMMERMAN *
50 REM * COPYRIGHT (C) 1987 *
60 REM * BY MICROSPARC, INC. *
70 REM * CONCORD, MA. 01742 *
80 REM * *
90 REM ***********************
100 REM *----------------
110 REM * INTRODUCTION:
120 REM *----------------
130 HIMEM: 16384 -512 *( PEEK(48896) = 76): TEXT : HOME : DIM N$(255)
140 VTAB 2:SP$ = " ARCADE SOUND EDITOR ": INVERSE : GOSUB 1040: NORMAL
150 VTAB 5:SP$ = "BY ": GOSUB 1040: VTAB 7:SP$ = "STEPHEN H. ZIMMERMAN": GOSUB 1040
160 VTAB 9:SP$ = "AND": GOSUB 1040: VTAB 11:SP$ = "S. SCOTT ZIMMERMAN": GOSUB 1040
170 VTAB 15:SP$ = "COPYRIGHT (C) 1987": GOSUB 1040
180 VTAB 16:SP$ = "BY MICROSPARC, INC": GOSUB 1040
190 VTAB 17:SP$ = "CONCORD, MA 01742": GOSUB 1040: ONERR GOTO 2860
200 EF = 1: PRINT CHR$(4);"BRUN DUO,A$8400"
210 EF = 2: PRINT CHR$(4);"BLOAD SEU"
220 POKE 216,0: VTAB 23: PRINT " PRESS <RETURN> TO START -> ";: GET OP$: PRINT OP$: CALL 32768
230 REM *----------------
240 REM * SET UP:
250 REM *----------------
260 HOME : FOR J = 1 TO 5:VP(J) = J +2: NEXT : POKE 206,0: POKE 207,64
270 IN = 1:PA = 1:PN = 1:PS = 1:CA$ = "CATALOG": IF PEEK(48896) = 76 THEN CA$ = "CAT"
280 CS = 1: GOSUB 1820: POKE 800,1: POKE 801,1: CALL 32771
290 CN = 1: GOSUB 1310:SQ = 32786:CL = 32789:D = 1:SD$ = ".SNDS":NS$ = ".NMS"
300 IT = 32768:T2B = 32771:B2T = 32774:IS = 32777:DE = 32780:SS = 32783
310 HOME : GOSUB 380: & NORMAL : IF N$(CS) = "" THEN GOSUB 1140
320 GOTO 570
330 OV = ASC(OP$): IF OV >95 THEN OV = OV -32:OP$ = CHR$(OV)
340 RETURN
350 REM *----------------
360 REM * MAIN SCREEN:
370 REM *----------------
380 SP$ = " ARCADE SOUND EDITOR ": VTAB 1: INVERSE : GOSUB 1040: NORMAL
390 VTAB 3: HTAB 7: PRINT "PITCH #1: ";PV(1);" ": HTAB 7: PRINT "PITCH #2: ";PV(2);" "
400 HTAB 7: PRINT "DELTA #1: ";PV(3);" ": HTAB 7: PRINT "DELTA #2: ";PV(4);" ": HTAB 7: PRINT "DURATION: ";PV(5);" "
410 FOR J = 1 TO 4: VTAB 2 +J: HTAB 26: PRINT "(0-255)": NEXT J: HTAB 26: PRINT "(0-65535)"
420 VTAB 9: PRINT "NAME: ";N$(CS);: CALL -868: PRINT : PRINT "SEQUENCE: ";CS;" OF ";SE;" "
430 PRINT " N : NEXT": PRINT " P : PREVIOUS": PRINT " A : APPEND": PRINT " R : RENAME"
440 VTAB 16: PRINT "ARROWS (CTRL-K,J):": PRINT " CURSOR UP/DOWN": PRINT " CHANGE VALUES"
450 VTAB 10: HTAB 24: PRINT "SOUND: ";CN;" OF ";NS;" ";
460 VTAB 11: HTAB 26: PRINT "> : NEXT": VTAB 12: HTAB 26: PRINT "< : PREVIOUS"
470 VTAB 13: HTAB 26: PRINT "/ : APPEND";: VTAB 14: HTAB 26: PRINT "I : INSERT";: VTAB 15: HTAB 26: PRINT "D : DELETE";: VTAB 16: HTAB 26: PRINT "C : COPY";
480 VTAB 17: HTAB 26: PRINT "V : VALUE SET";: VTAB 20: HTAB 26: PRINT "S : ";: IF NOT MF THEN INVERSE
490 PRINT "SPK";: NORMAL : PRINT "/";: IF MF THEN INVERSE
500 PRINT "CASS": VTAB 20: NORMAL : PRINT "M : DISK MENU": PRINT "Q : QUIT";
510 VTAB 21: HTAB 26: PRINT "0-9 : INCR ";: INVERSE : PRINT IN: NORMAL
520 VTAB 23: HTAB 8: PRINT "<SPACE> : PLAYS SOUND": HTAB 8: PRINT "<RETURN> : PLAYS SEQUENCE";
530 RETURN
540 REM *----------------
550 REM * MAIN LOOP:
560 REM *----------------
570 VTAB VP(PN): HTAB 17: INVERSE : PRINT PV(PN);: NORMAL : PRINT " "
580 IF PEEK( -16384) <128 THEN 580
590 GET OP$: GOSUB 330
600 IF OP$ = " " OR OP$ = CHR$(13) THEN GOSUB 940: GOTO 570
610 IF OP$ = CHR$(8) THEN PV(PN) = PV(PN) -IN: GOSUB 810: GOTO 570
620 IF OP$ = CHR$(21) THEN PV(PN) = PV(PN) +IN: GOSUB 810: GOTO 570
630 IF ASC(OP$) >11 OR ASC(OP$) <10 THEN 680
640 IF OP$ = CHR$(10) THEN PS = PN:PN = PN +1: IF PN >5 THEN PN = 1
650 IF OP$ = CHR$(11) THEN PS = PN:PN = PN -1: IF PN <1 THEN PN = 5
660 VTAB VP(PS): HTAB 17: NORMAL : PRINT PV(PS);" "
670 GOTO 570
680 IF OP$ = "0" THEN IN = 10: GOTO 710
690 IF VAL(OP$) <1 THEN 720
700 IN = VAL(OP$)
710 VTAB 21: HTAB 37: INVERSE : PRINT IN;: NORMAL : PRINT " ": GOTO 570
720 GOSUB 1370: POKE 800,CS: POKE 801,CN: CALL B2T
730 OP = OV -43: IF OP <0 THEN OP = 0
740 ON OP GOTO 1650,580,1650,1080,580,580,580,580,580,580,580,580,580,580,580,580,1650,580,1650
750 OP = OV -64: IF OP <0 THEN OP = 0
760 ON OP GOTO 1080,580,1890,1510,580,580,580,580,1440,580,580,1650,1970,1650,580,1650,2740,1270,1590,580,580,880,580,1650
770 GOTO 570
780 REM *----------------
790 REM * CHECK VALUES:
800 REM *----------------
810 MAX = 255:MX = 250: IF PN = 5 THEN MAX = 65535
820 IF PV(PN) >MAX THEN PV(PN) = 0
830 IF PV(PN) <0 THEN PV(PN) = MX: IF PN = 3 OR PN = 4 THEN PV(PN) = MAX
840 RETURN
850 REM *----------------
860 REM * VALUE SET:
870 REM *----------------
880 VTAB VP(PN): HTAB 17: NORMAL : PRINT PV(PN);: HTAB 17: INPUT "";V$
890 IF LEFT$(V$,1) <"0" OR LEFT$(V$,1) >"9" THEN HOME : GOSUB 380: GOTO 570
900 PV(PN) = VAL(V$): GOSUB 810: HOME : GOSUB 380: GOTO 570
910 REM *----------------
920 REM * PLAY NOTE/SEQUENCE:
930 REM *----------------
940 VTAB VP(PN): HTAB 17: PRINT PV(PN): GOSUB 1370
950 IF OP$ = CHR$(13) THEN 980
960 POKE 206,0: POKE 207,3: & 1
970 RETURN
980 POKE 800,CS: POKE 801,CN: CALL B2T
990 POKE 206,0: POKE 207,64: & CS
1000 RETURN
1010 REM *----------------
1020 REM * CENTER LINE ROUTINE:
1030 REM *----------------
1040 HTAB (20 - LEN(SP$)/2): PRINT SP$: RETURN
1050 REM *----------------
1060 REM * APPEND SOUND/SEQ:
1070 REM *----------------
1080 IF OP$ = "A" THEN CHNG = SQ:SE = SE +1:CS = SE:NS = 1:CN = 1: GOSUB 1140: GOTO 1120
1090 IF CS = SE THEN CHNG = SS: GOTO 1110
1100 CHNG = IS
1110 NS = NS +1:CN = NS
1120 POKE 800,CS: POKE 801,CN
1130 CALL CHNG: CALL T2B: GOSUB 1310: GOSUB 380: GOTO 570
1140 VTAB VP(PN): HTAB 17: PRINT PV(PN): VTAB 9: HTAB 7:A$ = "": CALL -868:I = 0
1150 GET OP$: GOSUB 330: IF I = 0 THEN 1190
1160 IF OV < >8 THEN 1190
1170 I = I -1: PRINT OP$;: CALL -868: IF I = 0 THEN A$ = "": GOTO 1150
1180 A$ = LEFT$(A$,I)
1190 IF OV = 13 THEN 1230
1200 IF OV <32 OR OV >90 THEN 1150
1210 PRINT OP$;:A$ = A$ +OP$:I = I +1: IF I >14 THEN 1230
1220 GOTO 1150
1230 N$(CS) = A$: RETURN
1240 REM *----------------
1250 REM * RENAME SEQUENCE:
1260 REM *----------------
1270 GOSUB 1140: GOTO 570
1280 REM *----------------
1290 REM * PEEK BUFFER:
1300 REM *----------------
1310 FOR J = 1 TO 4:PV(J) = PEEK(772 +J): NEXT
1320 PV(5) = PEEK(777) + PEEK(778) *256
1330 RETURN
1340 REM *----------------
1350 REM * POKE BUFFER:
1360 REM *----------------
1370 FOR J = 1 TO 4: POKE (772 +J),PV(J): NEXT
1380 HI = INT(PV(5)/256):LO = PV(5) -HI *256
1390 POKE 777,LO: POKE 778,HI
1400 RETURN
1410 REM *----------------
1420 REM * INSERT SOUND:
1430 REM *----------------
1440 CALL IS
1450 CALL T2B
1460 GOSUB 1310
1470 NS = NS +1: GOSUB 380: GOTO 570
1480 REM *----------------
1490 REM * DELETE SOUND:
1500 REM *----------------
1510 CALL DE
1520 SE = PEEK(16384): IF SE = 0 THEN CS = 1:SE = 1: CALL 32768
1530 IF CS >SE THEN CS = SE
1540 GOSUB 1820: IF CN >NS THEN CN = NS
1550 POKE 800,CS: POKE 801,CN: CALL T2B: GOSUB 1310: GOSUB 380: GOTO 570
1560 REM *----------------
1570 REM * CASSETTE/REGULAR:
1580 REM *----------------
1590 IF NOT MF THEN & POP :MF = 1: GOTO 1610
1600 IF MF THEN & NORMAL :MF = 0
1610 GOSUB 380: GOTO 570
1620 REM *----------------
1630 REM * NEXT-LAST SND/SEQ:
1640 REM *----------------
1650 IF OP$ = ">" OR OP$ = "." OR OP$ = "N" THEN C = 1
1660 IF OP$ = "<" OR OP$ = "," OR OP$ = "P" THEN C = -1
1670 IF OP$ >">" THEN 1720
1680 CN = CN +C
1690 IF CN <1 THEN CN = NS
1700 IF CN >NS THEN CN = 1
1710 GOTO 1760
1720 CS = CS +C
1730 IF CS <1 THEN CS = SE
1740 IF CS >SE THEN CS = 1
1750 GOSUB 1820: IF CN >NS THEN CN = NS
1760 POKE 800,CS: POKE 801,CN
1770 CALL T2B: GOSUB 1310
1780 GOSUB 380: GOTO 570
1790 REM *----------------
1800 REM * FIND SOUND NO.:
1810 REM *----------------
1820 SE = PEEK(16384):A = 16384:AD = 2 *CS
1830 OFF = PEEK(A +AD) + PEEK(A +1 +AD) *256
1840 NS = PEEK(16384 +OFF)
1850 RETURN
1860 REM *----------------
1870 REM * COPY SOUND:
1880 REM *----------------
1890 IF CS = SE THEN CHNG = SS: GOTO 1910
1900 CHNG = IS
1910 NS = NS +1:CN = NS
1920 POKE 800,CS: POKE 801,CN
1930 CALL CHNG: CALL B2T: GOSUB 380: GOTO 570
1940 REM *----------------
1950 REM * DISK MENU:
1960 REM *----------------
1970 ONERR GOTO 2680
1980 PRINT : PRINT CHR$(4);"CLOSE": CALL CL:L = PEEK(6) + PEEK(7) *256: IF L = 11 AND PV(5) = 0 THEN L = 0
1990 HOME :SP$ = " DISK MENU ": INVERSE : VTAB 1: GOSUB 1040: NORMAL
2000 VTAB 5: HTAB 3: PRINT "C : CATALOG "
2010 VTAB 7: HTAB 3: PRINT "D : CHANGE CURRENT DRIVE";: HTAB 28: PRINT "(";: INVERSE : PRINT D;: NORMAL : PRINT ")": NORMAL
2020 VTAB 9: HTAB 3: PRINT "S : SAVE SOUND TABLE": VTAB 11: HTAB 3: PRINT "L : LOAD SOUND TABLE"
2030 VTAB 24: HTAB 7: PRINT "<ESCAPE> : BACK TO EDIT";
2040 VTAB 13: HTAB 7: PRINT "FILENAME: ";SN$
2050 VTAB 15: HTAB 13: PRINT "(";L;" BYTES LONG)"
2060 IF PEEK( -16384) <128 THEN 2060
2070 GET OP$: PRINT : GOSUB 330
2080 IF OP$ = CHR$(27) THEN 2140
2090 IF OP$ = "C" THEN 2250
2100 IF OP$ = "D" THEN 2330
2110 IF OP$ = "S" THEN 2370
2120 IF OP$ = "L" THEN 2540
2130 GOTO 2060
2140 POKE 216,0: HOME : GOSUB 380: GOTO 570
2150 REM *----------------
2160 REM * FILE NAME:
2170 REM *----------------
2180 X = FRE(0): VTAB 24: HTAB 5: PRINT "<RETURN> : ACCEPT FILENAME";: VTAB 13: HTAB 17: INPUT "";A$
2190 IF A$ = "" THEN VTAB 13: HTAB 17: PRINT SN$;: CALL -868: RETURN
2200 IF LEFT$(A$,1) <"A" OR LEFT$(A$,1) >"Z" OR LEN(A$) >10 THEN 2180
2210 SN$ = A$: VTAB 24: HTAB 5: CALL -868: RETURN
2220 REM *----------------
2230 REM * CATALOG:
2240 REM *----------------
2250 HOME :SP$ = " CATALOG ": INVERSE : GOSUB 1040: NORMAL : PRINT CHR$(4);CA$;",D"D: PRINT
2260 ONERR GOTO 2680
2270 X = FRE(0): PRINT : INPUT "DISK COMMAND -> ";DC$: IF DC$ = "" THEN 1980
2280 PRINT CHR$(4);DC$;",D"D: GOTO 2270
2290 VTAB 19: HTAB 5: FLASH : PRINT "NO";: NORMAL : PRINT " FILE IN MEMORY!": HTAB 5: PRINT "PRESS <RETURN> -> ";: GET AN$: GOTO 1980
2300 REM *----------------
2310 REM * CHANGE DRIVE NO.:
2320 REM *----------------
2330 D = 3 -D: GOTO 1980
2340 REM *----------------
2350 REM * SAVE SOUND TABLE:
2360 REM *----------------
2370 IF L = 0 THEN 2290
2380 VTAB 9: HTAB 3: INVERSE : PRINT "S": NORMAL : GOSUB 2180: IF SN$ = "" THEN 1980
2390 A = 16384: VTAB 17: HTAB 5: INVERSE : PRINT " SAVING: ";: NORMAL : PRINT " ";SN$ +SD$
2400 ONERR GOTO 2430
2410 VTAB 5: PRINT : PRINT CHR$(4);"VERIFY ";SN$ +SD$;",D"D
2420 VTAB 19: FLASH :SP$ = "WARNING": GOSUB 1040: NORMAL :SP$ = "FILE " +SN$ +SD$ +" ALREADY EXISTS!": GOSUB 1040: GOTO 2460
2430 ONERR GOTO 2680
2440 IF PEEK(222) = 6 THEN 2460
2450 GOTO 2680
2460 VTAB 24: HTAB 1: PRINT "<SPACE> SAVES, <ESCAPE> CANCELS -> ";: GET A$: IF A$ = CHR$(27) GOTO 1980
2470 IF A$ < >" " THEN 2460
2480 VTAB 5: PRINT : PRINT CHR$(4);"BSAVE ";SN$ +SD$;",A";A;",L";L;",D"D
2490 OP$ = SN$ +NS$: PRINT CHR$(4);"OPEN ";OP$;",D"D: PRINT CHR$(4);"WRITE ";OP$
2500 PRINT SE: FOR I = 1 TO SE: PRINT N$(I): NEXT I: GOTO 1980
2510 REM *----------------
2520 REM * LOAD SOUND TABLE:
2530 REM *----------------
2540 VTAB 11: HTAB 3: INVERSE : PRINT "L": NORMAL : GOSUB 2180: IF SN$ = "" THEN 1980
2550 VTAB 17: HTAB 5: INVERSE : PRINT " LOADING: ";: NORMAL : PRINT " ";SN$ +SD$
2560 IF L = 0 THEN 2590
2570 VTAB 19: FLASH :SP$ = " WARNING ": GOSUB 1040: NORMAL
2580 VTAB 20:SP$ = "FILE IN MEMORY WILL BE ERASED!": GOSUB 1040
2590 VTAB 24: HTAB 1: PRINT "<SPACE> LOADS, <ESCAPE> CANCELS -> ";: GET A$: ON A$ = CHR$(27) GOTO 1980: IF A$ < >" " GOTO 2590
2600 CALL IT:A = 16384: VTAB 5: PRINT : PRINT CHR$(4);"BLOAD ";SN$ +SD$;",A";A;",D"D
2610 CS = 1:CN = 1: POKE 800,1: POKE 801,1: CALL T2B: GOSUB 1310: FOR I = 1 TO SE:N$(I) = "": NEXT : GOSUB 1820
2620 OP$ = SN$ +NS$: PRINT CHR$(4);"OPEN ";OP$;",D"D: PRINT CHR$(4);"READ ";OP$
2630 INPUT SE: FOR I = 1 TO SE: INPUT N$(I): NEXT I
2640 GOTO 1980
2650 REM *----------------
2660 REM * ONERR COME HERE:
2670 REM *----------------
2680 Y = PEEK(222)
2690 HOME : VTAB 12: HTAB 10: PRINT " DISK ";: FLASH : PRINT "ERROR";: NORMAL : PRINT " #";Y;" IN LINE "; PEEK(218) +256 * PEEK(219)
2700 VTAB 15: PRINT " PRESS <RETURN> -> ";: GET AN$: GOTO 1980
2710 REM *----------------
2720 REM * QUIT:
2730 REM *----------------
2740 HOME : VTAB 2:SP$ = " QUIT ": INVERSE : GOSUB 1040: NORMAL
2750 VTAB 12: HTAB 2: PRINT "DO YOU WISH TO QUIT (Y/N)? ";: GET OP$: GOSUB 330
2760 IF OP$ < >"Y" AND OP$ < >"N" THEN 2750
2770 PRINT OP$: IF OP$ = "N" THEN 2810
2780 HOME : VTAB 12:SP$ = "END OF ARCADE SOUND EDITOR": GOSUB 1040
2790 VTAB 14:SP$ = "TYPE 'GOTO 260' TO RE-ENTER": GOSUB 1040:SP$ = "WITH SOUND DATA INTACT": GOSUB 1040
2800 POKE 1010,191: POKE 1011,157: CALL -1169: POKE 207,64: VTAB 17: END
2810 VTAB 14: HTAB 2: PRINT "CLEAR THE TABLE (Y/N)? ";: GET OP$: GOSUB 330: IF OP$ < >"Y" AND OP$ < >"N" THEN 2810
2820 PRINT OP$: IF OP$ = "N" THEN 2850
2830 CALL IT:NS = 1:CS = 1:CN = 1:SN$ = "": FOR I = 1 TO 5:PV(I) = 0: NEXT
2840 FOR I = 1 TO SE:N$(I) = "": NEXT I:SE = 1
2850 HOME : GOSUB 380: GOTO 570
2860 E = PEEK(222):EL = PEEK(218) +256 * PEEK(219): HOME : VTAB 12
2870 PRINT "TROUBLE LOADING " MID$ ("DUOSEU",EF *3 -2,3)
2880 VTAB 22: HTAB 1: PRINT "<ESC> TO QUIT, <RETURN> TO TRY AGAIN";: GET Z$: PRINT : IF Z$ = CHR$(27) THEN END
2890 ON EF GOTO 200,210