28. Zvuk: Sound a SndRst
Na čo to je
Atari má zvukový čip so štyrmi hlasmi – môže hrať štyri tóny naraz. Rutina Sound nastaví jeden hlas, SndRst všetky stíši.
Zvuk počuješ len v emulátore (--run), simulátor je ticho.
Ako sa to píše
Sound(hlas, výška, skreslenie, hlasitosť)
SndRst()| Parameter | Hodnoty | Význam |
|---|---|---|
| hlas | 0 až 3 | ktorý zo štyroch hlasov |
| výška | 0 až 255 | väčšie číslo = hlbší tón |
| skreslenie | párne čísla 0 až 14 | 10 je čistý tón; ostatné dávajú šum a bzučanie (výbuchy, motory) |
| hlasitosť | 0 až 15 | 0 je ticho |
Tón znie, kým ho nezmeníš alebo nevypneš. Sound hlas len nastaví a program beží ďalej. Ako dlho tón znie, určuje to, čo program robí potom – preto treba čakanie.
Tóny
| Tón | C | D | E | F | G | A | H | C |
|---|---|---|---|---|---|---|---|---|
| výška | 121 | 108 | 96 | 91 | 81 | 72 | 64 | 60 |
Celý program
Súbor examples/sound.act:
; Sound: a scale and a siren
BYTE clock=20 ; this byte grows by 1 fifty times a second
PROC Wait(BYTE ticks)
clock=0
WHILE clock<ticks
DO
OD
RETURN
PROC Main()
BYTE ARRAY notes=[121 108 96 91 81 72 64 60] ; C D E F G A B C
BYTE i, pitch
PrintE("A scale...")
FOR i=0 TO 7
DO
Sound(0, notes(i), 10, 8) ; voice, pitch, pure tone, volume
Wait(15)
OD
SndRst() ; silence
Wait(25)
PrintE("A siren...")
FOR i=1 TO 3
DO
FOR pitch=40 TO 100 STEP 4
DO
Sound(0, pitch, 10, 10)
Wait(1)
OD
OD
SndRst()
PrintE("Two voices together...")
Sound(0, 121, 10, 8)
Sound(1, 81, 10, 8)
Wait(50)
SndRst()
PutE()
Print("Press any key")
GetD(7)
RETURNPreklad a spustenie
action26 sound.act --runČo uvidíš a počuješ
A scale...
A siren...
Two voices together...
Press any keyNajprv zaznie stupnica ôsmich tónov, potom trikrát klesajúca siréna a nakoniec dva tóny naraz.
Ako to funguje
Čakanie
Sound nečaká, takže dĺžku tónu si program musí odmerať sám. Atari má na adrese 20 počítadlo, ktoré operačný systém zväčší o 1 pri každom obrázku na obrazovke – v Európe 50-krát za sekundu, v USA 60-krát.
BYTE clock=20je premenná na tejto adrese (kapitola 24). Procedúra Wait ju vynuluje a v prázdnej slučke čaká, kým nenarastie na požadovanú hodnotu. Wait(50) je teda asi sekunda, Wait(15) necelá tretina.
Túto procedúru budeš používať stále – v hrách určuje rýchlosť.
Zvyšok
- Stupnica: výšky tónov sú v poli, slučka ich prehrá jeden po druhom, každý 15 tikov.
- Siréna: výška sa mení po malých krokoch a rýchlo – ucho to vníma ako plynulé klesanie. Pripomínam: rastúce číslo je klesajúci tón.
- Dva hlasy: hlas 0 a hlas 1 znejú naraz, lebo každý
Soundnastavuje iný hlas. SndRst()vypne všetky štyri hlasy naraz.
Časté chyby
| Čo sa stalo | Čo sa stane |
|---|---|
| číslo hlasu väčšie ako 3 | program skončí hlásením Err: 100 |
chýba čakanie za Sound | tón sa hneď prepíše ďalším alebo ho ukončí SndRst; nič nepočuť |
chýba SndRst na konci | posledný tón znie ďalej, aj keď program skončil |
| hlasitosti všetkých hlasov dokopy viac ako 32 | zvuk je skreslený |
Vyskúšaj si
- Zahraj stupnicu odzadu – od vysokého C po hlboké.
- Zmeň skreslenie v stupnici z 10 na 8 a potom na 4. Ako znie?
- Zahraj jednoduchú melódiu: daj výšky tónov do jedného poľa a ich dĺžky do druhého.
Zhrnutie
Sound(hlas, výška, skreslenie, hlasitosť)zapne tón na jednom zo štyroch hlasov.- Väčšia výška je hlbší tón; skreslenie 10 je čistý tón.
- Tón znie, kým ho nevypneš – dĺžku určuje čakanie.
SndRst()stíši všetko.- Čakanie sa robí cez počítadlo na adrese 20.
Späť: 27. Grafika · Ďalej: 29. Joystick a náhoda