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

Action!
Sound(hlas, výška, skreslenie, hlasitosť)
SndRst()
ParameterHodnotyVýznam
hlas0 až 3ktorý zo štyroch hlasov
výška0 až 255väčšie číslo = hlbší tón
skresleniepárne čísla 0 až 1410 je čistý tón; ostatné dávajú šum a bzučanie (výbuchy, motory)
hlasitosť0 až 150 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ónCDEFGAHC
výška121108969181726460

Celý program

Súbor examples/sound.act:

Action!
; 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)
RETURN

Preklad a spustenie

action26 sound.act --run

Čo uvidíš a počuješ

A scale...
A siren...
Two voices together...

Press any key

Najprv 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.

Action!
BYTE clock=20

je 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

Časté chyby

Čo sa staloČo sa stane
číslo hlasu väčšie ako 3program skončí hlásením Err: 100
chýba čakanie za Soundtón sa hneď prepíše ďalším alebo ho ukončí SndRst; nič nepočuť
chýba SndRst na konciposledný tón znie ďalej, aj keď program skončil
hlasitosti všetkých hlasov dokopy viac ako 32zvuk je skreslený

Vyskúšaj si

  1. Zahraj stupnicu odzadu – od vysokého C po hlboké.
  2. Zmeň skreslenie v stupnici z 10 na 8 a potom na 4. Ako znie?
  3. Zahraj jednoduchú melódiu: daj výšky tónov do jedného poľa a ich dĺžky do druhého.

Zhrnutie

Späť: 27. Grafika · Ďalej: 29. Joystick a náhoda