SOUNDESIGN is an interactive AY-3-8912 sound chip editor and demonstration tool that lets users manually adjust all 14 registers of the sound chip and audition pre-recorded and animated sound effects. The main menu uses a cursor (UDG \a, defined at address 65368 as a right-pointing arrow shape) to select individual registers for editing, with each register’s valid range enforced via a shared subroutine at line 650 that supports both fine (+1/−1) and coarse (+5/−5) adjustments. Pre-recorded sounds (gun shot, explosion, ping, train whistle, steamboat whistle, bell, organ chord, helicopter, jet engine) are stored as sets of register values in variables c through d4, while seven “advanced” animated sounds (transporter, bomb dropping, space ship landing, warp drive, superspace speed, intergalactic alert, phaser fire) sweep register values inside FOR loops. A unique feature is the self-documenting capability: after each sound is triggered, subroutine 400 assembles and displays — and optionally LPRINTs — the equivalent SOUND statement, and the advanced sound section uses PRINT #C to display BASIC code snippets describing each effect. The UDG sprite is defined by POKEing 8 bytes to address 65368, which corresponds to UDG character \a in the TS2068’s user-defined graphics area.
Program Analysis
Program Structure
The program is organized into clearly separated functional blocks:
- Initialization (lines 11–36): Sets screen colors, defines the UDG arrow sprite, and zeroes all 14 AY register variables.
- Main menu / register editor (lines 49–125, 530–570, 599–680): Displays all 14 register values, allows cursor navigation with
1/Q, and enters an edit sub-loop on ENTER. - Pre-recorded sound menu (lines 300–399): Presents nine named sounds plus an advanced sound gateway; each sound is defined by setting register variables and calling SOUND and the display subroutine.
- SOUND string builder / printer (lines 400–435): Assembles a human-readable SOUND statement from current register values and optionally sends it to the printer.
- Advanced sound menu (lines 700–819): Seven animated effects, each using a FOR loop that sweeps AY register values to create dynamic sounds, with simultaneous code display.
- Save/Verify (lines 9997–9999): Standard tape save block with verify.
AY Register Mapping
The 14 AY-3-8912 registers are mapped to BASIC variables as follows:
| Variable | Register # | Function | Max Value |
|---|---|---|---|
c | 0 | Channel A Tone Fine | 255 |
c1 | 1 | Channel A Tone Coarse | 15 |
c2 | 2 | Channel B Tone Fine | 255 |
c3 | 3 | Channel B Tone Coarse | 15 |
c4 | 4 | Channel C Tone Fine | 255 |
c5 | 5 | Channel C Tone Coarse | 15 |
c6 | 6 | Noise Period | 31 |
c7 | 7 | Mixer/Enable Register | 63 |
c8 | 8 | Channel A Volume | 16 |
c9 | 9 | Channel B Volume | 16 |
d1 | 10 | Channel C Volume | 16 |
d2 | 11 | Envelope Fine Period | 255 |
d3 | 12 | Envelope Coarse Period | 255 |
d4 | 13 | Envelope Shape | 15 |
Note that the maximum for volume registers (8–10) is 16, not 15, because value 16 enables envelope-controlled volume on the AY chip. The default reset value for register 7 is 63 (all channels disabled), correctly established at lines 35 and 378.
UDG Arrow Definition
Lines 30–31 use a FOR/READ/POKE loop to define UDG \a (character 144) by writing 8 bytes to address 65368. The data 0,8,12,14,255,14,12,8 produces a right-pointing arrow shape used as the menu cursor throughout the program.
Cursor Navigation and Register Editing
The main menu cursor position is stored in z, ranging from 3 to 18, corresponding to the 14 register rows plus two action rows (“LIST OR PRINT DATA” and “PRE-RECORDED SOUND”). The OVER 1 attribute trick at lines 105 and 110 XORs the highlight bar off the previous row before moving the cursor, avoiding a full screen redraw. When ENTER is pressed, the program bounces through lines 600–613 to identify which register row is selected, loads the current value into a and the maximum into b, calls subroutine 650, and writes the result back. Subroutine 650 at line 655–665 handles four keys: 1 (+1), 2 (+5), Q (−1), W (−5), all with wraparound clamping. Key 0 is special-cased at line 663 to reset register 7 to 63 (its safe default) rather than 0.
SOUND Statement Self-Documentation
Subroutine 400 builds a SOUND statement string in A$ by concatenating only the non-zero register pairs (except register 7, which is always included). The trailing semicolon is trimmed at line 425 using A$(TO LEN A$-1). The assembled string is displayed at the bottom of the screen and, if PP=0, sent to the printer via LPRINT. This gives users a ready-to-type SOUND command replicating the current patch.
Advanced Sound Code Display
Each of the seven advanced sound routines (lines 750–819) begins with a loop that runs twice (FOR x=1 TO 2), printing BASIC source code lines to stream #C. Stream 2 is the main screen; if the printer toggle is active, C is incremented to 3 (the printer stream) on the second pass, achieving simultaneous screen display and printing. The dispatch at line 739 uses the idiom GO SUB (VAL a$*10)+740: multiplying the digit character’s numeric value by 10 and adding 740 jumps to lines 750, 760, 770, 780, 790, 800, or 810 for effects 1–7 respectively.
Notable Techniques
PAUSE 0at line 100 efficiently halts execution until any keypress, avoiding a busy-wait loop for the main menu.- The
OVER 1print attribute is used to XOR-erase the highlight bar, a common flicker-free cursor technique. - Register variables are initialized both at startup (line 35–36) and after each pre-recorded sound fires (lines 378–379), ensuring clean state for subsequent edits.
- The advanced sound subroutines sweep tone period registers in real time across all three AY channels simultaneously, producing Doppler-like pitch shift effects.
- Line 730 contains
IF INKEY$="" THEN GO TO 729— note that line 729 does not exist. This is a deliberate technique: the BASIC interpreter falls through to the next existing line (730 itself via line 731), creating an effective keypress wait without a defined target line.
Bugs and Anomalies
- Line 348 tests
INKEY$="9"directly rather thanA$="9", which is inconsistent with lines 340–347. SincePAUSE 0at line 330 waits for a keypress and the key is captured intoA$at line 331, the key will have been released by line 348, so the jet engine sound (option 9) will never trigger reliably. - Lines 354–355 both print an identical string when toggling the printer and both branch to line 370, which does not exist. Execution will fall through to the next line (378), which resets all register variables — probably not the intended behavior, but the effect is benign since the user is still in the pre-recorded sound menu loop.
- The label “ENVELOPE COURSE” at line 548 is a misspelling of “COARSE,” also seen in the printed SOUND data display.
- “SOFEWARE” in line 7’s REM is a misspelling of “SOFTWARE.”
- “WHISLE” (lines 313–314) is a misspelling of “WHISTLE.”
- Line 615 sets
PP=0unconditionally when row 17 (“LIST OR PRINT DATA”) is selected, which forces the printer on regardless of its prior state, then immediately calls the SOUND display subroutine — the intent appears to be a one-shot print of the current register state.
Content
Source Code
4 REM S O U N D E S I G N
5 REM Copyright \* 1986
6 REM Written by James Edwards
7 REM A Product of ARROW SOFEWARE
11 BORDER 0: PAPER 0: INK 7: CLS
12 LET z=3: POKE 23658,8
13 LET W=1
30 FOR n=0 TO 7: READ a: POKE 65368+n,a: NEXT n:
31 DATA 0,8,12,14,255,14,12,8
35 LET c=0: LET c1=0: LET c2=0: LET c3=0: LET c4=0: LET c5=0: LET c6=0: LET c7=63: LET c8=0
36 LET c9=0: LET d1=0: LET d2=0: LET d3=0: LET d4=0
49 CLS : PRINT AT 2,0; PAPER 5; INK 0;"'1'=UP....'Q'=DOWN....'0'=RESET "
50 PRINT AT 0,0; PAPER 1;"***** S O U N D E S I G N ****** "
60 FOR A=165 TO 160 STEP -2
65 PLOT 0,A: DRAW INK 7;255,0
70 NEXT A
89 GO SUB 530: GO TO 120
100 PAUSE 0
104 IF INKEY$=CHR$ 13 THEN PRINT AT z,3; FLASH 1;"\a": GO TO 599
105 IF INKEY$="Q" THEN LET z=z+1: PRINT AT z-1,3;" "; OVER 1;" ": IF z>=19 THEN LET z=3
110 IF INKEY$="1" THEN LET z=z-1: PRINT AT z+1,3;" "; OVER 1;" ": IF z<=2 THEN LET z=18
120 PRINT AT z,3; INK 7;"\a"; OVER 1; PAPER 2; INK 6;" "
125 GO TO 100
300 CLS : FOR i=0 TO 2: PRINT AT i,0; PAPER 5;" ": NEXT i
301 LET PP=1
302 LET A$=""
305 PRINT AT 1,0; PAPER 1;"****** PRE-RECORDED SOUND ******"
310 PRINT ''TAB 7;"1) GUN SHOT"
311 PRINT TAB 7;"2) EXPLOSION"
312 PRINT TAB 7;"3) PING"
313 PRINT TAB 7;"4) TRAIN WHISLE"
314 PRINT TAB 7;"5) STEAMBOAT WHISLE"
315 PRINT TAB 7;"6) BELL"
316 PRINT TAB 7;"7) ORGAN CHORD"
317 PRINT TAB 7;"8) HELICOPTER "
318 PRINT TAB 7;"9) JET ENGINE"
319 PRINT TAB 7;"0) ADVANCED SOUND"
320 PRINT TAB 7;"P) PRINTER(";"ON";"/";"OFF";")"
325 PRINT '; PAPER 1; INK 7;"PRESS 'ENTER' TO RETURN TO MENU"
330 PAUSE 0
331 LET A$=INKEY$
335 IF A$="0" THEN GO TO 700
340 IF A$="1" THEN LET W=30: LET C6=15: LET C7=7: LET C8=16: LET C9=16: LET D1=16: LET D3=16: LET D4=0
341 IF A$="2" THEN LET W=90: LET C6=6: LET C7=7: LET C8=16: LET C9=16: LET D1=16: LET D3=56: LET D4=8
342 IF A$="3" THEN LET W=20: LET C=48: LET C7=62: LET C8=16: LET D3=25: LET D4=8
343 IF A$="4" THEN LET W=30: LET C=209: LET C2=93: LET C4=82: LET C6=31: LET C7=49: LET C8=15: LET C9=15: LET D1=15: LET D4=8
344 IF A$="5" THEN LET W=30: LET C=209: LET C2=118: LET C3=4: LET C4=118: LET C5=4: LET C6=19: LET C7=49: LET C8=15: LET C9=15: LET D1=15
345 IF A$="6" THEN LET W=30: LET C=55: LET C2=104: LET C4=104: LET C7=56: LET C8=16: LET C9=16: LET D1=16: LET D3=12
346 IF A$="7" THEN LET W=60: LET C=209: LET C2=156: LET C4=139: LET C7=56: LET C8=13: LET C9=12: LET D1=11
347 IF A$="8" THEN LET W=340: LET C7=31: LET D1=16: LET D3=2: LET D4=12
348 IF INKEY$="9" THEN LET W=200: LET C2=25: LET C6=15: LET C7=40: LET C9=15
354 IF A$="P" AND PP=0 THEN PRINT AT 14,7;"P) PRINTER(";"ON";"/";"OFF";")": LET PP=1: GO TO 370
355 IF A$="P" AND PP=1 THEN PRINT AT 14,7;"P) PRINTER(";"ON";"/";"OFF";")": LET PP=0: GO TO 370
363 IF A$=CHR$ 13 THEN GO TO 35
365 SOUND 0,c;1,c1;2,c2;3,c3;4,c4;5,c5;6,c6;7,c7;8,c8;9,c9;10,d1;11,d2;12,d3;13,d4
366 GO SUB 400
375 PAUSE W
378 LET c=0: LET c1=0: LET c2=0: LET c3=0: LET c4=0: LET c5=0: LET c6=0: LET c7=63: LET c8=0
379 LET c9=0: LET d1=0: LET d2=0: LET d3=0: LET d4=0
380 SOUND 0,0;1,0;2,0;3,0;4,0;5,0;6,0;7,63;8,0;9,0;10,0;11,0;12,0;13,0
399 GO TO 330
400 LET A$="SOUND "
410 IF C>0 THEN LET A$=A$+"0,"+STR$ C+";"
411 IF C1>0 THEN LET A$=A$+"1,"+STR$ C1+";"
412 IF C2>0 THEN LET A$=A$+"2,"+STR$ C2+";"
413 IF C3>0 THEN LET A$=A$+"3,"+STR$ C3+";"
414 IF C4>0 THEN LET A$=A$+"4,"+STR$ C4+";"
415 IF C5>0 THEN LET A$=A$+"5,"+STR$ C5+";"
416 IF C6>0 THEN LET A$=A$+"6,"+STR$ C6+";"
417 LET A$=A$+"7,"+STR$ C7+";"
418 IF C8>0 THEN LET A$=A$+"8,"+STR$ C8+";"
419 IF C9>0 THEN LET A$=A$+"9,"+STR$ C9+";"
420 IF D1>0 THEN LET A$=A$+"10,"+STR$ D1+";"
421 IF D2>0 THEN LET A$=A$+"11,"+STR$ D2+";"
422 IF D3>0 THEN LET A$=A$+"12,"+STR$ D3+";"
423 IF D4>0 THEN LET A$=A$+"13,"+STR$ D4+";"
425 LET A$=A$( TO LEN A$-1)
428 PRINT AT 19,0; PAPER 5;" "
429 PRINT AT 19,0; PAPER 5; INK 0;A$
430 IF PP=0 THEN LPRINT A$
435 RETURN
530 PRINT AT 3,4;"#0=CHANNEL A: FINE =";C
531 PRINT TAB 4;"#1=CHANNEL A: COARSE =";C1
535 PRINT TAB 4;"#2=CHANNEL B: FINE =";C2
536 PRINT TAB 4;"#3=CHANNEL B: COARSE =";C3
540 PRINT TAB 4;"#4=CHANNEL C: FINE =";C4
541 PRINT TAB 4;"#5=CHANNEL C: COARSE =";C5
542 PRINT TAB 4;"#6=NOISE REGISTER =";C6
543 PRINT TAB 4;"#7=ENABLE REGISTER =";C7
544 PRINT TAB 4;"#8=CHANNEL A VOLUME =";C8
545 PRINT TAB 4;"#9=CHANNEL B VOLUME =";C9
546 PRINT TAB 4;"#10=CHANNEL C VOLUME =";D1
547 PRINT TAB 4;"#11=ENVELOPE FINE =";D2
548 PRINT TAB 4;"#12=ENVELOPE COURSE =";D3
549 PRINT TAB 4;"#13=ENVELOPE SHAPE =";D4
551 PRINT TAB 4;"''LIST OR PRINT DATA''"
552 PRINT TAB 4;"''PRE-RECORDED SOUND''"
570 RETURN
599 IF INKEY$<>"" THEN GO TO 599
600 IF z=3 THEN LET a=c: LET b=255: GO SUB 650: LET c=a
601 IF z=4 THEN LET a=c1: LET b=15: GO SUB 650: LET c1=a
602 IF z=5 THEN LET a=c2: LET b=255: GO SUB 650: LET c2=a
603 IF z=6 THEN LET a=c3: LET b=15: GO SUB 650: LET c3=a
604 IF z=7 THEN LET a=c4: LET b=255: GO SUB 650: LET C4=A
605 IF z=8 THEN LET a=c5: LET b=15: GO SUB 650: LET C5=A
606 IF z=9 THEN LET a=c6: LET b=31: GO SUB 650: LET C6=A
607 IF z=10 THEN LET a=c7: LET b=63: GO SUB 650: LET c7=a
608 IF z=11 THEN LET a=c8: LET b=16: GO SUB 650: LET c8=a
609 IF z=12 THEN LET a=c9: LET b=16: GO SUB 650: LET C9=A
610 IF z=13 THEN LET a=d1: LET b=16: GO SUB 650: LET D1=A
611 IF z=14 THEN LET a=d2: LET b=255: GO SUB 650: LET D2=A
612 IF z=15 THEN LET a=d3: LET b=255: GO SUB 650: LET D3=A
613 IF z=16 THEN LET a=d4: LET b=15: GO SUB 650: LET D4=A
615 IF Z=17 THEN LET PP=0: GO SUB 400: GO TO 120
616 IF Z=18 THEN GO TO 300
625 IF INKEY$=CHR$ 13 THEN GO TO 640
630 SOUND 0,c;1,c1;2,c2;3,c3;4,c4;5,c5;6,c6;7,c7;8,c8;9,c9;10,d1;11,d2;12,d3;13,d4
635 GO TO 600
640 IF INKEY$<>"" THEN GO TO 640
645 GO TO 120
650 IF INKEY$="" THEN GO TO 650
655 IF INKEY$="1" THEN LET a=a+1: IF a>b THEN LET a=0
656 IF INKEY$="2" THEN LET a=a+5: IF a>b THEN LET a=0
660 IF INKEY$="Q" THEN LET a=a-1: IF a<0 THEN LET a=b
661 IF INKEY$="W" THEN LET a=a-5: IF a<0 THEN LET a=b
663 IF INKEY$="0" AND z=10 THEN LET A=63: GO TO 670
665 IF INKEY$="0" THEN LET A=0
670 PRINT AT z,26;" ";AT z,26; INK 7;a
680 RETURN
700 CLS : FOR i=0 TO 2: PRINT AT i,0; PAPER 5;" ": NEXT i
705 PRINT AT 1,0; PAPER 1;"******** ADVANCED SOUND ********"
706 LET C=2: LET q=0
710 PRINT ''TAB 6;"1) TRANSPORTER"
711 PRINT TAB 6;"2) BOMB DROPPING"
712 PRINT TAB 6;"3) SPACE SHIP LANDING"
713 PRINT TAB 6;"4) WARP DRIVE"
714 PRINT TAB 6;"5) SUPERSPACE SPEED"
715 PRINT TAB 6;"6) INTERGALACTIC ALERT"
716 PRINT TAB 6;"7) PHASER FIRE"
718 PRINT TAB 6;"P) PRINTER(";"ON";"/";"OFF";")"
720 PRINT ; PAPER 1; INK 7;" PRESS 'ENTER' TO RETURN TO MENU"
725 PRINT AT 13,0; PAPER 5;" "
726 PRINT AT 16,2; PAPER 5; INK 0;" SOUND INFORMATION WILL BE DISPLAYED HERE"
730 IF INKEY$="" THEN GO TO 729
731 LET a$=INKEY$
733 PRINT AT 13,0; PAPER 5;" "
735 IF a$="P" AND C=3 THEN PRINT AT 11,6;"P) PRINTER(";"ON";"/";"OFF";")": LET C=2: LET q=0: GO TO 729
736 IF a$="P" AND C=2 THEN PRINT AT 11,6;"P) PRINTER(";"ON";"/";"OFF";")": LET C=3: LET q=1: GO TO 729
737 INK 0: PAPER 5
738 IF a$=CHR$ 13 THEN INK 7: PAPER 0: GO TO 300
739 GO SUB (VAL a$*10)+740
740 INK 7: PAPER 0: GO TO 729
750 LET C=2: FOR x=1 TO 2: PRINT #C;AT 13,0;" FOR a=1 TO 160"
752 PRINT #C;" SOUND 0,a;7,56;8,15:SOUND 2,a-1 0;9,15:SOUND 4,a-5;10,15"
753 PRINT #C;" NEXT a:SOUND 7,63": LET C=C+q: NEXT x: LET C=2
755 FOR a=1 TO 160
757 SOUND 0,a;7,56;8,15: SOUND 2,a-10;9,15: SOUND 4,a-5;10,15
758 NEXT a: SOUND 7,63: RETURN
760 LET C=2: FOR x=1 TO 2: PRINT #C;AT 13,0;" FOR a=1 TO 140"
762 PRINT #C;" SOUND 0,a;7,56;8,15:SOUND 2,a+1 ;9,15:SOUND 4,a;10, 15: NEXT a"
763 PRINT #C;" FOR a=1 TO 31:SOUND 6,a;7,7;8,1 6;9,16;10,16;12,56;13,8:PAUSE 9"
764 PRINT #C;" NEXT a:PAUSE 90:SOUND 7,63;13,0": LET C=C+q: NEXT x: LET C=2
765 FOR a=1 TO 140
767 SOUND 0,a;7,56;8,15: SOUND 2,a+1;9,15: SOUND 4,a;10,15: NEXT a
768 FOR a=1 TO 31: SOUND 6,a;7,7;8,16;9,16;10,16;12,56;13,8: PAUSE 9
769 NEXT a: PAUSE 90: SOUND 7,63;13,0: RETURN
770 LET C=2: FOR x=1 TO 2: PRINT #C;AT 13,0;" FOR a=1 TO 255"
771 PRINT #C;" SOUND 0,a-10;7,56;8,15:SOUND 2, a;9,15:SOUND 4,a-3;10,15"
772 PRINT #C;" SOUND 0,a+10;7,56;8,15:SOUND 2, a;9,15:SOUND 4,a+3;10,15"
773 PRINT #C;" NEXT a: FOR a=15 TO 0 STEP -1"
774 PRINT #C;" SOUND 8,a;9,a;10,a: NEXT a": LET C=C+Q: NEXT x: LET C=2
775 FOR a=1 TO 255
776 SOUND 0,a-10;7,56;8,15: SOUND 2,a;9,15: SOUND 4,a-3;10,15
777 SOUND 0,a+10;7,56;8,15: SOUND 2,a;9,15: SOUND 4,a+3;10,15
778 NEXT a: FOR a=15 TO 0 STEP -1
779 SOUND 8,a;9,a;10,a: NEXT a: RETURN
780 LET C=2: FOR x=1 TO 2: PRINT #C;AT 13,0;" FOR a=255 TO 1 STEP -1: LET k=1"
781 PRINT #C;" SOUND 0,a-5;1,k;7,56;8,15:SOUND 2,a+5;3,k;9,15:SOUND 4,a+5;5,k; 10,15: LET k=0"
782 PRINT #C;" SOUND 0,a-10;1,k;7,56;8,15: SOUND 2,a;3,k;9,15:SOUND 4,a-3; 5,k;10,15: NEXT a"
783 PRINT #C;" FOR a=15 TO 0 STEP -1:SOUND 8,a ;9,a;10,a: PAUSE 20: NEXT a"
784 LET C=C+Q: NEXT x: LET C=2
785 FOR a=255 TO 1 STEP -1: LET k=1
786 SOUND 0,a-5;1,k;7,56;8,15: SOUND 2,a+5;3,k;9,15: SOUND 4,a+5;5,k;10,15: LET k=0
787 SOUND 0,a-10;1,k;7,56;8,15: SOUND 2,a;3,k;9,15: SOUND 4,a-3;5,k;10,15: NEXT a
788 FOR a=15 TO 0 STEP -1: SOUND 8,a;9,a;10,a: PAUSE 20: NEXT a
789 RETURN
790 LET C=2: FOR x=1 TO 2: PRINT #C;AT 13,0;" FOR a=255 TO 1 STEP -1"
791 PRINT #C;" SOUND 0,a;7,56;8,15:SOUND 2,a-1 ;9,15:SOUND 4,a-20;10,15"
792 PRINT #C;" NEXT a:SOUND 7,63"
793 LET C=C+Q: NEXT x: LET C=2
795 FOR a=255 TO 1 STEP -1
796 SOUND 0,a;7,56;8,15: SOUND 2,a-1;9,15: SOUND 4,a-20;10,15
797 NEXT a: SOUND 7,63
798 RETURN
800 LET C=2: FOR m=1 TO 2: PRINT #C;AT 13,0;" FOR x=1 TO 5"
802 PRINT #C;" FOR a=40 TO 82"
803 PRINT #C;" SOUND 0,a;7,56;8,15:SOUND 2,a+1 ;9,15:SOUND 4,a;10,15"
804 PRINT #C;" NEXT a: NEXT x: SOUND 7,63": LET C=C+Q: NEXT m: LET C=2
806 FOR x=1 TO 5
807 FOR a=40 TO 82
808 SOUND 0,a;7,56;8,15: SOUND 2,a+1;9,15: SOUND 4,a;10,15
809 NEXT a: NEXT x: SOUND 7,63: RETURN
810 LET C=2: FOR x=1 TO 2: PRINT #C;AT 13,0;" FOR a=0 TO 31 STEP 3"
811 PRINT #C;" SOUND 6,a;7,7;8,15;9,16;10,15"
812 PRINT #C;" NEXT a: SOUND 7,63"
813 LET C=C+Q: NEXT x: LET C=2
816 FOR A=0 TO 31 STEP 3
817 SOUND 6,A;7,7;8,15;9,16;10,15
818 NEXT A: SOUND 7,63
819 RETURN
9997 STOP
9998 SAVE "SOUNDESIGN" LINE 10
9999 PRINT AT 10,3;" REWIND THE TAPE TO VERIFY ": VERIFY ""
4 REM S O U N D E S I G N
5 REM Copyright \* 1986
6 REM Written by James Edwards
7 REM A Product of ARROW SOFEWARE
11 BORDER 0: PAPER 0: INK 7: CLS
12 LET z=3: POKE 23658,8
13 LET W=1
30 FOR n=0 TO 7: READ a: POKE 65368+n,a: NEXT n:
31 DATA 0,8,12,14,255,14,12,8
35 LET c=0: LET c1=0: LET c2=0: LET c3=0: LET c4=0: LET c5=0: LET c6=0: LET c7=63: LET c8=0
36 LET c9=0: LET d1=0: LET d2=0: LET d3=0: LET d4=0
49 CLS : PRINT AT 2,0; PAPER 5; INK 0;"'1'=UP....'Q'=DOWN....'0'=RESET "
50 PRINT AT 0,0; PAPER 1;"***** S O U N D E S I G N ****** "
60 FOR A=165 TO 160 STEP -2
65 PLOT 0,A: DRAW INK 7;255,0
70 NEXT A
89 GO SUB 530: GO TO 120
100 PAUSE 0
104 IF INKEY$=CHR$ 13 THEN PRINT AT z,3; FLASH 1;"\a": GO TO 599
105 IF INKEY$="Q" THEN LET z=z+1: PRINT AT z-1,3;" "; OVER 1;" ": IF z>=19 THEN LET z=3
110 IF INKEY$="1" THEN LET z=z-1: PRINT AT z+1,3;" "; OVER 1;" ": IF z<=2 THEN LET z=18
120 PRINT AT z,3; INK 7;"\a"; OVER 1; PAPER 2; INK 6;" "
125 GO TO 100
300 CLS : FOR i=0 TO 2: PRINT AT i,0; PAPER 5;" ": NEXT i
301 LET PP=1
302 LET A$=""
305 PRINT AT 1,0; PAPER 1;"****** PRE-RECORDED SOUND ******"
310 PRINT ''TAB 7;"1) GUN SHOT"
311 PRINT TAB 7;"2) EXPLOSION"
312 PRINT TAB 7;"3) PING"
313 PRINT TAB 7;"4) TRAIN WHISLE"
314 PRINT TAB 7;"5) STEAMBOAT WHISLE"
315 PRINT TAB 7;"6) BELL"
316 PRINT TAB 7;"7) ORGAN CHORD"
317 PRINT TAB 7;"8) HELICOPTER "
318 PRINT TAB 7;"9) JET ENGINE"
319 PRINT TAB 7;"0) ADVANCED SOUND"
320 PRINT TAB 7;"P) PRINTER(";"ON";"/";"OFF";")"
325 PRINT '; PAPER 1; INK 7;"PRESS 'ENTER' TO RETURN TO MENU"
330 PAUSE 0
331 LET A$=INKEY$
335 IF A$="0" THEN GO TO 700
340 IF A$="1" THEN LET W=30: LET C6=15: LET C7=7: LET C8=16: LET C9=16: LET D1=16: LET D3=16: LET D4=0
341 IF A$="2" THEN LET W=90: LET C6=6: LET C7=7: LET C8=16: LET C9=16: LET D1=16: LET D3=56: LET D4=8
342 IF A$="3" THEN LET W=20: LET C=48: LET C7=62: LET C8=16: LET D3=25: LET D4=8
343 IF A$="4" THEN LET W=30: LET C=209: LET C2=93: LET C4=82: LET C6=31: LET C7=49: LET C8=15: LET C9=15: LET D1=15: LET D4=8
344 IF A$="5" THEN LET W=30: LET C=209: LET C2=118: LET C3=4: LET C4=118: LET C5=4: LET C6=19: LET C7=49: LET C8=15: LET C9=15: LET D1=15
345 IF A$="6" THEN LET W=30: LET C=55: LET C2=104: LET C4=104: LET C7=56: LET C8=16: LET C9=16: LET D1=16: LET D3=12
346 IF A$="7" THEN LET W=60: LET C=209: LET C2=156: LET C4=139: LET C7=56: LET C8=13: LET C9=12: LET D1=11
347 IF A$="8" THEN LET W=340: LET C7=31: LET D1=16: LET D3=2: LET D4=12
348 IF INKEY$="9" THEN LET W=200: LET C2=25: LET C6=15: LET C7=40: LET C9=15
354 IF A$="P" AND PP=0 THEN PRINT AT 14,7;"P) PRINTER(";"ON";"/";"OFF";")": LET PP=1: GO TO 370
355 IF A$="P" AND PP=1 THEN PRINT AT 14,7;"P) PRINTER(";"ON";"/";"OFF";")": LET PP=0: GO TO 370
363 IF A$=CHR$ 13 THEN GO TO 35
365 SOUND 0,c;1,c1;2,c2;3,c3;4,c4;5,c5;6,c6;7,c7;8,c8;9,c9;10,d1;11,d2;12,d3;13,d4
366 GO SUB 400
375 PAUSE W
378 LET c=0: LET c1=0: LET c2=0: LET c3=0: LET c4=0: LET c5=0: LET c6=0: LET c7=63: LET c8=0
379 LET c9=0: LET d1=0: LET d2=0: LET d3=0: LET d4=0
380 SOUND 0,0;1,0;2,0;3,0;4,0;5,0;6,0;7,63;8,0;9,0;10,0;11,0;12,0;13,0
399 GO TO 330
400 LET A$="SOUND "
410 IF C>0 THEN LET A$=A$+"0,"+STR$ C+";"
411 IF C1>0 THEN LET A$=A$+"1,"+STR$ C1+";"
412 IF C2>0 THEN LET A$=A$+"2,"+STR$ C2+";"
413 IF C3>0 THEN LET A$=A$+"3,"+STR$ C3+";"
414 IF C4>0 THEN LET A$=A$+"4,"+STR$ C4+";"
415 IF C5>0 THEN LET A$=A$+"5,"+STR$ C5+";"
416 IF C6>0 THEN LET A$=A$+"6,"+STR$ C6+";"
417 LET A$=A$+"7,"+STR$ C7+";"
418 IF C8>0 THEN LET A$=A$+"8,"+STR$ C8+";"
419 IF C9>0 THEN LET A$=A$+"9,"+STR$ C9+";"
420 IF D1>0 THEN LET A$=A$+"10,"+STR$ D1+";"
421 IF D2>0 THEN LET A$=A$+"11,"+STR$ D2+";"
422 IF D3>0 THEN LET A$=A$+"12,"+STR$ D3+";"
423 IF D4>0 THEN LET A$=A$+"13,"+STR$ D4+";"
425 LET A$=A$( TO LEN A$-1)
428 PRINT AT 19,0; PAPER 5;" "
429 PRINT AT 19,0; PAPER 5; INK 0;A$
430 IF PP=0 THEN LPRINT A$
435 RETURN
530 PRINT AT 3,4;"#0=CHANNEL A: FINE =";C
531 PRINT TAB 4;"#1=CHANNEL A: COARSE =";C1
535 PRINT TAB 4;"#2=CHANNEL B: FINE =";C2
536 PRINT TAB 4;"#3=CHANNEL B: COARSE =";C3
540 PRINT TAB 4;"#4=CHANNEL C: FINE =";C4
541 PRINT TAB 4;"#5=CHANNEL C: COARSE =";C5
542 PRINT TAB 4;"#6=NOISE REGISTER =";C6
543 PRINT TAB 4;"#7=ENABLE REGISTER =";C7
544 PRINT TAB 4;"#8=CHANNEL A VOLUME =";C8
545 PRINT TAB 4;"#9=CHANNEL B VOLUME =";C9
546 PRINT TAB 4;"#10=CHANNEL C VOLUME =";D1
547 PRINT TAB 4;"#11=ENVELOPE FINE =";D2
548 PRINT TAB 4;"#12=ENVELOPE COURSE =";D3
549 PRINT TAB 4;"#13=ENVELOPE SHAPE =";D4
551 PRINT TAB 4;"''LIST OR PRINT DATA''"
552 PRINT TAB 4;"''PRE-RECORDED SOUND''"
570 RETURN
599 IF INKEY$<>"" THEN GO TO 599
600 IF z=3 THEN LET a=c: LET b=255: GO SUB 650: LET c=a
601 IF z=4 THEN LET a=c1: LET b=15: GO SUB 650: LET c1=a
602 IF z=5 THEN LET a=c2: LET b=255: GO SUB 650: LET c2=a
603 IF z=6 THEN LET a=c3: LET b=15: GO SUB 650: LET c3=a
604 IF z=7 THEN LET a=c4: LET b=255: GO SUB 650: LET C4=A
605 IF z=8 THEN LET a=c5: LET b=15: GO SUB 650: LET C5=A
606 IF z=9 THEN LET a=c6: LET b=31: GO SUB 650: LET C6=A
607 IF z=10 THEN LET a=c7: LET b=63: GO SUB 650: LET c7=a
608 IF z=11 THEN LET a=c8: LET b=16: GO SUB 650: LET c8=a
609 IF z=12 THEN LET a=c9: LET b=16: GO SUB 650: LET C9=A
610 IF z=13 THEN LET a=d1: LET b=16: GO SUB 650: LET D1=A
611 IF z=14 THEN LET a=d2: LET b=255: GO SUB 650: LET D2=A
612 IF z=15 THEN LET a=d3: LET b=255: GO SUB 650: LET D3=A
613 IF z=16 THEN LET a=d4: LET b=15: GO SUB 650: LET D4=A
615 IF Z=17 THEN LET PP=0: GO SUB 400: GO TO 120
616 IF Z=18 THEN GO TO 300
625 IF INKEY$=CHR$ 13 THEN GO TO 640
630 SOUND 0,c;1,c1;2,c2;3,c3;4,c4;5,c5;6,c6;7,c7;8,c8;9,c9;10,d1;11,d2;12,d3;13,d4
635 GO TO 600
640 IF INKEY$<>"" THEN GO TO 640
645 GO TO 120
650 IF INKEY$="" THEN GO TO 650
655 IF INKEY$="1" THEN LET a=a+1: IF a>b THEN LET a=0
656 IF INKEY$="2" THEN LET a=a+5: IF a>b THEN LET a=0
660 IF INKEY$="Q" THEN LET a=a-1: IF a<0 THEN LET a=b
661 IF INKEY$="W" THEN LET a=a-5: IF a<0 THEN LET a=b
663 IF INKEY$="0" AND z=10 THEN LET A=63: GO TO 670
665 IF INKEY$="0" THEN LET A=0
670 PRINT AT z,26;" ";AT z,26; INK 7;a
680 RETURN
700 CLS : FOR i=0 TO 2: PRINT AT i,0; PAPER 5;" ": NEXT i
705 PRINT AT 1,0; PAPER 1;"******** ADVANCED SOUND ********"
706 LET C=2: LET q=0
710 PRINT ''TAB 6;"1) TRANSPORTER"
711 PRINT TAB 6;"2) BOMB DROPPING"
712 PRINT TAB 6;"3) SPACE SHIP LANDING"
713 PRINT TAB 6;"4) WARP DRIVE"
714 PRINT TAB 6;"5) SUPERSPACE SPEED"
715 PRINT TAB 6;"6) INTERGALACTIC ALERT"
716 PRINT TAB 6;"7) PHASER FIRE"
718 PRINT TAB 6;"P) PRINTER(";"ON";"/";"OFF";")"
720 PRINT ; PAPER 1; INK 7;" PRESS 'ENTER' TO RETURN TO MENU"
725 PRINT AT 13,0; PAPER 5;" "
726 PRINT AT 16,2; PAPER 5; INK 0;" SOUND INFORMATION WILL BE DISPLAYED HERE"
730 IF INKEY$="" THEN GO TO 729
731 LET a$=INKEY$
733 PRINT AT 13,0; PAPER 5;" "
735 IF a$="P" AND C=3 THEN PRINT AT 11,6;"P) PRINTER(";"ON";"/";"OFF";")": LET C=2: LET q=0: GO TO 729
736 IF a$="P" AND C=2 THEN PRINT AT 11,6;"P) PRINTER(";"ON";"/";"OFF";")": LET C=3: LET q=1: GO TO 729
737 INK 0: PAPER 5
738 IF a$=CHR$ 13 THEN INK 7: PAPER 0: GO TO 300
739 GO SUB (VAL a$*10)+740
740 INK 7: PAPER 0: GO TO 729
750 LET C=2: FOR x=1 TO 2: PRINT #C;AT 13,0;" FOR a=1 TO 160"
752 PRINT #C;" SOUND 0,a;7,56;8,15:SOUND 2,a-1 0;9,15:SOUND 4,a-5;10,15"
753 PRINT #C;" NEXT a:SOUND 7,63": LET C=C+q: NEXT x: LET C=2
755 FOR a=1 TO 160
757 SOUND 0,a;7,56;8,15: SOUND 2,a-10;9,15: SOUND 4,a-5;10,15
758 NEXT a: SOUND 7,63: RETURN
760 LET C=2: FOR x=1 TO 2: PRINT #C;AT 13,0;" FOR a=1 TO 140"
762 PRINT #C;" SOUND 0,a;7,56;8,15:SOUND 2,a+1 ;9,15:SOUND 4,a;10, 15: NEXT a"
763 PRINT #C;" FOR a=1 TO 31:SOUND 6,a;7,7;8,1 6;9,16;10,16;12,56;13,8:PAUSE 9"
764 PRINT #C;" NEXT a:PAUSE 90:SOUND 7,63;13,0": LET C=C+q: NEXT x: LET C=2
765 FOR a=1 TO 140
767 SOUND 0,a;7,56;8,15: SOUND 2,a+1;9,15: SOUND 4,a;10,15: NEXT a
768 FOR a=1 TO 31: SOUND 6,a;7,7;8,16;9,16;10,16;12,56;13,8: PAUSE 9
769 NEXT a: PAUSE 90: SOUND 7,63;13,0: RETURN
770 LET C=2: FOR x=1 TO 2: PRINT #C;AT 13,0;" FOR a=1 TO 255"
771 PRINT #C;" SOUND 0,a-10;7,56;8,15:SOUND 2, a;9,15:SOUND 4,a-3;10,15"
772 PRINT #C;" SOUND 0,a+10;7,56;8,15:SOUND 2, a;9,15:SOUND 4,a+3;10,15"
773 PRINT #C;" NEXT a: FOR a=15 TO 0 STEP -1"
774 PRINT #C;" SOUND 8,a;9,a;10,a: NEXT a": LET C=C+Q: NEXT x: LET C=2
775 FOR a=1 TO 255
776 SOUND 0,a-10;7,56;8,15: SOUND 2,a;9,15: SOUND 4,a-3;10,15
777 SOUND 0,a+10;7,56;8,15: SOUND 2,a;9,15: SOUND 4,a+3;10,15
778 NEXT a: FOR a=15 TO 0 STEP -1
779 SOUND 8,a;9,a;10,a: NEXT a: RETURN
780 LET C=2: FOR x=1 TO 2: PRINT #C;AT 13,0;" FOR a=255 TO 1 STEP -1: LET k=1"
781 PRINT #C;" SOUND 0,a-5;1,k;7,56;8,15:SOUND 2,a+5;3,k;9,15:SOUND 4,a+5;5,k; 10,15: LET k=0"
782 PRINT #C;" SOUND 0,a-10;1,k;7,56;8,15: SOUND 2,a;3,k;9,15:SOUND 4,a-3; 5,k;10,15: NEXT a"
783 PRINT #C;" FOR a=15 TO 0 STEP -1:SOUND 8,a ;9,a;10,a: PAUSE 20: NEXT a"
784 LET C=C+Q: NEXT x: LET C=2
785 FOR a=255 TO 1 STEP -1: LET k=1
786 SOUND 0,a-5;1,k;7,56;8,15: SOUND 2,a+5;3,k;9,15: SOUND 4,a+5;5,k;10,15: LET k=0
787 SOUND 0,a-10;1,k;7,56;8,15: SOUND 2,a;3,k;9,15: SOUND 4,a-3;5,k;10,15: NEXT a
788 FOR a=15 TO 0 STEP -1: SOUND 8,a;9,a;10,a: PAUSE 20: NEXT a
789 RETURN
790 LET C=2: FOR x=1 TO 2: PRINT #C;AT 13,0;" FOR a=255 TO 1 STEP -1"
791 PRINT #C;" SOUND 0,a;7,56;8,15:SOUND 2,a-1 ;9,15:SOUND 4,a-20;10,15"
792 PRINT #C;" NEXT a:SOUND 7,63"
793 LET C=C+Q: NEXT x: LET C=2
795 FOR a=255 TO 1 STEP -1
796 SOUND 0,a;7,56;8,15: SOUND 2,a-1;9,15: SOUND 4,a-20;10,15
797 NEXT a: SOUND 7,63
798 RETURN
800 LET C=2: FOR m=1 TO 2: PRINT #C;AT 13,0;" FOR x=1 TO 5"
802 PRINT #C;" FOR a=40 TO 82"
803 PRINT #C;" SOUND 0,a;7,56;8,15:SOUND 2,a+1 ;9,15:SOUND 4,a;10,15"
804 PRINT #C;" NEXT a: NEXT x: SOUND 7,63": LET C=C+Q: NEXT m: LET C=2
806 FOR x=1 TO 5
807 FOR a=40 TO 82
808 SOUND 0,a;7,56;8,15: SOUND 2,a+1;9,15: SOUND 4,a;10,15
809 NEXT a: NEXT x: SOUND 7,63: RETURN
810 LET C=2: FOR x=1 TO 2: PRINT #C;AT 13,0;" FOR a=0 TO 31 STEP 3"
811 PRINT #C;" SOUND 6,a;7,7;8,15;9,16;10,15"
812 PRINT #C;" NEXT a: SOUND 7,63"
813 LET C=C+Q: NEXT x: LET C=2
816 FOR A=0 TO 31 STEP 3
817 SOUND 6,A;7,7;8,15;9,16;10,15
818 NEXT A: SOUND 7,63
819 RETURN
9997 STOP
9998 SAVE "SOUNDESIGN" LINE 10
9999 PRINT AT 10,3;" REWIND THE TAPE TO VERIFY ": VERIFY ""
Note: Type-in program listings on this website use ZMAKEBAS notation for graphics characters.
