Forum Życie Wieczne Strona Główna Życie Wieczne

 
 FAQFAQ   SzukajSzukaj   UżytkownicyUżytkownicy   GrupyGrupy   GalerieGalerie   RejestracjaRejestracja 
 ProfilProfil   Zaloguj się, by sprawdzić wiadomościZaloguj się, by sprawdzić wiadomości   ZalogujZaloguj 

Dźwięk w Quick Basic-u
Idź do strony 1, 2  Następny
 
Napisz nowy temat   Odpowiedz do tematu    Forum Życie Wieczne Strona Główna -> Offtopic
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Piotr-246
Gość






PostWysł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ść






PostWysł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ść






PostWysł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ść






PostWysł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ść






PostWysł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ść






PostWysł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ść






PostWysł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ść






PostWysł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ść






PostWysł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ść






PostWysł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ść






PostWysł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 /
Powrót do góry
Zobacz poprzedni temat :: Zobacz następny temat  
Autor Wiadomość
Piotr-246
Gość






PostWysł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ść






PostWysł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ść






PostWysł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ść






PostWysł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
Wyświetl posty z ostatnich:   
Napisz nowy temat   Odpowiedz do tematu    Forum Życie Wieczne Strona Główna -> Offtopic Wszystkie czasy w strefie EET (Europa)
Idź do strony 1, 2  Następny
Strona 1 z 2

 
Skocz do:  
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
Regulamin