Soundesign 2068

Products: Soundesign 2068
Developer(s): James Edwards
Date: 1986
Type: Program
Platform(s): TS 2068
Tags: Sound

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:

  1. Initialization (lines 11–36): Sets screen colors, defines the UDG arrow sprite, and zeroes all 14 AY register variables.
  2. 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.
  3. 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.
  4. SOUND string builder / printer (lines 400–435): Assembles a human-readable SOUND statement from current register values and optionally sends it to the printer.
  5. 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.
  6. 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:

VariableRegister #FunctionMax Value
c0Channel A Tone Fine255
c11Channel A Tone Coarse15
c22Channel B Tone Fine255
c33Channel B Tone Coarse15
c44Channel C Tone Fine255
c55Channel C Tone Coarse15
c66Noise Period31
c77Mixer/Enable Register63
c88Channel A Volume16
c99Channel B Volume16
d110Channel C Volume16
d211Envelope Fine Period255
d312Envelope Coarse Period255
d413Envelope Shape15

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 0 at line 100 efficiently halts execution until any keypress, avoiding a busy-wait loop for the main menu.
  • The OVER 1 print 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 than A$="9", which is inconsistent with lines 340–347. Since PAUSE 0 at line 330 waits for a keypress and the key is captured into A$ 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=0 unconditionally 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

Appears On

Related Products

Design your own sound effects or musical effects for your own programs. Menu-driven, uses 3 keys. Design a sound, print...

Related Articles

Related Content

Image Gallery

Soundesign 2068

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.

Scroll to Top