home *** CD-ROM | disk | FTP | other *** search
/ Nibble Magazine / nib30b.dsk / ASE.bas < prev    next >
BASIC Source File  |  2023-02-26  |  13KB  |  289 lines

  1. 10  REM ***********************
  2. 20  REM *         ASE         *
  3. 30  REM * ARCADE SOUND EDITOR *
  4. 40  REM * BY S & S ZIMMERMAN  *
  5. 50  REM * COPYRIGHT (C) 1987  *
  6. 60  REM * BY MICROSPARC, INC. *
  7. 70  REM * CONCORD, MA. 01742  *
  8. 80  REM *                     *
  9. 90  REM ***********************
  10. 100  REM *----------------
  11. 110  REM * INTRODUCTION:
  12. 120  REM *----------------
  13. 130  HIMEM: 16384 -512 *( PEEK(48896) = 76): TEXT : HOME : DIM N$(255)
  14. 140  VTAB 2:SP$ = " ARCADE SOUND EDITOR ": INVERSE : GOSUB 1040: NORMAL 
  15. 150  VTAB 5:SP$ = "BY ": GOSUB 1040: VTAB 7:SP$ = "STEPHEN H. ZIMMERMAN": GOSUB 1040
  16. 160  VTAB 9:SP$ = "AND": GOSUB 1040: VTAB 11:SP$ = "S. SCOTT ZIMMERMAN": GOSUB 1040
  17. 170  VTAB 15:SP$ = "COPYRIGHT (C) 1987": GOSUB 1040
  18. 180  VTAB 16:SP$ = "BY MICROSPARC, INC": GOSUB 1040
  19. 190  VTAB 17:SP$ = "CONCORD, MA  01742": GOSUB 1040: ONERR  GOTO 2860
  20. 200 EF = 1: PRINT  CHR$(4);"BRUN DUO,A$8400"
  21. 210 EF = 2: PRINT  CHR$(4);"BLOAD SEU"
  22. 220  POKE 216,0: VTAB 23: PRINT "  PRESS <RETURN> TO START -> ";: GET OP$: PRINT OP$: CALL 32768
  23. 230  REM *----------------
  24. 240  REM * SET UP:
  25. 250  REM *----------------
  26. 260  HOME : FOR J = 1 TO 5:VP(J) = J +2: NEXT : POKE 206,0: POKE 207,64
  27. 270 IN = 1:PA = 1:PN = 1:PS = 1:CA$ = "CATALOG": IF  PEEK(48896) = 76  THEN CA$ = "CAT"
  28. 280 CS = 1: GOSUB 1820: POKE 800,1: POKE 801,1: CALL 32771
  29. 290 CN = 1: GOSUB 1310:SQ = 32786:CL = 32789:D = 1:SD$ = ".SNDS":NS$ = ".NMS"
  30. 300 IT = 32768:T2B = 32771:B2T = 32774:IS = 32777:DE = 32780:SS = 32783
  31. 310  HOME : GOSUB 380: &  NORMAL : IF N$(CS) = ""  THEN  GOSUB 1140
  32. 320  GOTO 570
  33. 330 OV =  ASC(OP$): IF OV >95  THEN OV = OV -32:OP$ =  CHR$(OV)
  34. 340  RETURN 
  35. 350  REM *----------------
  36. 360  REM * MAIN SCREEN:
  37. 370  REM *----------------
  38. 380 SP$ = " ARCADE SOUND EDITOR ": VTAB 1: INVERSE : GOSUB 1040: NORMAL 
  39. 390  VTAB 3: HTAB 7: PRINT "PITCH #1: ";PV(1);"    ": HTAB 7: PRINT "PITCH #2: ";PV(2);"    "
  40. 400  HTAB 7: PRINT "DELTA #1: ";PV(3);"    ": HTAB 7: PRINT "DELTA #2: ";PV(4);"    ": HTAB 7: PRINT "DURATION: ";PV(5);"    "
  41. 410  FOR J = 1 TO 4: VTAB 2 +J: HTAB 26: PRINT "(0-255)": NEXT J: HTAB 26: PRINT "(0-65535)"
  42. 420  VTAB 9: PRINT "NAME: ";N$(CS);: CALL  -868: PRINT : PRINT "SEQUENCE: ";CS;" OF ";SE;"  "
  43. 430  PRINT "  N : NEXT": PRINT "  P : PREVIOUS": PRINT "  A : APPEND": PRINT "  R : RENAME"
  44. 440  VTAB 16: PRINT "ARROWS (CTRL-K,J):": PRINT "  CURSOR UP/DOWN": PRINT "  CHANGE VALUES"
  45. 450  VTAB 10: HTAB 24: PRINT "SOUND: ";CN;" OF ";NS;"  ";
  46. 460  VTAB 11: HTAB 26: PRINT "> : NEXT": VTAB 12: HTAB 26: PRINT "< : PREVIOUS"
  47. 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";
  48. 480  VTAB 17: HTAB 26: PRINT "V : VALUE SET";: VTAB 20: HTAB 26: PRINT "S : ";: IF   NOT MF  THEN  INVERSE 
  49. 490  PRINT "SPK";: NORMAL : PRINT "/";: IF MF  THEN  INVERSE 
  50. 500  PRINT "CASS": VTAB 20: NORMAL : PRINT "M : DISK MENU": PRINT "Q : QUIT";
  51. 510  VTAB 21: HTAB 26: PRINT "0-9 : INCR ";: INVERSE : PRINT IN: NORMAL 
  52. 520  VTAB 23: HTAB 8: PRINT "<SPACE>  : PLAYS SOUND": HTAB 8: PRINT "<RETURN> : PLAYS SEQUENCE";
  53. 530  RETURN 
  54. 540  REM *----------------
  55. 550  REM * MAIN LOOP:
  56. 560  REM *----------------
  57. 570  VTAB VP(PN): HTAB 17: INVERSE : PRINT PV(PN);: NORMAL : PRINT "    "
  58. 580  IF  PEEK( -16384) <128  THEN 580
  59. 590  GET OP$: GOSUB 330
  60. 600  IF OP$ = " "  OR OP$ =  CHR$(13)  THEN  GOSUB 940: GOTO 570
  61. 610  IF OP$ =  CHR$(8)  THEN PV(PN) = PV(PN) -IN: GOSUB 810: GOTO 570
  62. 620  IF OP$ =  CHR$(21)  THEN PV(PN) = PV(PN) +IN: GOSUB 810: GOTO 570
  63. 630  IF  ASC(OP$) >11  OR  ASC(OP$) <10  THEN 680
  64. 640  IF OP$ =  CHR$(10)  THEN PS = PN:PN = PN +1: IF PN >5  THEN PN = 1
  65. 650  IF OP$ =  CHR$(11)  THEN PS = PN:PN = PN -1: IF PN <1  THEN PN = 5
  66. 660  VTAB VP(PS): HTAB 17: NORMAL : PRINT PV(PS);"    "
  67. 670  GOTO 570
  68. 680  IF OP$ = "0"  THEN IN = 10: GOTO 710
  69. 690  IF  VAL(OP$) <1  THEN 720
  70. 700 IN =  VAL(OP$)
  71. 710  VTAB 21: HTAB 37: INVERSE : PRINT IN;: NORMAL : PRINT " ": GOTO 570
  72. 720  GOSUB 1370: POKE 800,CS: POKE 801,CN: CALL B2T
  73. 730 OP = OV -43: IF OP <0  THEN OP = 0
  74. 740  ON OP GOTO 1650,580,1650,1080,580,580,580,580,580,580,580,580,580,580,580,580,1650,580,1650
  75. 750 OP = OV -64: IF OP <0  THEN OP = 0
  76. 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
  77. 770  GOTO 570
  78. 780  REM *----------------
  79. 790  REM * CHECK VALUES:
  80. 800  REM *----------------
  81. 810 MAX = 255:MX = 250: IF PN = 5  THEN MAX = 65535
  82. 820  IF PV(PN) >MAX  THEN PV(PN) = 0
  83. 830  IF PV(PN) <0  THEN PV(PN) = MX: IF PN = 3  OR PN = 4  THEN PV(PN) = MAX
  84. 840  RETURN 
  85. 850  REM *----------------
  86. 860  REM * VALUE SET:
  87. 870  REM *----------------
  88. 880  VTAB VP(PN): HTAB 17: NORMAL : PRINT PV(PN);: HTAB 17: INPUT "";V$
  89. 890  IF  LEFT$(V$,1) <"0"  OR  LEFT$(V$,1) >"9"  THEN  HOME : GOSUB 380: GOTO 570
  90. 900 PV(PN) =  VAL(V$): GOSUB 810: HOME : GOSUB 380: GOTO 570
  91. 910  REM *----------------
  92. 920  REM * PLAY NOTE/SEQUENCE:
  93. 930  REM *----------------
  94. 940  VTAB VP(PN): HTAB 17: PRINT PV(PN): GOSUB 1370
  95. 950  IF OP$ =  CHR$(13)  THEN 980
  96. 960  POKE 206,0: POKE 207,3: & 1
  97. 970  RETURN 
  98. 980  POKE 800,CS: POKE 801,CN: CALL B2T
  99. 990  POKE 206,0: POKE 207,64: & CS
  100. 1000  RETURN 
  101. 1010  REM *----------------
  102. 1020  REM * CENTER LINE ROUTINE:
  103. 1030  REM *----------------
  104. 1040  HTAB (20 - LEN(SP$)/2): PRINT SP$: RETURN 
  105. 1050  REM *----------------
  106. 1060  REM * APPEND SOUND/SEQ:
  107. 1070  REM *----------------
  108. 1080  IF OP$ = "A"  THEN CHNG = SQ:SE = SE +1:CS = SE:NS = 1:CN = 1: GOSUB 1140: GOTO 1120
  109. 1090  IF CS = SE  THEN CHNG = SS: GOTO 1110
  110. 1100 CHNG = IS
  111. 1110 NS = NS +1:CN = NS
  112. 1120  POKE 800,CS: POKE 801,CN
  113. 1130  CALL CHNG: CALL T2B: GOSUB 1310: GOSUB 380: GOTO 570
  114. 1140  VTAB VP(PN): HTAB 17: PRINT PV(PN): VTAB 9: HTAB 7:A$ = "": CALL  -868:I = 0
  115. 1150  GET OP$: GOSUB 330: IF I = 0  THEN 1190
  116. 1160  IF OV < >8  THEN 1190
  117. 1170 I = I -1: PRINT OP$;: CALL  -868: IF I = 0  THEN A$ = "": GOTO 1150
  118. 1180 A$ =  LEFT$(A$,I)
  119. 1190  IF OV = 13  THEN 1230
  120. 1200  IF OV <32  OR OV >90  THEN 1150
  121. 1210  PRINT OP$;:A$ = A$ +OP$:I = I +1: IF I >14  THEN 1230
  122. 1220  GOTO 1150
  123. 1230 N$(CS) = A$: RETURN 
  124. 1240  REM *----------------
  125. 1250  REM * RENAME SEQUENCE:
  126. 1260  REM *----------------
  127. 1270  GOSUB 1140: GOTO 570
  128. 1280  REM *----------------
  129. 1290  REM * PEEK BUFFER:
  130. 1300  REM *----------------
  131. 1310  FOR J = 1 TO 4:PV(J) =  PEEK(772 +J): NEXT 
  132. 1320 PV(5) =  PEEK(777) + PEEK(778) *256
  133. 1330  RETURN 
  134. 1340  REM *----------------
  135. 1350  REM * POKE BUFFER:
  136. 1360  REM *----------------
  137. 1370  FOR J = 1 TO 4: POKE (772 +J),PV(J): NEXT 
  138. 1380 HI =  INT(PV(5)/256):LO = PV(5) -HI *256
  139. 1390  POKE 777,LO: POKE 778,HI
  140. 1400  RETURN 
  141. 1410  REM *----------------
  142. 1420  REM * INSERT SOUND:
  143. 1430  REM *----------------
  144. 1440  CALL IS
  145. 1450  CALL T2B
  146. 1460  GOSUB 1310
  147. 1470 NS = NS +1: GOSUB 380: GOTO 570
  148. 1480  REM *----------------
  149. 1490  REM * DELETE SOUND:
  150. 1500  REM *----------------
  151. 1510  CALL DE
  152. 1520 SE =  PEEK(16384): IF SE = 0  THEN CS = 1:SE = 1: CALL 32768
  153. 1530  IF CS >SE  THEN CS = SE
  154. 1540  GOSUB 1820: IF CN >NS  THEN CN = NS
  155. 1550  POKE 800,CS: POKE 801,CN: CALL T2B: GOSUB 1310: GOSUB 380: GOTO 570
  156. 1560  REM *----------------
  157. 1570  REM * CASSETTE/REGULAR:
  158. 1580  REM *----------------
  159. 1590  IF   NOT MF  THEN  &  POP :MF = 1: GOTO 1610
  160. 1600  IF MF  THEN  &  NORMAL :MF = 0
  161. 1610  GOSUB 380: GOTO 570
  162. 1620  REM *----------------
  163. 1630  REM * NEXT-LAST SND/SEQ:
  164. 1640  REM *----------------
  165. 1650  IF OP$ = ">"  OR OP$ = "."  OR OP$ = "N"  THEN C = 1
  166. 1660  IF OP$ = "<"  OR OP$ = ","  OR OP$ = "P"  THEN C =  -1
  167. 1670  IF OP$ >">"  THEN 1720
  168. 1680 CN = CN +C
  169. 1690  IF CN <1  THEN CN = NS
  170. 1700  IF CN >NS  THEN CN = 1
  171. 1710  GOTO 1760
  172. 1720 CS = CS +C
  173. 1730  IF CS <1  THEN CS = SE
  174. 1740  IF CS >SE  THEN CS = 1
  175. 1750  GOSUB 1820: IF CN >NS  THEN CN = NS
  176. 1760  POKE 800,CS: POKE 801,CN
  177. 1770  CALL T2B: GOSUB 1310
  178. 1780  GOSUB 380: GOTO 570
  179. 1790  REM *----------------
  180. 1800  REM * FIND SOUND NO.:
  181. 1810  REM *----------------
  182. 1820 SE =  PEEK(16384):A = 16384:AD = 2 *CS
  183. 1830 OFF =  PEEK(A +AD) + PEEK(A +1 +AD) *256
  184. 1840 NS =  PEEK(16384 +OFF)
  185. 1850  RETURN 
  186. 1860  REM *----------------
  187. 1870  REM * COPY SOUND:
  188. 1880  REM *----------------
  189. 1890  IF CS = SE  THEN CHNG = SS: GOTO 1910
  190. 1900 CHNG = IS
  191. 1910 NS = NS +1:CN = NS
  192. 1920  POKE 800,CS: POKE 801,CN
  193. 1930  CALL CHNG: CALL B2T: GOSUB 380: GOTO 570
  194. 1940  REM *----------------
  195. 1950  REM * DISK MENU:
  196. 1960  REM *----------------
  197. 1970  ONERR  GOTO 2680
  198. 1980  PRINT : PRINT  CHR$(4);"CLOSE": CALL CL:L =  PEEK(6) + PEEK(7) *256: IF L = 11  AND PV(5) = 0  THEN L = 0
  199. 1990  HOME :SP$ = " DISK MENU ": INVERSE : VTAB 1: GOSUB 1040: NORMAL 
  200. 2000  VTAB 5: HTAB 3: PRINT "C : CATALOG "
  201. 2010  VTAB 7: HTAB 3: PRINT "D : CHANGE CURRENT DRIVE";: HTAB 28: PRINT "(";: INVERSE : PRINT D;: NORMAL : PRINT ")": NORMAL 
  202. 2020  VTAB 9: HTAB 3: PRINT "S : SAVE SOUND TABLE": VTAB 11: HTAB 3: PRINT "L : LOAD SOUND TABLE"
  203. 2030  VTAB 24: HTAB 7: PRINT "<ESCAPE> : BACK TO EDIT";
  204. 2040  VTAB 13: HTAB 7: PRINT "FILENAME: ";SN$
  205. 2050  VTAB 15: HTAB 13: PRINT "(";L;" BYTES LONG)"
  206. 2060  IF  PEEK( -16384) <128  THEN 2060
  207. 2070  GET OP$: PRINT : GOSUB 330
  208. 2080  IF OP$ =  CHR$(27)  THEN 2140
  209. 2090  IF OP$ = "C"  THEN 2250
  210. 2100  IF OP$ = "D"  THEN 2330
  211. 2110  IF OP$ = "S"  THEN 2370
  212. 2120  IF OP$ = "L"  THEN 2540
  213. 2130  GOTO 2060
  214. 2140  POKE 216,0: HOME : GOSUB 380: GOTO 570
  215. 2150  REM *----------------
  216. 2160  REM * FILE NAME:
  217. 2170  REM *----------------
  218. 2180 X =  FRE(0): VTAB 24: HTAB 5: PRINT "<RETURN> : ACCEPT FILENAME";: VTAB 13: HTAB 17: INPUT "";A$
  219. 2190  IF A$ = ""  THEN  VTAB 13: HTAB 17: PRINT SN$;: CALL  -868: RETURN 
  220. 2200  IF  LEFT$(A$,1) <"A"  OR  LEFT$(A$,1) >"Z"  OR  LEN(A$) >10  THEN 2180
  221. 2210 SN$ = A$: VTAB 24: HTAB 5: CALL  -868: RETURN 
  222. 2220  REM *----------------
  223. 2230  REM * CATALOG:
  224. 2240  REM *----------------
  225. 2250  HOME :SP$ = " CATALOG ": INVERSE : GOSUB 1040: NORMAL : PRINT  CHR$(4);CA$;",D"D: PRINT 
  226. 2260  ONERR  GOTO 2680
  227. 2270 X =  FRE(0): PRINT : INPUT "DISK COMMAND -> ";DC$: IF DC$ = ""  THEN 1980
  228. 2280  PRINT  CHR$(4);DC$;",D"D: GOTO 2270
  229. 2290  VTAB 19: HTAB 5: FLASH : PRINT "NO";: NORMAL : PRINT " FILE IN MEMORY!": HTAB 5: PRINT "PRESS <RETURN> -> ";: GET AN$: GOTO 1980
  230. 2300  REM *----------------
  231. 2310  REM * CHANGE DRIVE NO.:
  232. 2320  REM *----------------
  233. 2330 D = 3 -D: GOTO 1980
  234. 2340  REM *----------------
  235. 2350  REM * SAVE SOUND TABLE:
  236. 2360  REM *----------------
  237. 2370  IF L = 0  THEN 2290
  238. 2380  VTAB 9: HTAB 3: INVERSE : PRINT "S": NORMAL : GOSUB 2180: IF SN$ = ""  THEN 1980
  239. 2390 A = 16384: VTAB 17: HTAB 5: INVERSE : PRINT " SAVING: ";: NORMAL : PRINT " ";SN$ +SD$
  240. 2400  ONERR  GOTO 2430
  241. 2410  VTAB 5: PRINT : PRINT  CHR$(4);"VERIFY ";SN$ +SD$;",D"D
  242. 2420  VTAB 19: FLASH :SP$ = "WARNING": GOSUB 1040: NORMAL :SP$ = "FILE " +SN$ +SD$ +" ALREADY EXISTS!": GOSUB 1040: GOTO 2460
  243. 2430  ONERR  GOTO 2680
  244. 2440  IF  PEEK(222) = 6  THEN 2460
  245. 2450  GOTO 2680
  246. 2460  VTAB 24: HTAB 1: PRINT "<SPACE> SAVES, <ESCAPE> CANCELS -> ";: GET A$: IF A$ =  CHR$(27) GOTO 1980
  247. 2470  IF A$ < >" "  THEN 2460
  248. 2480  VTAB 5: PRINT : PRINT  CHR$(4);"BSAVE ";SN$ +SD$;",A";A;",L";L;",D"D
  249. 2490 OP$ = SN$ +NS$: PRINT  CHR$(4);"OPEN ";OP$;",D"D: PRINT  CHR$(4);"WRITE ";OP$
  250. 2500  PRINT SE: FOR I = 1 TO SE: PRINT N$(I): NEXT I: GOTO 1980
  251. 2510  REM *----------------
  252. 2520  REM * LOAD SOUND TABLE:
  253. 2530  REM *----------------
  254. 2540  VTAB 11: HTAB 3: INVERSE : PRINT "L": NORMAL : GOSUB 2180: IF SN$ = ""  THEN 1980
  255. 2550  VTAB 17: HTAB 5: INVERSE : PRINT " LOADING: ";: NORMAL : PRINT " ";SN$ +SD$
  256. 2560  IF L = 0  THEN 2590
  257. 2570  VTAB 19: FLASH :SP$ = " WARNING ": GOSUB 1040: NORMAL 
  258. 2580  VTAB 20:SP$ = "FILE IN MEMORY WILL BE ERASED!": GOSUB 1040
  259. 2590  VTAB 24: HTAB 1: PRINT "<SPACE> LOADS, <ESCAPE> CANCELS -> ";: GET A$: ON A$ =  CHR$(27) GOTO 1980: IF A$ < >" " GOTO 2590
  260. 2600  CALL IT:A = 16384: VTAB 5: PRINT : PRINT  CHR$(4);"BLOAD ";SN$ +SD$;",A";A;",D"D
  261. 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
  262. 2620 OP$ = SN$ +NS$: PRINT  CHR$(4);"OPEN ";OP$;",D"D: PRINT  CHR$(4);"READ ";OP$
  263. 2630  INPUT SE: FOR I = 1 TO SE: INPUT N$(I): NEXT I
  264. 2640  GOTO 1980
  265. 2650  REM *----------------
  266. 2660  REM * ONERR COME HERE:
  267. 2670  REM *----------------
  268. 2680 Y =  PEEK(222)
  269. 2690  HOME : VTAB 12: HTAB 10: PRINT " DISK ";: FLASH : PRINT "ERROR";: NORMAL : PRINT " #";Y;" IN LINE "; PEEK(218) +256 * PEEK(219)
  270. 2700  VTAB 15: PRINT "  PRESS <RETURN> -> ";: GET AN$: GOTO 1980
  271. 2710  REM *----------------
  272. 2720  REM * QUIT:
  273. 2730  REM *----------------
  274. 2740  HOME : VTAB 2:SP$ = " QUIT ": INVERSE : GOSUB 1040: NORMAL 
  275. 2750  VTAB 12: HTAB 2: PRINT "DO YOU WISH TO QUIT (Y/N)? ";: GET OP$: GOSUB 330
  276. 2760  IF OP$ < >"Y"  AND OP$ < >"N"  THEN 2750
  277. 2770  PRINT OP$: IF OP$ = "N"  THEN 2810
  278. 2780  HOME : VTAB 12:SP$ = "END OF ARCADE SOUND EDITOR": GOSUB 1040
  279. 2790  VTAB 14:SP$ = "TYPE 'GOTO 260' TO RE-ENTER": GOSUB 1040:SP$ = "WITH SOUND DATA INTACT": GOSUB 1040
  280. 2800  POKE 1010,191: POKE 1011,157: CALL  -1169: POKE 207,64: VTAB 17: END 
  281. 2810  VTAB 14: HTAB 2: PRINT "CLEAR THE TABLE (Y/N)? ";: GET OP$: GOSUB 330: IF OP$ < >"Y"  AND OP$ < >"N"  THEN 2810
  282. 2820  PRINT OP$: IF OP$ = "N"  THEN 2850
  283. 2830  CALL IT:NS = 1:CS = 1:CN = 1:SN$ = "": FOR I = 1 TO 5:PV(I) = 0: NEXT 
  284. 2840  FOR I = 1 TO SE:N$(I) = "": NEXT I:SE = 1
  285. 2850  HOME : GOSUB 380: GOTO 570
  286. 2860 E =  PEEK(222):EL =  PEEK(218) +256 * PEEK(219): HOME : VTAB 12
  287. 2870  PRINT "TROUBLE LOADING " MID$ ("DUOSEU",EF *3 -2,3)
  288. 2880  VTAB 22: HTAB 1: PRINT "<ESC> TO QUIT, <RETURN> TO TRY AGAIN";: GET Z$: PRINT : IF Z$ =  CHR$(27)  THEN  END 
  289. 2890  ON EF GOTO 200,210