[ Pobierz całość w formacie PDF ]
.FMDir:beginif noc FMInstalled then halt;Teraz, po kolei, wypełniamy kolejne rejestry układu odpowiednimi wartościami.Najpierw wpisujemy O do rejestru testowego:FMWriCe($01,0);Teraz decydujemy, że nasz program będzie przełączał układ FM w tryb melodyczny.Ustawiamy też dużą głębokość efektu vibrato:FMWrite($BD,128];Następnie dobieramy mnożniki dla operatorów l i 2 i wybieramy typ obwiedni.Ustawimy też efekt vibrato.Pamiętamy, że dla głosu l (wykorzysta go nasz programik) adresy względne dwóch operatorów wynoszą odpowiednio O i 3.FMWrite[$20,64+32+103;FMWnte[$23,64+32+1);Teraz określamy poziom wyjściowy sygnału na każdym z operatorów:FMWrite($40,1);FMWrit;e($43,1);125PROGRAMOWANIE SYNTEZERA FMPozostaje jeszcze dobrać czasy narastania, opadania i wybrzmiewa-nia dźwięku oraz poziom podtrzymania oraz ustalić kształt generowanej fali, ustawić tryb syntezy FM;FMWnt:e[$60,128-1), FMWnce[$63,128+1):FMWnte($80,128T31:FMWntet$83,128+3), FMWnCet$EQ,a);FMWntet$E3,0);FMWrite($CO,0);No i na koniec wprowadzić do pary AO i BO kod odpowiadający częstotliwości dźwięku, jaki wydać ma nasz program, ustalić oktawę i ustawić bit KEY:FMWrite[$AO,255):FMWrite[$BO,2+16+32];Dalej następuje krótka zwłoka czasowa, zerujemy bit KEY odpowiedniego rejestru i kończymy działanie:delay(500);FMWnte[$BO,1+16) end.Przyszedł czas na nieco bardziej skomplikowany program.Jego zadaniem będzie umożliwienie nam gry na wielogłosowych „cymbałkach".program Cymbałki;usesdos.FMDir;ConsCVarconvert:array[0.,71 of byte=[$10,$n,$12,$13,$14,$15,$16,$01);{tu przechowamy scan-code'y kolejnych klawiszy}{naszej klawiatury}{ Dalej: parametry obwiedni dźwięku naszego }{instrumentu.Każdy może przybrać wartości}{ od O do 63 }Narastanie ^yte^;Opadanie ^yte^B;Poziom :byte=2;Wybrzmewarie:byCe=4;8iaS_handler:pointer; { stary wektor przerwania 9h } ScanCode,Contrcl,counter:byte; { zmienne robocze }ROZDZIAŁ 5keys;arrayt0.6] of byte;{ tutaj będziemy trzymali wartości odpowiadające } { wyłączonym głosom 0,1.2,3,4,5,6 } keyboard:arrayt0.7] of boolean;{klawisze 0.6-nasza „muzyczna" klawiatura, } { klawisz? -kod Esc } pressed:array[O.B] of boolean;{ czy kanał 0.6 )est włączony}{$F+} procedurę MapKeyHandier; incerrupt:{ procedurę, którą zastąpimy oryginalną procedurę } { obsługi 9h i która będzie wypełniać odpowiednimi} {wartościami tablicę keyboard!]} varn:byte;beginScanCode:=por't[$60); { pobranie kodu znaku }CQntrol:=portt$61];port[$61]:=Control or $90:port[3i61]:=Control; { regeneracja sterownika }for n: =0 Co 7 do Beginif ScanCode=convert[n] then keyboardCnL^true;if ScanCode'=converl:En] or $90 then keyboard[n];=fa)se end;port[$20J:=$20{EOI} end;{$F-}procedurę tnstallMapProc:vari: byte;beginset!ntvecC$9,©MapKeyHandier]; { nastaw wektor}for i: =0 to 7 do keyboard[i3:=false{ na początku wszystkie klawisze są zwolnione } end;procedurę UninstaUMapProc;beginseCintvec[$9,aiOS_handler){ przywróć oryginalny wektor} end;procedurę Prepareinstruments:{ przygotowanie brzmienia każdego głosu instrumentu } constPROGRAMOWANIE SYNTEZERA FM \^Jfnumb:arrayt0.6] of word=t385,432,458.514,577,647,686),{ stałe F-NUMBER dla kolejnych głosów } varofs.byte, { zmienna pomocnicza } beginFMWrite[$BD,128);{tryb metodyczny i duża głębokość vibrato } forofs:=$00to$05dobegin{ ustawienie parametrów dla głosów 0-3 )ifofs>2 then FMWrite($20+ofs,64+32+2)else FMWrite[$20+ofs,64+32+1).{vibrato, drugi typ obwiedni i mnożnik=2 }FMWrite[$40+ofs,1);{TotalLevel= 1 }FMWrite[$60+ofs.Narastanie shl4 + Opadanie);{czas trwania fazy narastania dźwięku}{i fazy opadania}FMWriteCSBO+ofs,Paziom shl 4 + Wybrzmiewanie){ poziom stanu ustalonego i czas wybrzmiewania }end;forofs:=$OBto$OOdobegin{ ustawienie parametrów dla głosów 4-B} ifofs>$ODthenFMWrite($20+ofs,64+32+2) else FMWriceC$20+ofs,64+32+15:FMWriteE$40+ofs,1];FMWriteESBO+ofs,Narastanie shl 4 + Opadanie];FMWriteE$80+ofs.Poziom shl 4 + Wybrzmiewanie)end;{ ustawienie parametrów dla głosu 6}FMWrite($20+$10,64+32+1);FMWrice($20+$13,64+32+2);FMWrite($40+$10,1);FMWrite($40+$13,1);FMWrite($60+$10, Narastanie shl 4 + Opadanie);FMWrite($60+$13, Narastanie shl 4 + Opadanie);FMWrice($80+$10.Poziom shl 4 + Wybrzmiewanie);FMWrite($80+$13,Poziom sh! 4 + Wybrzmiewanie];forofs;=0to6dobegin{wyznaczenie młodszej części F-NUMBER } ( dla każdego głosu } FMWnte[$AO+ofs,byte(fnumbEofs] and $FF]];keys[ofs]:=byte([fnumb[ofs]and$3FF]shr8)+1S;{ najstarsze 2 bity F-NUMBER do $BD i 4 oktawa } FMWrice[$90+ofs,keys[ofs])endROZDZIAŁ 5end:ifnotFMinstalled then begio{jeżeli karcą nie jest zainstalowana } writeInCBrak karty SB lub AdLib,'), hale end;geCincvec[$9,BIOS^handler]; { zapamiętanie wektora } FMWrtteE$01,0): { wyzerowanie rejestru testowego } Prepareinstruments; { przygotowanie brzmień } forcounter:=0to G dopressed[counter]:=false;{ wszystkie głosy wyłączone } wnteCTerazgraj używając klawiszy Q,W,E,R,T,Y,U.'];wnteln[' Koniec- Esc.'J;InstallMapProc; { przejęcie obsługi przerwania 9h } repeatfor counter:=0 to 6 do { dla każdego głosu } beginif Ckeyboar'd[counter]]and[nat pressedEcounter]] Chen begin { właśnie został wciśnięty}FMWrite[$BD+countenkeys[counter] or 32);pressed[counter]:=true;end;if [tnot keybaard[cQunter]]and[pressed[counter']]) then begin { właśnie został zwolniony}FMWrite[$BO+counter,keys[counter]);pressed[councer];=false;end:end,unti) keyboard^]; { aż nie zastanie wciśnięty Esc } UninstallMapProc;{ oddanie obsługi orygianiej procedurze } forcounter:=0to6 do FMWr-ite[$BO+counter,keys[counter]) {wyłączenie głosów}end.Korzystając z programu można, używając klawiszy Q, W, E, R, T, Y i U zagrać prostą melodię najprostszym brzmieniem.Program nie jest bardzo skomplikowany, ale osoby chcące zrozumieć zasady programowania układu syntezy FM powinny skupić się szczególnie na analizie procedury Prepareinstruments.PROGRAMOWANIE SYNTEZERA FM129Tym, którzy nie bardzo rozumieją sposób, w jaki zapewniłem możliwość odczytu stanu jednocześnie wciśniętych klawiszy (gra wielogłosowa), należy się słowo wyjaśnienia [ Pobierz całość w formacie PDF ]

  • zanotowane.pl
  • doc.pisz.pl
  • pdf.pisz.pl
  • igraszki.htw.pl