|
Życie Wieczne
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Piotr-246
Gość
|
Wysłany: Sob 20:12, 09 Sty 2021 Temat postu: Dźwięk w Quick Basic-u |
|
|
Dźwięk w Quick Basic-u
W Quick Basic-u mamy instrukcje Sound i Play
-------------------------------------
Najpierw Sound:
SOUND częstotliwość, czas trwania dźwięku
37 to najniższa dopuszczalna częstotliwość.
Czas trwania dźwięku (wyrażony w taktach zegara systemowego) może być dowolnie mały, co nie znaczy, że każdy dźwięk wtedy będzie słyszany:
Instrukcja:
SOUND 37, 0.0228
- powoduje słyszane drgnięcie membrany, bo przy 37 drgnięciach na sekundę membrana nie wykona pełnego drgnięcia w zbyt krótkim czasie.
|
|
Powrót do góry |
|
|
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Piotr-246
Gość
|
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
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Piotr-246
Gość
|
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
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Piotr-246
Gość
|
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.
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Piotr-246
Gość
|
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
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Piotr-246
Gość
|
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
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Piotr-246
Gość
|
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
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Piotr-246
Gość
|
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
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Piotr-246
Gość
|
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
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Piotr-246
Gość
|
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
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Piotr-246
Gość
|
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
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Piotr-246
Gość
|
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
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Piotr-246
Gość
|
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)
|
|
Powrót do góry |
|
|
Zobacz poprzedni temat :: Zobacz następny temat |
Autor |
Wiadomość |
Piotr-246
Gość
|
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.
|
|
Powrót do góry |
|
|
|
|
Możesz pisać nowe tematy Możesz odpowiadać w tematach Nie możesz zmieniać swoich postów Nie możesz usuwać swoich postów Nie możesz głosować w ankietach
|
fora.pl - załóż własne forum dyskusyjne za darmo
Powered by phpBB © 2001, 2005 phpBB Group
|