1 REM Ins{nd av David Andersson <5201> 1986-05-19 23.46.50 10 REM . SAVE SYNTH6 20 REM ------------------------------- 30 REM 1986-05-19 40 REM DAVID ANDERSSON <5201> 50 REM 60 REM SPELA MUSIK P] KLAVIATUR 70 REM P] ABC80;S TANGENTBORD. 80 REM ------------------------------- 90 REM 100 REM Ljudgeneratorn OUT 6 anv{nds. 110 REM Maskinkod l{ggs i poke-arean. 120 REM 130 REM  140 A9%=36% 150 DIM A$=A9%,D%(A9%),L%(A9%),X%(A9%),Y%(A9%) 160 DIM F%(42%),I%(127%) 170 REM 180 REM Maskinberoende justeringar. 190 REM [ndra L0%,L1% och L8% om 200 REM ljudet blir d}ligt. 210 REM 220 REM Attack- och delay-tid (0..15) 230 L0%=4% 240 REM Attack niv} (0..100) 250 L1%=12% 260 REM Sustain niv} (0..100) 270 L8%=1% 280 GOSUB 6000 290 F0%=5% : K1%=0% : K2%=0% : K3%=0% : K4%=0% 300 GOSUB 4000 310 GOSUB 5500 320 GOSUB 2000 : GOSUB 5000 330 REM MAINLOOP 340 IF PEEK(65013%) POKE 65013%,0% : I%=INP(56%) AND 127% ELSE 330 350 D%=I%(I%) : IF D% GOSUB 1000 : GOTO 330 360 I%=INSTR(1%,'0123489?',CHR$(I%)) : IF I%=0% GOTO 330 370 ON I% GOSUB 500,1300,1400,1500,1600,1100,1200,1700 380 GOTO 330 500 REM END 510 ; CUR(22%,0%); 520 END 1000 REM LJUD 1010 X%=X%(D%) : Y%=Y%(D%) : D1%=DOT(X%,Y%) 1020 IF D1% CLRDOT X%,Y% ELSE SETDOT X%,Y% 1030 IF K4%=1% OUT 6%,0% 1040 POKE M1%,L%(D%) : Z%=CALL(M%,D%(D%)) : IF K4%=2% OUT 6%,0% 1050 IF D1% SETDOT X%,Y% ELSE CLRDOT X%,Y% 1060 RETURN 1100 REM BYTA OKTAV 1110 IF F0%>5% F0%=F0%-2% : GOSUB 2500 : GOSUB 5000 1120 RETURN 1200 REM BYTA OKTAV 1210 IF F0%<15% F0%=F0%+2% : GOSUB 2500 : GOSUB 5000 1220 RETURN 1300 REM SUSTAIN 1310 K1%= NOT K1% : GOSUB 2300 : GOSUB 5000 1320 RETURN 1400 REM ATTACK 1410 K2%= NOT K2% : GOSUB 2300 : GOSUB 5000 1420 RETURN 1500 REM DELAY 1510 K3%=K3%+1% : IF K3%>2% K3%=0% 1520 GOSUB 2300 : GOSUB 5000 1530 RETURN 1600 REM KLICK 1610 K4%=K4%+1% : IF K4%>2% K4%=0% 1620 GOSUB 2300 1630 RETURN 1700 REM ? 1710 ; CHR$(12%);' SYNTH ' 1720 ; STRING$(PEEK(590%),61%); 1730 ; CUR(12%,PEEK(590%)/2%-10%)'Ingen hj{lptext'; 1740 GET G$ 1750 GOSUB 2000 : GOSUB 5000 1760 RETURN 2000 REM RITA SK[RMBILD 2010 ; CHR$(12%);' SYNTH ' 2020 ; STRING$(PEEK(590%),61%); 2030 GOSUB 2300 2031 ; : ; 2032 ; ' Spela med mittersta och |versta' 2033 ; ' bosktavsraderna p} tangentbordet.' 2039 GOSUB 2500 2040 RETURN 2300 REM RITA MENY 2310 ; CUR(3%,0%); 2320 ; ' 1 - Str{ng, (oneshot)', : IF K1%=0% ; 'Nej' ELSE ; 'Ja ' 2330 ; ' 2 - Attack, (anslag)', : IF K1% ; ' ' ELSE IF K2% ; 'L}ng' ELSE ; 'Kort' 2340 ; ' 3 - Delay, (avklingning)', : IF K3% ; K3%' ' ELSE ; 'Nej' 2350 ; ' 4 - Klick',, : IF K4%=0% ; 'Nej ' ELSE IF K4%=1% ; 'F|re ' ELSE ; 'Efter' 2360 ; 2370 ; ' 8 - Flytta till h|gre toner' 2380 ; ' 9 - Flytta till l{gre toner' 2390 ; 2400 ; ' 0 - Avsluta' 2410 RETURN 2500 REM RITA KLAVIATUR 2510 RESTORE 2550 2520 FOR I%=18% TO 22% : READ G$ : ; CUR(I%,0%)CHR$(23%)G$; : NEXT I% 2530 ; CUR(21%,37%)CHR$(1%); 2540 RETURN 2550 DATA ' j5 j5 j5 j5 j5 j5 j5 j5 j5 j5 j5 j5 j' 2560 DATA 'Qj5Wj5Ej5Rj5Tj5Yj5Uj5Ij5Oj5Pj5]j5^jRET' 2570 DATA 'jjjjjjjjjjjjj' 2580 DATA 'jAjjSjjDjjFjjGjjHjjJjjKjjLjj\jj[jj"j <-' 2590 DATA 'jjjjjjjjjjjjj' 4000 REM LADDA TONER I F%() 4010 REM 3 MHz CPU-klocka ger 880 Hz p} l{gsta A-tonen 4020 RESTORE 4100 4030 FOR F%=1% TO 42% 4040 READ F : IF F>0 F%(F%)=299.04/F-3.158 ELSE F%(F%)=0% 4050 NEXT F% 4060 RETURN 4070 REM CCDDEFFGGAAH 4100 DATA 1.0000,1.0606,1.1250,1.1859,1.2500,0.0000,1.3333 4110 DATA 1.4142,1.5000,1.5811,1.6667,1.7678,1.8750,0.0000 4120 DATA 2.0000,2.1213,2.2500,2.3717,2.5000,0.0000,2.6667 4130 DATA 2.8284,3.0000,3.1623,3.3333,3.5355,3.7500,0.0000 4140 DATA 4.0000,4.2426,4.5000,4.7434,5.0000,0.0000,5.3333 4150 DATA 5.6569,6.0000,6.3246,6.6667,7.0711,7.5000,0.0000 5000 REM LADDA TONER I D%(),L%() OCH REFERENSER I I%() 5010 L3%=L0%*256%*2%^K3%/4% 5020 FOR A%=1% TO LEN(A$) : A1%=ASC(MID$(A$,A%,1%)) : A2%=A%+A%/2% : A3%=0% 5030 F1%=F0%+A% : D%=F%(F1%) : IF A% AND 1% GOTO 5060 5040 IF F1%>14% F1%=F1%-14% : GOTO 5040 5050 ; CUR(23%,A2%-1%)MID$('cdefgah',F1%/2%+1%,1%); 5060 IF D% GOTO 5090 5070 IF A%>1% ; CUR(18%,A2%-1%)'j'; : ; CUR(19%,A2%-1%)'j'; ELSE ; CUR(18%,A2%)'j'; : ; CUR(19%,A2%)'j'; 5080 GOTO 5130 5090 IF D%<16% OR D%>255% STOP 5100 IF K1% D1%=D%-1% ELSE IF K2%=0% D1%=D%-1%-D%*L8%/100% ELSE D1%=D%-1%-D%*L1%/100% 5110 D2%=D%-D1% 5120 D%(A%)=D1%+SWAP%(D2%) : L%(A%)=L3%/D%+1% : A3%=A% 5130 I%(A1%)=A3% : IF A1%>=64% I%(A1% XOR 32%)=A3% 5140 NEXT A% 5150 REM [NDRA I MASKINKODEN 5160 POKE M4%,128% : POKE M5%,4% : POKE M2%,28%,21% : POKE M3%,20%,29% 5170 IF K1% POKE M4%,0% : RETURN 5180 IF K2%=0% POKE M2%,0%,0% 5190 IF K3%=0% POKE M5%,8% 5200 RETURN 5500 REM LADDA X%(),Y%(),A$ 5510 A$="QaWsEdRfTgYhUjIkOlP|]{^'"+CHR$(13%,8%) 5520 FOR A%=1% TO A9% 5530 X%(A%)=67%-(A% AND 1%)*12% : Y%(A%)=A%*3%-1%+(A% AND 1%) 5540 NEXT A% 5550 RETURN 6000 REM LADDA MASKINKOD 6010 M%=65408% 6020 M1%=M%+4% 6030 M2%=M%+49% 6040 M3%=M%+53% 6050 M4%=M%+46% 6060 M5%=M%+48% 6070 POKE 65408,219%,56%,79%,38%,127%,123%,214%,8%,71%,62% 6080 POKE 65418,0%,56%,7%,40%,5%,43%,62%,0%,16%,251% 6090 POKE 65428,211%,6%,66%,43%,62%,121%,16%,251%,211%,6% 6100 POKE 65438,67%,203%,124%,40%,236%,219%,56%,185%,79%,40% 6110 POKE 65448,4%,254%,128%,48%,12%,230%,128%,40%,4%,0% 6120 POKE 65458,0%,32%,206%,0%,175%,32%,202%,201% 6130 RETURN