Życie Wieczne
FAQ
Szukaj
Użytkownicy
Grupy
Galerie
Rejestracja
Profil
Zaloguj się, by sprawdzić wiadomości
Zaloguj
Forum Życie Wieczne Strona Główna
->
Offtopic
Napisz odpowiedź
Użytkownik
Temat
Treść wiadomości
Emotikony
Więcej Ikon
Kolor:
Domyślny
Ciemnoczerwony
Czerwony
Pomarańćzowy
Brązowy
Żółty
Zielony
Oliwkowy
Błękitny
Niebieski
Ciemnoniebieski
Purpurowy
Fioletowy
Biały
Czarny
Rozmiar:
Minimalny
Mały
Normalny
Duży
Ogromny
Zamknij Tagi
Opcje
HTML:
NIE
BBCode
:
TAK
Uśmieszki:
TAK
Wyłącz BBCode w tym poście
Wyłącz Uśmieszki w tym poście
Kod potwierdzający: *
Wszystkie czasy w strefie EET (Europa)
Skocz do:
Wybierz forum
----------------
Ogólna dyskusja
Kościół rzymsko katolicki
Biblia
Objawienia
Własne przemyślenia
Inne religie i ateizm
Nasza twórczość
Offtopic
Przegląd tematu
Autor
Wiadomość
Piotr-246
Wysłany: Pią 16:13, 15 Sty 2021
Temat postu:
Wracając do wysyłania do ortu dwóch częstotliwości pod rząd w QuickBasicu...
8300 razy na sekundę - tyle par możemy zaprogramować w interperterze.
Przeliczając częstotliwość 8300 na bajty:
cz1 = 1193280 / 8300 = 143,762650602
(lub przy dwukrotności liczby 8300, bo wysyłamy dwie wartości: 1193280 / 16600 = 71,884337349)
starszy bajt = 0
młodszy bajt = 143 (lub 72)
Powyżej tych wartości, czyli poniżej częstotliwości 8300 interpreter QuickBasic ma już jakiś wpływ na to co zrobimy z dźwiękiem.
Większe częstotliwości możemy włączyć, ale nie zniekształcać.
Piotr-246
Wysłany: Pią 13:12, 15 Sty 2021
Temat postu:
O co chodzi z tym zegarem?
OUT &H43, &HB6 ' get timer ready
(dziesiętnie:OUT 67, 182 ' uruchuromienie zagara)
Na razie doczytałem, że może chodzić o pracę z wysokimi częstotliwościami, lub w ogóle, że jest to dokładniejszy zegar niż DOS-owski.
------------------------------------------------------------
QuickBasic potrafi zagrać pilki Wave.
Film na Youtube:
Playing Wave Files with PC Speaker (QBASIC)
Pod filmem kod programu.
Piotr-246
Wysłany: Pią 10:47, 15 Sty 2021
Temat postu:
Po skompilowaniu program wykonuje się przez 2 cyknięcia komórki 1132, czyli 9 razy szybciej niż robi to interpreter.
Trzeba pomyśleć o napisaniu procedury w języku C (opcja CDECL przy deklarowaniu procedury)
Piotr-246
Wysłany: Pią 10:37, 15 Sty 2021
Temat postu:
Wysłanie do portu czterech częstotliwości pod rząd, naprzemiennie, dwóch wysokich, dwóch niskich, powoduje inny efekt, niż gdyby były wysłane tylko dwie.
Wynika to z czasu, w jakim musi być wykonana kolejna pętla FOR. Czas ten ma duży wpływ.
DEF SEG = 0
REM wlaczene zegara
OUT 67, 182
REM odczytanie wartosci portu 97
stary.port = INP(97)
REM ustawienie wartosci "1" dla bitow 1 i 0
nowy.port = (stary.port OR 3)
REM wlaczenie glosnika
OUT 97, nowy.port
REM najpierw mlodszy potem starszy bajt
t0 = PEEK(1132)
FOR i = 1 TO 4500
OUT 66, 0
OUT 66, 1
OUT 66, 64
OUT 66, 2
OUT 66, 0
OUT 66, 1
OUT 66, 64
OUT 66, 2
NEXT i
t1 = PEEK(1132)
REM wylaczenie glosnika
OUT 97, stary.port
PRINT t0; t1, t1 - t0: PRINT : PRINT
Piotr-246
Wysłany: Pią 10:28, 15 Sty 2021
Temat postu:
Programik:
Ustawienie na sztywno wysłania do portu dwóch naprzemiennie wysokiej i niskiej częstotliwości.
Ponieważ dokonuje tego interpreter, wysokość efektu dźwiękowego zależy nawet od układu poleceń.
Inaczej brzmi dźwięk gdy rozkazy OUT są w jednej linii (wolniej), inaczej gdy w osobnych (szybciej).
Znaczenie dla spowolnienia ma także obecność komentarza REM.
Liczby podane szesnastkowo także mogą spowolnić programik.
DEF SEG = 0
REM wlaczene zegara
OUT 67, 182
REM odczytanie wartosci portu 97
stary.port = INP(97)
REM ustawienie wartosci "1" dla bitow 1 i 0
nowy.port = (stary.port OR 3)
REM wlaczenie glosnika
OUT 97, nowy.port
REM najpierw mlodszy potem starszy bajt
t0 = PEEK(1132)
FOR i = 1 TO 8300
OUT 66, 6
OUT 66, 1
OUT 66, 3
OUT 66, 9
NEXT i
t1 = PEEK(1132)
REM wylaczenie glosnika
OUT 97, stary.port
PRINT t0; t1, t1 - t0: PRINT : PRINT
Piotr-246
Wysłany: Czw 21:58, 14 Sty 2021
Temat postu:
Wiedza o portach pochodzi z bazy wiedzy o Quick Basic:
jeffpar . github . io / kbarchive / id / mspl13_basic /
Piotr-246
Wysłany: Czw 21:53, 14 Sty 2021
Temat postu:
Włączenie zegara może mieć znaczenie więc lepiej go włączyć.
Poniższy programik wykonuje szum wysokich częstotliwości na progu słyszalności.
Tylko część wylosowanych częstotliwości będzie słyszana.
Dźwięk trwa około 1 sekundy, czyli około 18 taktów komórki 1132.
Pętla wykonana jest aż 7500 razy
-------------------------------------------------------------------------
DEF SEG = 0
REM wlaczene zegara
OUT 67, 182
REM odczytanie wartosci portu 97
stary.port = INP(97)
REM ustawienie wartosci "1" dla bitow 1 i 0
nowy.port = (stary.port OR 3)
REM wlaczenie glosnika
OUT 97, nowy.port
st.cz = 0
t0 = PEEK(1132)
FOR i = 1 TO 7500
ml.cz = RND(1) * 128
OUT 66, ml.cz ' wyslanie do portu mlodszego bajtu pierwszej czestotliwosci
OUT 66, st.cz ' wyslanie do portu starszego bajtu pierwszej czestotliwosci
NEXT i
t1 = PEEK(1132)
REM wylaczenie glosnika
OUT 97, stary.port
PRINT t0; t1, t1 - t0: PRINT : PRINT
Piotr-246
Wysłany: Czw 21:39, 14 Sty 2021
Temat postu:
Przykład programu generującego szum wysokich częstotliwości
Starszy bajt ustalony na 1 (nie na 0, bo to zbyt wysokie czestotliwosci)
Młodszy losowo od 0 do 64
------------------------------------------------
REM odczytanie wartosci portu 97
stary.port = INP(97)
REM ustawienie wartosci "1" dla bitow 1 i 0
nowy.port = (stary.port OR 3)
REM wlaczenie glosnika
OUT 97, nowy.port
st.cz = 1
FOR i = 1 TO 10000
ml.cz = RND(1) * 64
OUT 66, ml.cz ' wyslanie do portu mlodszego bajtu pierwszej czestotliwosci
OUT 66, st.cz ' wyslanie do portu starszego bajtu pierwszej czestotliwosci
NEXT i
REM wylaczenie glosnika
OUT 97, stary.port
Piotr-246
Wysłany: Czw 21:27, 14 Sty 2021
Temat postu:
Skrócony, ale działający programik.
Widać, że do tego samego portu muszą być wysłane kolejno: młodszy i starszy bajt
Poniższy dźwięk brzmi jakby ćwierkanie ptaka, gdyż użyte są wysokie częstotliwości
Wyższa wartość wysłana do portu-oznacza niższą częstotliwość
-----------------------------------------------
REM odczytanie wartosci portu 97
stary.port = INP(97)
REM ustawienie wartosci "1" dla bitow 1 i 0
nowy.port = (stary.port OR 3)
REM wlaczenie glosnika
OUT 97, nowy.port
st.cz1 = 0
FOR i = 1 TO 256
OUT 66, i ' wyslanie do portu mlodszego bajtu pierwszej czestotliwosci
OUT 66, st.cz1 ' wyslanie do portu starszego bajtu pierwszej czestotliwosci
FOR a = 1 TO 10: NEXT a
NEXT i
REM wylaczenie glosnika
OUT 97, stary.port
Piotr-246
Wysłany: Czw 21:11, 14 Sty 2021
Temat postu:
Jeszcze raz rozpisane:
-------------------------------------------------------
REM Zadana czestotliwosc 700
cz1 = 1193280 / 700
REM Zadana nieslyszalna czestotliwosc 100000
cz2 = 1193280 / 100000
REM obliczenie mlodszych bajtow
ml.cz1 = cz1 MOD 256
ml.cz2 = cz2 MOD 256
REM obliczenie starszych bajtow
st.cz1 = cz1 / 256
st.cz2 = cz2 / 256
REM uruchowanienie zegara?
OUT 67, 182
REM odczytanie wartosci portu 97
stary.port = INP(97)
REM ustawienie wartosci "1" dla bitow 1 i 0
nowy.port = (stary.port OR 3)
REM wlaczenie glosnika
OUT 97, nowy.port
FOR i = 1 TO 3
OUT 66, ml.cz1 ' wyslanie do portu mlodszego bajtu pierwszej czestotliwosci
OUT 66, st.cz1 ' wyslanie do portu starszego bajtu pierwszej czestotliwosci
FOR x = 1 TO 400: NEXT x
OUT 66, ml.cz2 ' wyslanie do portu mlodszego bajtu drugiej czestotliwosci
OUT 66, st.cz2 ' wyslanie do portu mlodszego bajtu drugiej czestotliwosci
FOR x = 1 TO 400: NEXT x
NEXT i
REM wylaczenie glosnika
OUT 97, stary.port
Piotr-246
Wysłany: Czw 21:03, 14 Sty 2021
Temat postu:
Nieco poprawiony programik, wytłumaczony po polsku, a porty podane dziesiętnie:
count1 = 1193280 / 700 ' 700 zadana czestotliwosc
count2 = 1193280 / 100000 ' 100,000 nieslyszalna zadana czestotliwosc
lo.count1 = count1 MOD 256 ' obliczenie mlodszych bajtow
lo.count2 = count2 MOD 256
hi.count1 = count1 / 256 ' obliczenie starszych bajtow
hi.count2 = count2 / 256
OUT 67, 182 ' uruchomienie zegara
old.port = INP(97) ' odczytanie wartosci portu 97
new.port = (old.port OR 3) ' ustawienie wartosci "1" dla bitow 1 i 0
OUT 97, new.port ' wlaczenie glosnika
FOR i = 1 TO 3
OUT 66, lo.count1 ' wyslanie do portu mlodszego bajtu pierwszej czestotliwosci
OUT 66, hi.count1 ' wyslanie do portu starszego bajtu pierwszej czestotliwosci
FOR x = 1 TO 400: NEXT x
OUT 66, lo.count2 ' wyslanie do portu mlodszego bajtu drugiej czestotliwosci
OUT 66, hi.count2 ' wyslanie do portu mlodszego bajtu drugiej czestotliwosci
FOR x = 1 TO 400: NEXT x
NEXT i
OUT 97, old.port ' wylaczenie glosnika
Piotr-246
Wysłany: Czw 20:43, 14 Sty 2021
Temat postu:
Znalazłem w sieci programik umożliwiający generowanie dźwięków bezpośrednio za pomocą portów.
Polecenie "OUT" w Quick Basicu umożliwia przesłanie danych do danego portu
"INP" - odczyt z portu
-----------------------------------------------------------------------------
' The following OUT statements alleviate the clicking sound while
' generating tones:
count1 = 1193280! / 700 ' 700 is the desired frequency
count2 = 1193280! / 100000 ' 100,000 is the desired inaudible frequency
lo.count1 = count1 MOD 256 ' calculate low-order byte values
lo.count2 = count2 MOD 256
hi.count1 = count1 / 256 ' calculate high-order byte values
hi.count2 = count2 / 256
OUT &H43, &HB6 ' get timer ready
old.port = INP(&H61) ' read the value at port 61H
new.port = (old.port OR &H3) ' set bits 0 and 1
OUT &H61, new.port ' turn speaker on
FOR i% = 1 TO 3
OUT &H42, lo.count1 ' load low-order byte for first frequency
OUT &H42, hi.count1 ' load high-order byte for first frequency
SLEEP 1
OUT &H42, lo.count2 ' load low-order byte for second frequency
OUT &H42, hi.count2 ' load high-order byte for second frequency
SLEEP 1
NEXT
OUT &H61, old.port ' turn speaker off
END
Piotr-246
Wysłany: Sob 21:02, 09 Sty 2021
Temat postu:
Instrukcja PLAY gra nuty:
Gama:
PLAY "MB L8 O1 CDEFGAB O2 C"
PLAY ON
Kod MB pozwala na granie podczas wykonywania innych instrukcji.
L8 - długość nuty ustawiona na 8
O1, O2 - numer gamy
Są też możliwe inne parametry.
-----------------
Jak wykorzystać PLAY do efektów dźwiękowych, aby na przykład działały w tle i nie spowalniały gry?
Tutaj przykład takiego efektu:
PLAY "MB L64 MS O3 C O4 C"
PLAY ON
L64 - ustawia grę na najkrótsze nuty, ponadto grane są tylko przez 3/4 czasu - to umożliwia komenda MS.
Piotr-246
Wysłany: Sob 20:44, 09 Sty 2021
Temat postu:
16 kolejnych instrukcji SOUND także daje krótki efekt dźwiękowy:
Celowo unikam pętli FOR, aby nie angażować procesora w użycie zmiennej.
DEF SEG = 0
x0 = PEEK(1132)
SOUND 2000, .0228
SOUND 4000, .0228
SOUND 6000, .0228
SOUND 8000, .0228
SOUND 10000, .0228
SOUND 12000, .0228
SOUND 14000, .0228
SOUND 16000, .0228
SOUND 18000, .0228
SOUND 20000, .0228
SOUND 22000, .0228
SOUND 24000, .0228
SOUND 26000, .0228
SOUND 28000, .0228
SOUND 30000, .0228
SOUND 32000, .0228
x1 = PEEK(1132)
PRINT x0, x1
Piotr-246
Wysłany: Sob 20:39, 09 Sty 2021
Temat postu:
Czas jest 0.0228 najniższy (słyszalny) także dla innych częstotliwości
32767 to najwyższa dopuszczalna częstotliwość
----------------------------------------------------
Dolna granica czas trwania 0.0228 oznacza, że podczas jednego taktu zegara zmieszczą się około 44 różne dźwięki. Teoretycznie, bo instrukcja Sound także potrzebuje czasu procesora na jej rozpoznanie i wykonanie przez interpreter.
Ciąg kilku instrukcji SOUND może dać bardzo krótki efekt dźwiękowy:
DEF SEG = 0
x0 = PEEK(1132)
SOUND 4000, .0228
SOUND 8000, .0228
SOUND 12000, .0228
SOUND 16000, .0228
SOUND 20000, .0228
SOUND 24000, .0228
SOUND 28000, .0228
SOUND 32000, .0228
x1 = PEEK(1132)
PRINT x0, x1
fora.pl
- załóż własne forum dyskusyjne za darmo
Powered by
phpBB
© 2001, 2005 phpBB Group
Regulamin