10 REM ++++++++++++++++++++++++++++++++ 11 REM ! Program .... SYNTH6.BAS 12 REM ! Utg}va 1986-05-19 13 REM ! av David Andersson <5201> 14 REM ! ABC80 i grundutf|rande 15 REM ! Ins{nt <5201> 16 REM ++++++++++++++++++++++++++++++++ 17 REM 18 REM SPELA MUSIK P] KLAVIATUR 19 REM P] ABC80;S TANGENTBORD. 20 REM ------------------------------- 21 REM 22 REM Ljudgeneratorn OUT 6 anv{nds. 23 REM Maskinkod l{ggs i poke-arean. 24 REM 25 REM  26 A9%=36% 27 DIM A$=A9%,D%(A9%),L%(A9%),X%(A9%),Y%(A9%) 28 DIM F%(42%),I%(127%) 29 REM 30 REM Maskinberoende justeringar. 31 REM [ndra L0%,L1% och L8% om 32 REM ljudet blir d}ligt. 33 REM 34 REM Attack- och delay-tid (0..15) 35 L0%=4% 36 REM Attack niv} (0..100) 37 L1%=12% 38 REM Sustain niv} (0..100) 39 L8%=1% 40 GOSUB 160 41 F0%=5% : K1%=0% : K2%=0% : K3%=0% : K4%=0% 42 GOSUB 119 43 GOSUB 154 44 GOSUB 88 : GOSUB 133 45 REM MAINLOOP 46 IF PEEK(65013%) POKE 65013%,0% : I%=INP(56%) AND 127% ELSE 45 47 D%=I%(I%) : IF D% GOSUB 54 : GOTO 45 48 I%=INSTR(1%,'0123489?',CHR$(I%)) : IF I%=0% GOTO 45 49 ON I% GOSUB 51,67,70,73,77,61,64,81 50 GOTO 45 51 REM END 52 ; CUR(22%,0%); 53 END 54 REM LJUD 55 X%=X%(D%) : Y%=Y%(D%) : D1%=DOT(X%,Y%) 56 IF D1% CLRDOT X%,Y% ELSE SETDOT X%,Y% 57 IF K4%=1% OUT 6%,0% 58 POKE M1%,L%(D%) : Z%=CALL(M%,D%(D%)) : IF K4%=2% OUT 6%,0% 59 IF D1% SETDOT X%,Y% ELSE CLRDOT X%,Y% 60 RETURN 61 REM BYTA OKTAV 62 IF F0%>5% F0%=F0%-2% : GOSUB 109 : GOSUB 133 63 RETURN 64 REM BYTA OKTAV 65 IF F0%<15% F0%=F0%+2% : GOSUB 109 : GOSUB 133 66 RETURN 67 REM SUSTAIN 68 K1%= NOT K1% : GOSUB 97 : GOSUB 133 69 RETURN 70 REM ATTACK 71 K2%= NOT K2% : GOSUB 97 : GOSUB 133 72 RETURN 73 REM DELAY 74 K3%=K3%+1% : IF K3%>2% K3%=0% 75 GOSUB 97 : GOSUB 133 76 RETURN 77 REM KLICK 78 K4%=K4%+1% : IF K4%>2% K4%=0% 79 GOSUB 97 80 RETURN 81 REM ? 82 ; CHR$(12%);' SYNTH ' 83 ; STRING$(PEEK(590%),61%); 84 ; CUR(12%,PEEK(590%)/2%-10%)'Ingen hj{lptext'; 85 GET G$ 86 GOSUB 88 : GOSUB 133 87 RETURN 88 REM RITA SK[RMBILD 89 ; CHR$(12%);' SYNTH ' 90 ; STRING$(PEEK(590%),61%); 91 GOSUB 97 92 ; : ; 93 ; ' Spela med mittersta och |versta' 94 ; ' bosktavsraderna p} tangentbordet.' 95 GOSUB 109 96 RETURN 97 REM RITA MENY 98 ; CUR(3%,0%); 99 ; ' 1 - Str{ng, (oneshot)', : IF K1%=0% ; 'Nej' ELSE ; 'Ja ' 100 ; ' 2 - Attack, (anslag)', : IF K1% ; ' ' ELSE IF K2% ; 'L}ng' ELSE ; 'Kort' 101 ; ' 3 - Delay, (avklingning)', : IF K3% ; K3%' ' ELSE ; 'Nej' 102 ; ' 4 - Klick',, : IF K4%=0% ; 'Nej ' ELSE IF K4%=1% ; 'F|re ' ELSE ; 'Efter' 103 ; 104 ; ' 8 - Flytta till h|gre toner' 105 ; ' 9 - Flytta till l{gre toner' 106 ; 107 ; ' 0 - Avsluta' 108 RETURN 109 REM RITA KLAVIATUR 110 RESTORE 114 111 FOR I%=18% TO 22% : READ G$ : ; CUR(I%,0%)CHR$(23%)G$; : NEXT I% 112 ; CUR(21%,37%)CHR$(1%); 113 RETURN 114 DATA ' j5 j5 j5 j5 j5 j5 j5 j5 j5 j5 j5 j5 j' 115 DATA 'Qj5Wj5Ej5Rj5Tj5Yj5Uj5Ij5Oj5Pj5]j5^jRET' 116 DATA 'jjjjjjjjjjjjj' 117 DATA 'jAjjSjjDjjFjjGjjHjjJjjKjjLjj\jj[jj"j <-' 118 DATA 'jjjjjjjjjjjjj' 119 REM LADDA TONER I F%() 120 REM 3 MHz CPU-klocka ger 880 Hz p} l{gsta A-tonen 121 RESTORE 127 122 FOR F%=1% TO 42% 123 READ F : IF F>0 F%(F%)=299.04/F-3.158 ELSE F%(F%)=0% 124 NEXT F% 125 RETURN 126 REM CCDDEFFGGAAH 127 DATA 1.0000,1.0606,1.1250,1.1859,1.2500,0.0000,1.3333 128 DATA 1.4142,1.5000,1.5811,1.6667,1.7678,1.8750,0.0000 129 DATA 2.0000,2.1213,2.2500,2.3717,2.5000,0.0000,2.6667 130 DATA 2.8284,3.0000,3.1623,3.3333,3.5355,3.7500,0.0000 131 DATA 4.0000,4.2426,4.5000,4.7434,5.0000,0.0000,5.3333 132 DATA 5.6569,6.0000,6.3246,6.6667,7.0711,7.5000,0.0000 133 REM LADDA TONER I D%(),L%() OCH REFERENSER I I%() 134 L3%=L0%*256%*2%^K3%/4% 135 FOR A%=1% TO LEN(A$) : A1%=ASC(MID$(A$,A%,1%)) : A2%=A%+A%/2% : A3%=0% 136 F1%=F0%+A% : D%=F%(F1%) : IF A% AND 1% GOTO 139 137 IF F1%>14% F1%=F1%-14% : GOTO 137 138 ; CUR(23%,A2%-1%)MID$('cdefgah',F1%/2%+1%,1%); 139 IF D% GOTO 142 140 IF A%>1% ; CUR(18%,A2%-1%)'j'; : ; CUR(19%,A2%-1%)'j'; ELSE ; CUR(18%,A2%)'j'; : ; CUR(19%,A2%)'j'; 141 GOTO 146 142 IF D%<16% OR D%>255% STOP 143 IF K1% D1%=D%-1% ELSE IF K2%=0% D1%=D%-1%-D%*L8%/100% ELSE D1%=D%-1%-D%*L1%/100% 144 D2%=D%-D1% 145 D%(A%)=D1%+SWAP%(D2%) : L%(A%)=L3%/D%+1% : A3%=A% 146 I%(A1%)=A3% : IF A1%>=64% I%(A1% XOR 32%)=A3% 147 NEXT A% 148 REM [NDRA I MASKINKODEN 149 POKE M4%,128% : POKE M5%,4% : POKE M2%,28%,21% : POKE M3%,20%,29% 150 IF K1% POKE M4%,0% : RETURN 151 IF K2%=0% POKE M2%,0%,0% 152 IF K3%=0% POKE M5%,8% 153 RETURN 154 REM LADDA X%(),Y%(),A$ 155 A$="QaWsEdRfTgYhUjIkOlP|]{^'"+CHR$(13%,8%) 156 FOR A%=1% TO A9% 157 X%(A%)=67%-(A% AND 1%)*12% : Y%(A%)=A%*3%-1%+(A% AND 1%) 158 NEXT A% 159 RETURN 160 REM LADDA MASKINKOD 161 M%=65408% 162 M1%=M%+4% 163 M2%=M%+49% 164 M3%=M%+53% 165 M4%=M%+46% 166 M5%=M%+48% 167 POKE 65408,219%,56%,79%,38%,127%,123%,214%,8%,71%,62% 168 POKE 65418,0%,56%,7%,40%,5%,43%,62%,0%,16%,251% 169 POKE 65428,211%,6%,66%,43%,62%,121%,16%,251%,211%,6% 170 POKE 65438,67%,203%,124%,40%,236%,219%,56%,185%,79%,40% 171 POKE 65448,4%,254%,128%,48%,12%,230%,128%,40%,4%,0% 172 POKE 65458,0%,32%,206%,0%,175%,32%,202%,201% 173 RETURN