--- title: "Sounder: Using SOUND on the 2068" type: "article" slug: "sounder-using-sound-on-the-2068" url: "http://localhost/article/sounder-using-sound-on-the-2068/" markdown_url: "http://localhost/article/sounder-using-sound-on-the-2068.md" published_at: "2022-10-07T12:28:00+00:00" modified_at: "2026-08-01T20:19:46+00:00" featured_image: url: "http://localhost/wp-content/uploads/2022/04/20230809-041332.jpg" excerpt: "A COMMENT When writing an article I always try to do something which will encourage others to try their hand at learning to program for themself. While SOUNDER is a working program, it is open to improvement and I hope some of you will do just that. You may want to allow for larger files,…" category: - name: "SUM" slug: "sum" taxonomy: "category" url: "http://localhost/category/periodicals/sum/" post_tag: - name: "Best of Timex/Sinclair 2068 Articles and Documents" slug: "ts2068best" taxonomy: "post_tag" url: "http://localhost/tag/ts2068best/" - name: "Full Text" slug: "fulltext" taxonomy: "post_tag" url: "http://localhost/tag/fulltext/" - name: "TS 2068" slug: "ts2068" taxonomy: "post_tag" url: "http://localhost/tag/ts2068/" - name: "Type-in program" slug: "type-in-program" taxonomy: "post_tag" url: "http://localhost/tag/type-in-program/" model: - name: "Timex/Sinclair 2068" slug: "ts-2068" taxonomy: "model" url: "http://localhost/model/ts-2068/" indiv: - name: "Andy Centek (WB8AHX)" slug: "andy-centek" taxonomy: "indiv" url: "http://localhost/indiv/andy-centek/" publication_r: id: 10242 title: "SUM" type: "periodical" url: "http://localhost/periodical/sum/" authors: "Andy Centek" authors_r: - name: "Andy Centek (WB8AHX)" slug: "andy-centek" taxonomy: "indiv" url: "http://localhost/indiv/andy-centek/" volume: "4" issue: "7" issues_articles: - id: 39354 title: "SUM v4 n7" type: "issue" url: "http://localhost/issue/sum-v4-n7/" pages: "7-10" pubdate: "July 1986" archive_link: false --- # Sounder: Using SOUND on the 2068 ### A COMMENT When writing an article I always try to do something which will encourage others to try their hand at learning to program for themself. While SOUNDER is a working program, it is open to improvement and I hope some of you will do just that. You may want to allow for larger files, add new routines, or anything that you think will make it better. How about adding a Catalog file? ### SOME PARTICULARS The program starts out by going to a subroutine which draws the logo for the opening screen at line 580. After this it draws the working screen at line 25. Then comes the routine for adding the screen commands at line 95. Next comes the main part of the program starting at line 145. Here we have a part of the program which keeps track of the command keys that are pressed by the User. [If for example the User presses the “8” key, a jump is made to a Subroutine which keeps track of seeing if the key is still pressed and starts the amount (Amt) going upward in value. If the key is released, then the program is RETURNed to where it came from. The same thing happens in reverse for the countdown routine. All other routines are sensed from the keyboard in the same manner as the above. It is which key has been pressed that determines which sub-routine the program goes to. These Subs are labled according to their function. For example: GOSUB tape makes the program do the TAPE routine at line 350. Use the 8 & 5 keys to change the value of each register for the particular sound you wish to make. Press six to move to the next register and then follow the menu at the bottom of the screen to sound off, Retain, or SAVE the values. ### THE MEMORY The memory which is used to store the values for the Registers is broken into two parts; one holds the register numbers (at 59000), and the other saves the values which go into the registers (at 60000). These locations were picked because they are high in memory. Why are they split into two groups? I felt it was easier from a programing view to do so. It allows one variable to count for both locations rather than having them at one location and having to alternate the values. ### TAPE IT Once the TAPE option has been chosen, the two memory locations which hold the data for the sound program(s) is altered and put into one location for ease of handling to tape. The two locations are PEEKED and then stored in location 58000. The data is saved in alternate fashion; first the register number and then a value of that given register. ### GET A SOUND When a request for a sound is made from the keyboard, a prompt asks for either ALL or LAST entry. Here is an area which may be altered to suit your needs. The routine begins at line 270. Either choice is routed to the proper routine. One will allow only the last 13 entries to be called up. The other will call all the memory up to a given limit which you may set. Default is 20 complete register pairs (13*20). ### WHY DIDN’T I? Why didn’t I make it more elaborate? The first thing a program should be is User friendly. It should not burden the User with to many commands which are hard to remember. The more the program grows (as a rule), the harder it gets to use easily. Number two, it was left this way with hopes that some of you would taylor it to your liking. Have I changed it much since the beginning? You bet! All ideas may be improved upon with enough thinking! ### SOME THOUGHTS How about sound routines that may be entered into a question and answer type program which would produce some wierd noises for the wrong or right answers? Looking for that “spacey” sound? Try some of the basic sounds given in your manual and go from there. Have you tried immitating a cricket? How about a frog? Sounds are of unlimited supply, it’s up to you. ### ATTACK AND FALL Well ok, it’s decay, not fall. Sounds which you hear every day are produced with these two terms. Attack is simply how fast a sound reaches it maximum peak level. Decay is how long it takes it to drop back off. Now as for the cricket, it has (I think) about an even attack and decay range. That gives us approximently a SAWTOOTH wave form. See page 193 of your manual: Fig 10. Now if the sound were very fast in rising (attack) and slower in falling off (decay), then fig 8 would fill the bill. ### AND THERE You have it. These are some basic ideas to help you in getting started. The rest is up to you. Try it out and have some fun. ## Source Code ``` 5 REM sound Routine-Enters sound frim keyboard 10 GO SUB 580 15 GO SUB 550: REM setup vars 20 REM PRINT LOGO SCREEN 25 REM 2ND SCREEN 30 PRINT AT P,0;"\ : ": LET P=P+1 35 IF P=22 THEN GO TO 45 40 GO TO 30 45 LET P=1 50 PRINT AT 21,P;"\..": LET P=P+1: IF P=31 THEN GO TO 60 55 GO TO 50 60 LET P=21 65 PRINT AT P,31;"\: ": LET P=P-1: IF P=-1 THEN GO TO 75 70 GO TO 65 75 LET P=30 80 PRINT AT 0,P;"\..": LET P=P-1: IF P=0 THEN GO TO 90 85 GO TO 80 90 REM PRINT SCREEN DATA 95 PRINT AT 0,1;"REGISTERS ";AT 0,12;"VALUES ";AT 0,20;"FUNCTIONS " 100 PRINT AT 2,5;"0";AT 2,21;"Fine Tune";AT 3,5;"1";AT 3,21;"C Tune" 105 PRINT AT 4,5;"2";AT 4,21;"Fine Tune";AT 5,5;"3";AT 5,21;"C Tune" 110 PRINT AT 6,5;"4";AT 6,21;"Fine Tune";AT 7,5;"5";AT 7,21;"C Tune";AT 8,5;"6";AT 8,21;"Noise" 115 PRINT AT 9,5;"7";AT 9,21;"Enable";AT 10,5;"8";AT 10,21;"Amplitude";AT 11,5;"9";AT 11,21;"Amplitude" 120 PRINT AT 12,5;"10";AT 12,21;"16 Enables";AT 13,5;"11";AT 13,21;"FT-Time" 125 PRINT AT 14,5;"12";AT 14,21;"CT-Tune";AT 15,5;"13";AT 15,21;"Shape" 130 PLOT 5,40: DRAW 245,0 135 PRINT AT 16,2;"REG #";AT 17,2;"1-HOLD S-SOUND";AT 18,2;"2-ALTERNATE E-ERASE";AT 19,2;"4-ATTACK R-SAVE";AT 20,2;"8-RETAIN" 140 PRINT AT 20,14;"T-TAPE ";AT 17,23;AT 18,23;"D-VALS";AT 19,26;"TO";AT 20,24;"SCREEN" 145 LET A$=INKEY$: REM GET CURSOR KEY 150 PRINT AT R,15;"\::": IF R>2 THEN PRINT AT R-1,15;" " 155 IF A$="6" THEN GO SUB CURSOR 160 IF A$="S" OR A$="s" THEN GO TO 275 165 IF A$="D" OR A$="d" THEN GO TO 320 170 IF A$="E" OR A$="e" THEN GO SUB ERASE 175 IF A$="N" OR A$="n" THEN GO SUB NOISE 180 IF A$="T" OR A$="t" THEN GO SUB TAPE 185 IF A$="R" OR A$="r" THEN GO SUB SAVE 195 IF A$="8" THEN GO SUB CUP 200 IF A$="5" AND AMT>0 THEN GO SUB CDOWN 205 GO TO 145 210 REM MOVE CURSOR 215 LET R=R+1 220 IF R=16 THEN PRINT AT 16,14;" ";AT 16,12;" ";AT 15,15;" ": LET R=2: PLOT 95,40: DRAW 30,0 225 RETURN 230 REM GET UP COUNT REG VALS 235 LET AMT=AMT+1 240 IF R=2 OR R=4 OR R=6 OR R=13 OR R=14 THEN PRINT AT R,12;AMT: IF AMT>255 THEN LET AMT=0: PRINT AT R,12;" " 245 IF R=3 OR R=5 OR R=7 OR R=10 OR R=11 OR R=12 OR R=15 THEN PRINT AT R,12;AMT: IF AMT>15 THEN LET AMT=0: PRINT AT R,13;" " 250 IF R=9 THEN PRINT AT R,12;AMT: IF AMT=64 THEN LET AMT=0: PRINT AT R,11;" " 255 IF R=8 THEN PRINT AT R,12;AMT: IF AMT=32 THEN LET AMT=0: PRINT AT R,11;" " 260 IF A$="R" OR A$="r" THEN BEEP .1,.05: GO SUB SAVE 265 RETURN 270 REM SOUND ROUTINE 275 CLS : INPUT "LAST sound or ALL sounds in Memory L/A ?";Q$: IF Q$="L" THEN GO TO 500 280 PRINT AT 8,5;"YOUR SOUND IS --": LET T=0: LET MEM1=59000: LET MEM2=60000: PAUSE 30 285 SOUND PEEK MEM1,PEEK MEM2: LET MEM1=MEM1+1: LET MEM2=MEM2+1: IF T=13 THEN GO TO 295 290 LET T=T+1: GO TO 285 295 PRINT AT 10,5;"PRESS ANY KEY TO QUIT.": PAUSE 0: FOR N=0 TO 13: SOUND N,0: NEXT N: CLS : GO TO 25 300 REM GET GIVEN SOUNDS 305 INPUT "WHICH SOUND GROUP 1-20) ?";GRP: REM MAY BE CHANGED TO ANY # OF GROUPS UP TO MEMORY LIMIT.LINE 929 & 840. 310 GO TO 500 315 REM VALUES TO SCREEN 320 CLS : LET C=1: LET A$=INKEY$: LET MEM1=59000: LET MEM2=60000: LET T=0 325 PRINT AT 0,0;"REGISTER #'s";AT 0,15;"VALUES";AT 0,23;"q-Quits" 330 PRINT PEEK MEM1,PEEK MEM2 335 LET MEM1=MEM1+1: LET MEM2=MEM2+1: LET T=T+1: IF T=13 THEN LET T=0: GO TO 345 340 GO TO 330 345 PRINT AT 20,0; BRIGHT 1;C; BRIGHT 0;" -GROUP OF 14 REGISTERS. ANY KEY CONTINUES."; PAUSE 0: LET C=C+1: FOR N=1 TO 14: PRINT AT N,0;" ";AT N,15;" ": LET a$=INKEY$: IF a$="q" OR a$="Q" THEN CLS : GO TO 15 346 NEXT n: CLS : GO TO 325 350 REM TAPE ROUTINE 355 CLS : PRINT AT 2,0;"THIS ROUTINE WILL CALL ALL SOUND VALUES FROM MEMORY TO TAPE.WHEN RE-LOADED THE REGISTER WILL BE THE FIRST# AND THE VALUE THE 2ND.# . ALTERNATED ORDER." 360 PRINT FLASH 1;AT 12,4;"MEMORY BEING READYED --" 365 LET P1=59000: LET P2=60000: LET P3=58000 370 POKE P3,PEEK P1: LET P1=P1+1: POKE P3,PEEK P2: LET P2=P2+1: LET P3=P3+1: IF P3=58360 THEN GO TO 380 375 GO TO 370 380 FLASH 0: CLS : SAVE "REGVALS"CODE 58000,360 385 STOP 390 REM ERASE ROUTINE 395 BEEP .2,.05 400 INPUT AT 2,5;"ARE YOU SURE ? Y/N ";Q$: IF Q$="N" OR Q$="n" THEN GO TO 25 405 LET mem1=59000: LET mem2=60000: 410 PRINT AT 2,8;"ERASING" 415 POKE MEM1,0: POKE MEM2,0: LET MEM1=MEM1+1: LET MEM2=MEM2+1: IF MEM1=59280 THEN GO TO 425 420 GO TO 415 425 PRINT AT 15,12;"ERASED": BEEP .5,.1: PAUSE 50: CLS : GO TO 15 430 GO TO 15 435 REM SAVE DATA TO MEMORY 440 POKE MEM1,R-2: POKE MEM2,AMT 445 BEEP .05,.1: PRINT AT 1,8;"DATA SAVED": PAUSE 70: PRINT AT 1,8;" ": LET MEM1=MEM1+1: LET MEM2=MEM2+1 450 IF MEM1=59280 THEN GO TO 460 455 RETURN 460 CLS : PRINT AT 10,5;"MEMORY FULL.": STOP 465 REM COUNT DOWN AMT 470 LET AMT=AMT-1 475 LET A$=INKEY$: IF A$<>"5" THEN RETURN 480 IF AMT<100 THEN PRINT AT R,14;" ";AT R,12;AMT 485 IF AMT<10 THEN PRINT AT R,13;" ";AT R,12;AMT 490 IF AMT=0 THEN LET AMT=0: PRINT AT R,13;" ": RETURN 495 GO TO 470 500 REM GET A GROUP 505 INPUT "WHICH GROUP (1-20) ?";GRP 510 LET MEM1=59000: LET MEM2=60000 515 IF GRP=1 THEN GO TO 280 520 LET MEM1=MEM1+(14*GRP): LET MEM2=MEM2+(14*GRP) 525 PRINT AT 5,5;"THAT SOUND IS --": GO TO 285 530 LET MEM1=59000: LET MEM2=60000: LET T=0 535 SOUND PEEK MEM1,PEEK MEM2: IF T=13 THEN GO TO 295 540 GO TO 535 545 REM VARIBLES 550 LET TAPE=355: LET ERASE=395: LET RETAIN=440: LET GET=305: LET DATA=235 560 LET AMT=0: LET CURSOR=215: LET CUP=235: LET CDOWN=470 565 LET n=1: LET r=2: LET c=0: LET P=1: LET A=1: DIM a(14): DIM y(14) 570 LET MEM1=59000: LET MEM2=60000: LET SAVE=440: LET D=1 575 RETURN 580 REM DRAW LOGO SCREEN 585 LET E=175: LET C=255 590 PLOT 0,E: DRAW C,0: LET E=E-1 595 IF E=145 THEN GO TO 605 600 GO TO 590 605 LET C=20 610 PLOT 0,E: DRAW C,0: LET E=E-1: IF E=125 THEN GO TO 620 615 GO TO 610 620 LET C=20 625 PLOT 0,E: DRAW C,0: DRAW C,0: LET E=E-1: IF E=110 THEN GO TO 635 630 GO TO 625 635 LET C=20 640 PLOT 0,E: DRAW C,0: LET E=E-1: IF E=95 THEN GO TO 650 645 GO TO 640 650 LET C=50 655 PLOT 0,E: DRAW C,0: DRAW 0,35: DRAW -20,0: DRAW 0,9: DRAW 40,0 660 LET E=138: LET C=225 665 PLOT 30,E: DRAW C,0: LET E=E-1: IF E=130 THEN GO TO 675 670 GO TO 665 675 PLOT 70,95: DRAW 0,30: DRAW 30,0: DRAW 0,-30: DRAW -30,0 680 PLOT 160,95: DRAW 0,30: DRAW 5,0: DRAW 30,-30: DRAW 5,0: DRAW 0,30: DRAW -30,20: DRAW -5,0 685 PLOT 75,100: DRAW 0,20: DRAW 20,0: DRAW 0,-20: DRAW -20,0 690 PLOT 160,95: DRAW 0,30: DRAW 5,0: DRAW 30,-30: DRAW 5,0: DRAW 0,-20: DRAW -30,20: DRAW -5,0 695 PLOT 110,95: DRAW 0,30: DRAW 5,0: DRAW 0,-25: DRAW 20,0: DRAW 0,25: DRAW 5,0: DRAW 0,-30: DRAW -30,0 700 PLOT 160,95: DRAW 5,0: DRAW 0,30: PLOT 220,95: DRAW 0,30: DRAW 20,0: DRAW 5,-5: DRAW 0,-20: DRAW -5,-5: DRAW -20,0 705 PLOT 225,100: DRAW 0,20: DRAW 10,0: DRAW 5,-5: DRAW 0,-10: DRAW -5,-5: DRAW -10,0 710 LET T=250 715 PLOT T,130: DRAW 0,-40:: LET T=T+1: IF T=256 THEN GO TO 725 720 GO TO 715 725 LET K=90 730 PLOT 255,K: DRAW -255,0: LET K=K-1: IF K=85 THEN GO TO 740 735 GO TO 730 740 LET E=90 745 PLOT 0,E: DRAW 50,0: LET E=E-1: IF E=0 THEN GO TO 755 750 GO TO 745 755 PLOT 70,70: DRAW 0,-40: DRAW 40,0: DRAW 0,40: DRAW -40,0 760 PLOT 60,75: DRAW 40,0: DRAW 10,-5: DRAW -40,0: DRAW -10,5: DRAW 0,-40: DRAW 10,-5 765 PLOT 75,65: DRAW 25,0: DRAW 0,-25: DRAW -25,0: DRAW 0,25: PLOT 120,60: DRAW 25,0: DRAW 5,-5: DRAW -20,0: DRAW 0,-10: DRAW 10,0: DRAW 5,-5: DRAW -10,0: DRAW 0,-10: DRAW -15,0: DRAW 0,30 770 PLOT 167,60: DRAW 25,0: DRAW 5,-5: DRAW -20,0: DRAW 0,-10: DRAW 10,0: DRAW 5,-5: DRAW -10,0: DRAW 0,-10: DRAW -15,0: DRAW 0,30 775 LET E=65 780 PLOT 75,E: DRAW 25,0: LET E=E-1: IF E=40 THEN GO TO 790 785 GO TO 780 790 LET E=20 795 PLOT 50,E: DRAW 205,0: LET E=E-1: IF E=0 THEN GO TO 805 800 GO TO 795 805 LET E=225 810 PLOT E,20: DRAW 0,70: LET E=E+1: IF E=256 THEN GO TO 820 815 GO TO 810 820 LET E=225 825 PLOT E,20: DRAW 0,70: LET E=E+1: IF E=256 THEN GO TO 845 830 GO TO 835 835 PRINT AT 20,15;"BY:" 840 LET Z=1 845 LET K=INT (RND*7): LET Z=Z+1: IF Z=30 THEN GO TO 855 850 BEEP .02,K: GO TO 845 855 PRINT AT 20,15;"Andy Centek": PAUSE 300: CLS : RETURN 860 PRINT AT 20,15;"Andy Centek": PAUSE 300: CLS : RETURN ```