Радио-86РК/Радио 08-89/Музыкальный редактор/Таблица 1

Материал из Emuverse
Данный материал защищён авторскими правами!

Использование материала заявлено как добросовестное, исключительно для образовательных некоммерческих целей.

Автор: А. СОРОКИН

Источник: http://retro.h1.ru/RK86/Sound/EdtMusTbl1.txt

						ТАБЛИЦА 1
5 REM  ********************************************* 
10 REM **** МУЗЫКАЛЬНЫЙ РЕДАКТОР ДЛЯ РАДИО-86РК **** 
20 REM ******** НА ОСНОВЕ ТАЙМЕРА К580ИВ53 ********* 
30 REM * ПРИСВОЕНИЕ ЗНАЧЕНИЙ ПЕРЕМЕННЫМ 
40 REM * BS - НАЧАЛЬНЫЙ АДРЕС РАСПОЛОЖЕНИЯ НОТ В ОЗУ 
50 REM * А0,A1,А2,A3 -АДРЕСА ПОРТОВ ТАЙМЕРА К580ИВ53 
60 A0=&A000:A1=&A001:A2=&A002:A3=&A003:BS=&4200 
70 V=30:R$="<-":Z°="  ":GOTO 640 
80 REM * ПОДПРОГРАММА ВВОДА НОВОЙ КОМАНДЫ 
90 В=А
100 A=USR(-2021):IF А=В OR А=255 THEN 100 
110 RETURN
120 REM * ИНИЦИАЛИЗАЦИЯ РЕДАКТОРА 
130 PRINTAT36,17;"NEW ?";:Y$=CHR$(USR(-2045)) 
140 PRINTAT36,17;SPC(12):IF YD="Y" THEN 200 
150 REM * ПОИСК КОНЦА НОТНОЙ ЗАПИСИ 
160 B1=BS+&2000:FOR 1=BS TO B1 
170 IP PEEK(I)=255 THEN KX=I-BS:GOTO 410 
180 NEXTI:CUR36,17:INPUT"ДЛИHA";X:X=X*4 
190 PRINTAT36,17;SPC(20)$:POKEBS+X+1,255:GOTO 410 
200 X=0:Y=11:PRINTATV,11;R$;:KX=0 
210 PRINTAT36,24;"HOTA - 1" 
220 REM * ЦИКЛ ВВОДА И ЗАПИСИ НОТ
240 A=USR(-2021):IF А=255 THEN 240 
250 IF (Y=24 AND A=25) OR (Y=0 AND A=26) THEN 240 
260 IF A=8 THEN 1100 
270 IF A=0 THEN KX=X:A=2 
280 IF A=24 THEN 1150
290 IF A>57 OR A=1 OR A=46 THEN GOSUB 1060 
300 IF A=25 THEN PRINTATV,Y;Z$;:Y=Y+1:PRINTATV,Y;R$; 
310 IF A=26 THEN PRINTATV,Y;Z$;:Y=Y-1:PRINTATV,Y;R$; 
320 IF A=2 THEN PRINTATV,Y;Z$;:POKEBS+X,255:GOTO 410 
330 IF A<>27 THEN TS=S(Y):TM=M(Y) 
340 IF A=27 THEN TS=S(Y):TM=DM(Y):GOSUB 90 
350 IF A=32 THEN GOSUB 1280 
360 POKE A0,TM:POKE A0,TS:POKE А2,20 
370 IF A>48 AND A<58 THEN GOSUB 1330 
380 GOTO 240
400 REM * ВВОД ПАРАМЕТРОВ ВОСПРОИЗВЕДЕНИЯ 
410 CUR36,22:INPUT"TEMП",Z:R=28/Z:X1=KX-4 
420 PRINTAT36,20;"STAC. NORM. LEG.": K$=CHR$(USR(-2045))
430 PRINTAT36,22;SPC(20):PRINTAT36,20;SPC(20) 
440 PPINTAT36,17;"TEMП - ";Z;" ";K$".":PRINTAT36,24; "НОТА -"
450 K=0.0015:IF K$="S" THEN K=R*0.5 
460 IF K$="N" THEN K=R*0.1 
470 REM * ЦИКЛ ВОСПРОИЗВЕДЕНИЯ
490 FOR X=0 TO X1 STEP4:K2=PEEK(BS+X+1): Y=PEEK(BS+X+3)
500 IF K2=0 THEN POKE A3,54 
510 IF K2<>0 THEN POKE A0,PEEK(BS+X):POKE A0,K2: POKE A2,100:PRINTATV,Y;R$; 
520 PRINTAT 42,24;X/4+1:PAUSE R*PEEK(BS+X+2): POKE A3,54:PAUSE К 
530 PRINTAT V,Y;Z$;:NEXTX
550 REW * ВЫВОД ДИРЕКТИВ РЕДАКТОРА 
560 PRINTAT36,24;"1 - ПОВTOPИTb":PRINTTAB(36) "2 - ДОПИСАТЬ"
570 PRINTTAB(36)"3 - ИCПPABИTb":PRINTTAB(36) "4 - РАСПЕЧАТАТЬ"
580 PRINTTAB(36)"5 - ОТТРАНСЛИРОВАТЬ": PRINTTAB(36)"6 - NEW"
590 A=USR(-2045):FORI=0TO5:PRINTAT36,24-1;SPC(20); NEXTI
600 IF PA<49 OR A>54 THEN 1810 
610 REM * АДРЕСАЦИЯ ПО ДИРЕКТИВАМ 
620 A=A-8:ON A GOTO 410, 1380, 1410, 1470, 1530, 200 
630 REM * НАСТРОЙКА ПАРАМЕТРОВ ТАЙМЕРА К580ИВ53 
640 НОМЕ:РОКЕ АЗ,54:РОКЕ АЗ,102:РОКЕ A3,144: POKE A1,110 
650 REM * ОПИСАНИЕ ФУНКЦИЙ РАЗБИЕНИЯ ДЕСЯТИЧНОГО ЧИСЛА НА БАЙТЫ
660 REM * FNS(X) - СТАРШИЙ БАЙТ,FNM(X) - МЛАДШИЙ БАЙТ 
670 DEFFNS(X)=INT(X/256) 
680 DEFFNM(X)=X-INT(X/256)*256 
690 REM * ОПИСАНИЕ МАССИВОВ
700 REM * SO,WO - МАССИВЫ КОЭФФИЦИЕНТОВ ДЕЛЕНИЯ ДЛЯ ТОНОВ
710 REM * DM0,DSO - МАССИВЫ КОЭФФИЦ. ДЕЛЕНИЯ ДЛЯ ПОЛУТОНОВ
720 DIM S(24),M(24),DM(25),DS(25),K(24) 
730 REM * РИСУНОК НОТНОГО СТАНА 
740 PRINT"СОЛЬ #";SPC(21);"-0" 
750 PRINT"ФA   #";SPC(21);"-0" 
760 РRINТ"МИ";5РС(24);"-0-" 
770 PRINT"PE   #";SPC(19);"-0-" 
780 РRINТ"ДО   #";SPC(18);"-0---" 
790 PRINT"CИ";SPC(21);"-0----" 
800 PRINT"ЛЯ";SPC(16);"-0-----" 
810 PRINT"COЛЬ #"SPC(16);"0" 
820 PRINT"ФA   #----------0---- " 
830 PRINT"MИ";SPC(18);"0";SPC(15);"CИ$ = ЛЯ#" 
840 PRINT"PE   #-------0-----";SPC (7) ; "ЛЯ$ = СОЛЬ#"
850 PRINT"ДO   #";SPC(12);"0";SPC(17);"COЛЬ$ = ФА#" 
860 PRINT"CИ   -------0-------";SPC(7); "МИ$ = РЕ#"
870 РРINТ"ЛЯ   #";SPC(10);"0";SPC(19);"PE$ = ЛЯ#" 
880 PRINT"COЛЬ #------0----------";SPC(7); "ДО$ = СИ"
890 PRINT"ФA   #";SPC(8);"0";SPC(21);"$ - БЕМОЛЬ, # - ДИЕЗ"
900 PRINT"MИ   ----О---------" 
910 PRINT"PE   #";SPC(6);"0";SPC(23); "<-- НА 1 НОТУ НАЗАД" 
920 PRINT"ДO   #-------0-";SPC(23); "--> HA 1 НОТУ ВПЕРЕД" 
930 PRINT"CИ   --о-"
940 РРINТ"ЛЯ   #------0-";SРС(25);"ДИЕЗ - АР2" 
950 PRINT"COЛЬ #--0-";SPC(26);"BЫXOД - F3" 
960 PRINT"ФA   #-0-";SРС(27);"УСТАНОВКА КОНЦА НОТНОЙ" 
970 РРINТ"МИ   -0-";SРС(28);"ЗАПИСИ - F1" 
980 PRINT"PE   #O-";
990 REM * ЗАПОЛНЕНИЕ МАССИВОВ КОЭФИЦИЕНТАМИ ДЕЛЕНИЯ 
1000 FORI=0T024:READH:S(I)=FNS(H):M(I)=FNM(H):NEXTI 
1010 FORI=1T018:READH,J:DS(J)=FNS(H):DM(J)=FNM(H): NEXTI
1020 REM * ЗАПОЛНЕНИЕ МАССИВА КОДАМИ КЛАВИШ СООТВЕТСТВ. НОТАМ
1030 FORI=0T024:READH:K(I)=H:PRINTAT33,I;CHR$(H); : NEXTI
1040 GOTO 130
1050 REM * ПОДПРОГРАММА ВЫБОРА ПОЛОШЕНИЯ УКАЗАТЕЛЯ ПО КЛАВИШАМ 
1060 FORI=0T024
1070 IFA=K(I)THEN PRINTATV,Y;Z$;:Y=1:PRINTATV,Y;R$; : RETURN
1080 NEXTI:RETURN 
1090 REM * ПОДПРОГРАММА ВОЗВРАТА К ПРЕДЫДУЩЕЙ НОТЕ
1100 IF X=0 THEN 240 
1110 IF KX=0 THEN KX=X
1120 X=X-4:PRINTATV,Y;Z$;: K1=PEEK(BS+X) :K2==PEEK(BS+1+X)
1130 IF K1=0 AND K2=0 THEN 1220 
1140 GOTO 1240
1150 REM ПОДПРОГРАММА ПЕРЕХОДА К СЛЕДУЮЩЕЙ НОТЕ 
1160 IF КХ=0 OR Х=КХ THEN 240
1170 IF KX=X+4 THEN X=X+4:PRINTAT42,24;X/4+1:GOTO 240 
1180 X=X+4:PRINTATV,Y;Z$;: K1=PEEK(BS+X) :K2=PEEK(BS+1+X)
1190 IF K1=0 AND K2=0 THEN 1220 
1200 GOTO 1240
1210 REM * ПОДПРОГРАММА ОТОБРАЖЕНИЯ ПАУЗЫ 
1220 PRINTAT36,22;"ПАУ3A":PRINTAT42,24;X/4+1:GOTO 240 
1230 REM * ПООДПРОГРАММА ОТОБРАЖЕНИЯ НОТЫ 
1240 POKE A0,K1:POKE A0,K2 
1250 POKE A2,PEEK(BS+2+X)+20:Y=PEEK(BS+3+X): PRINTATV,Y;R$;
1260 PRINTAT42,24;X/4+1:PRINTAT36,22;"     ":GOTO 240 
1270 REM * ПОДПРОГРАММА ЗАПИСИ ПАУЗЫ 
1280 POKEBS+X+1,0:POKEBS+X,0:POKEBS+X+3,1: PRINTATV,Y;Z$;
1290 GOSUB 90:POKE BS+X+2,A-48:POKE BS+X+3,Y:X=X+4: PRINTAT42,24;X/4+1 
1300 IF KX<XTHEN KX=X 
1310 PAUSE0.3:GOTO 240 
1320 REM * ПОДПРОГРАММА ЗАПИСИ НОТЫ 
1330 POKEBS+X,TM:POKEBS+X+1,TS:POKEBS+X+2,A-48
1340 POKEBS+X+3,Y:X=X+4:PRINTAT42,24;X=/4+1: PRINTAT36,22;"   " 
1350 IF KX<XTHEN KX=X 
1360 PAUSE0.3:RETURN
1370 REM * НАСТРОЙКА НА ДОПИСЫВАНИЕ НОТНОЙ ЗАПИСИ 
1380 Y=PEEK(BS+X-1):PRINTATV,Y;R$;:KX=0 
1390 PRINTAT36,24;"HOTA-":PRINTAT42,24;X/4+1: GOTO 240
1400 REM * ИСПРАВЛЕНИЕ НОТНОЙ ЗАПИСИ 
1410 PRINTAT36,24;"C НОТЫ (BCEГО";KX/4;")";:INPUT N 
1420 IF N>KX THEN 1410 
1430 X=(N-1)*4:POKE A0,PEEK(BS+X): POKE A0,PEEK(BS+X+1)
1440 POKE A2,20:Y=PEEK(BS+X+3):PRINTATV,Y;R$; 
1450 PRINTAT36,24;"HOTA -";SPC(15):PRINTAT42,24;N: GOTO 240 
1460 REM * ПЕЧАТЬ НОТНОЙ ЗАПИСИ ДЛЯ DATA 
1470 HOME:PRINT"PACПEЧATKA НОТНОЙ ЗАПИСИ ДЛЯ DATA " 
1480 PRINT"MЛ. БАЙТ";SРС(5);**СТ. БАЙТ";SРС(5); "ДЛИТЕЛЬН."              " 
1490 KX=KX-4:FOR X=0 TO KX STEP 4 
1500 PRINTPEEK(BS+X),PEEK(BS+X+1),PEEK(BS+X+2) 
1510 NEXT X
1515 STOP                                        
1520 REM * ТРАНСЛЯЦИЯ НОТНОЙ ЗАПИСИ 
1530 HOME
1540 РRINT"СВОБОЛНАЯ ОБЛАСТЬ-С";@(КХ+4+ВS); "Н ПО 75FFH"
1550 INPUT"HAЧAЛЬHЫй АДРЕС ДЛЯ ТРАНСЛЯЦИИ (ЧЕРЕЗ &)";NA
1560 REM * ЗАПИСЬ УПРАВЛЯЮЩЕЙ ПРОГРАММЫ В ПАМЯТЬ И 
1570 REM * ЕЕ КОРРЕКТИРОВКА ПО АДРЕСАМ ПЕРЕХОДА 
1580 RESTORE 1940: FOR I=NA TO NA+65:READ R:POKE 1,R: NEXTI
1590 KA=1:TT=INT(600/2):POKE NA+36,TT 
1600 M1=FNS(65536+A0):M2=FNM(65536+A0):POKE NA+8,M2 
1610 POKE NA+9,M1:POKE NA+17,M2:POKE NA+18,M1 
1620 POKE NA+22,FNM(A2*65536): POKE NA+23,FNS(A2+65536) 
1630 POKE NA+30,FNM(A3+65536): POKE NA+31,FNS(A3*65536) 
1640 POKE NA+52,FNM(A3+65536): POKE NA+53,FNS(A3+65536) 
1650 POKE NA+1,FNM(KA):POKE NA+2,FNS(KA) 
1660 IF K$="S" THEN POKE NA+56,TT*.8 
1670 IF K$="L" THEN POKE NA+51,0:POKE NA+52,0: POKE NA+53,0
1680 IF K$="N" THEN POKE NA+56,TT*.6 
1690 POKE NA+14,FNM(NA+27):POKENA+15,FNS(NA+27)
1700 POKE NA+25,FNM(NA+32):POKE NA+26,FNS(NA+32) 
1710 POKE NA+47,FNM(NA+43):POKENA+48,FNS(NA+43) 
1720 POKE NA+61,FNM(NA+57):POKE NA+62,FNS(NA+57)
1750 POKE NA+64,FNM(NA+3):POKE NA+65,FNS(NA+3) 
1740 REM ТРАНСЛЯЦИЙ САМОЙ НОТНОЙ ЗАПИСИ 
1750 FOR X=0 TO KX STEP 4
1760 POKEKA,PEEK(BS+X):KA=KA+1:POKE KA,PEEK(BS+X+1) 
1770 KA=KA+1:POKE KA,PEEK(BS+X+2):KA=KA+1:NEXTX: POKE KA,255
1780 РРINТ:РRINТ"МУЗЫКАЛЬНЫй МОДУЛЬ РАСПОЛОЖЕН :" 
1790 PRINT"HAЧДЛЬHЫй AAPEC";@NA: РRINТ"КОНЕЧНЫй АДРЕС";@КА 
1800 Y=USR(&F86C)
1810 НОМЕ:РRINТ"НЕТРАНСЛИРОВАННAЯ НОТНАЯ ЗАПИСЬ НАХОДИТСЯ :"
1820 PRINT"C АДРЕСА ";@BS 
1830 PRINT"ПO АДРЕС ";@(BS+KX+4) 
1840 U=USR(&F86C)
1850 REM ******************************************* 
1860 DATA12108,10787,10181,9070,8081,7199,6795,6054 
1870 DATA 5393,5091,4535,4040,3600,3398,3027,2697 
1880 DATA 2545,2268,2020,1800,1699,1513,1348,1273 
1890 DATA 1134,11428,0,9610,2,8561,3,7627,4,6670,6 
1900 DATA 5714,7,4805,9,4281,10,3814,11,3207,13,2857 
1910 DATA 14,2402,16,2140,17,1907,18,1603,20,1428,21 
1920 DATA 1201,23,1070,24,74,67,85,75,69,78,71,91,93 
1930 DATA 90,72,58,1,70,89,87,65,80,82,79,76,68,86,92,46
1940 DATA &21,0,0,&7E,&FE,&FF,&C8,&32,0,0,&23 
1950 DATA &7E,&B7,&CA,0,0,&32,0,0,&3E,&C8,&32,0,0 
1960 DATA &C3,0,0,&3E,&36,&32,0,0,&23,&7E,&23,&C6 
1970 DATA 0,&87,&87,&87,&87,&57,&5F,&1B,&7A,&B3,&C2 
1980 DATA 0,0,&3Е, &36,&32,0,0,&01,2,О,&0В,&79,&В0 
1990 DATA &С2,0,0,&СЗ,0,0 
2000 REM ********************************************