Vše o MZ-800 - Zvukový generátor

 

Zpět Nahoru Další

 

 

        Obsah této stránky:

bullet

Programovatelný zvukový generátor (PSG)

bullet

Kruhová modulace

bullet

Fázování

Programovatelný zvukový generátor (PSG)
MZ-800 má oproti mnoha jiným počítačům velkou výhodu ve velmi velké a komplexní zásobě povelů v Basicu. Při tom bylo pamatováno i na vnitřní zvukový čip, který muže být v určitých mezích programován bez problémů v Basicu. Na tomto místě budiž řečeno, že v příručce OWNER'S MANUAL je chyba v syntaxi. Na straně 6-83 je pod povelem NOISE napsáno, že je možno použít dvou šumových tónů najednou, jestliže se jednotlivé parametry šumových tónů oddělí čárkou. Vnitřní PSG ale může vytvářet pouze jedno šumění a tak není divu, že se podle návodu k povelu NOISE nedá dosáhnout požadovaného efektu. Je tedy současně možné pouze jedno šumění. Je to tzv. bílý šum (podle SHARP).
Později se budeme blíže zabývat ještě jedním druhem šumu, ale ten nemůže být vyvolán pomocí povelu NOISE.
Vycházíme z toho, že pro uživatele je programování PSG pomocí povelů v Basicu běžné. Nyní se budeme zabývat tím, jak se dá PSG řídit přímo pomocí povelů OUT. To se může provádět jednak z Basicu povelem OUT@, jednak z programu ve strojovém jazyce.

Např.:   LD A,3FH
         OUT (F2H),A

Výstupní port pro PSG je F2H.
Povelem OUT F2H tedy může být zpřístupněn PSG. Aby se ale mohl vytvořit tón, musí se ještě ledacos udělat, protože PSG má přesný předpis, který udává, kde musí být který bit nastaven eventuelně nenastaven, aby mohl hrát určitý tón. Kromě toho je nezbytné vyslat více bytů po sobě (sériově), aby se PSG mohla sdělit frekvence a hlasitost. Tak obsahují první dva byty data o výběru jednoho ze tří tónových generátorů a o frekvenci. Výběr tónového generátoru a frekvence se tedy dělá dvěma byty, které musí být na PSG vyslány sériově. Na první pohled to vypadá velmi komplikovaně, protože frekvence musí být udána v 10 bitech. Protože ale pro 1 byt může být přeneseno pouze 8 bitů, je nutně těchto 10 bitů rozdělit na dva byty. Přitom musí být bity rozděleny následovně:

BYTE 1
Sedmý bit prvního bytu by měl obsahovat 1. Tato "1" ukazuje PSG, že se jedná o první byte. Šestý, pátý a čtvrtý bit udává, který třítónový generátor má být osloven. Třetí, druhý, první a nultý bit udává nižší hodnotu frekvence.

 

BYTE 2
Sedmý a šestý bit se nastaví na 0. 5-tý,4-tý,3-tí,2-hý,1-ní a 0-tý bit obsahují vyšší hodnotu frekvence.

Můžeme si tedy představit 6 bitů z bytu 2 a 4 bity z bytu 1 seřazeny za sebou do řady. Potom by to vypadalo asi takto:

BIT:  5 4 3 2 1 0 3 2 1 0
      =========== =======
         Byte 2    Byte 1

Nyní se ale nabízí otázka, jak mají být bity vypočítány a nastaveny. I toto je jednodušší než by se mohlo zpočátku zdát. Musíme dávat pozor na to, že deset bitů, které představují frekvenci, neudává přímo hodnotu frekvence v Hz. Následující funkce objasňuje desetibitové (F10) číslo, které musí být zvoleno, aby generátor hrál odpovídající frekvenci(FR).                    
 

F10 = 11094/(FR/10)
          
Nakonec musíme číslo frekvence F10 přepočítat do 10 bitů.
Nyní příklad:
Chceme spočítat 10 bitů,které jsou nutné k tomu,aby se vytvořil tón o frekvenci 442 Hz. (442 Hz je přibližně frekvence, kterou uslyšíte zvednete-li telefon a uslyšíte oznamovací tón).
Nejprve dosadíme 442 do rovnice jako FR.

Tedy:
  F 10=11094/(442/10)   dává 250,995
    
Nyní musíme zaokrouhlit na celá čísla.
  F 10=INT(F 10+.5)

Čili dostaneme pro F 10=251

Těchto 251 nyní chceme přepočítat na 4 bitovou a 6 bitovou část. 6-ti bitovou část dostaneme, vydělíme-li číslo F 10 šestnácti (což odpovídá 2^4).

Tedy:
  LSB=F 10/16   dává 15,6875

I teď nás zajímá pouze číslo před desetinou tečkou. Proto jej vypočítáme podle následujícího vzoru:
 

  LSB=INT(LSB)  dává 15

Šesti bitová část je tedy 15 nebo 2^0+2^1+2^2+2^3=1111
Těchto 1111 je ve dvojkové soustavě.

Jestliže chceme nyní spočítat 4 bitovou část, odřízneme desetinou část a výsledek (v našem případě 0,6875) vynásobíme opět 16.

Tedy:
  MSB=FRAC(LSB)x16   dává 11

Čtyřbitová část je tedy 11 nebo 2^0+2^2+2^3=1011
Těchto 1011 je ve dvojkové soustavě.

Nyní jsme spočítali jak 4-bitovou část, tak i 6-ti bitovu část a to:
  LSB(4 bit)=11 (decimálně) nebo 1011 (dvojkově) 
  MSG(6 bitů)=15 (decimálně) nebo 001111 (dvojkově)

Jestliže se vám tento výpočet zdá příliš komplikovaný, můžete použít následující program v Basicu, který si nyní objasníme. Na začátku (po startu pomocí RUN) se program zeptá na frekvenci v Hz, která má být rozložena. Výsledky jsou obsaženy v proměnných B4(4 bitová část) a B6(6-ti bitová část).

  10 CLS 
  15 INPUT"ZADEJTE FREKVENCI V Hz";FR
  20 F0=11094/(FR/10)
  30 B6=INT(F0/16)
  40 B4=(F0+.5)MOD 16
  50 IF FRAC(F0)=>.5F0=INT(F0)+1:ELSE F0=INT(F0)
  55 F0=INT(F0+.5)
  60 PRINT"6-TI BITOVA CAST";B6
  70 PRINT"4 BITOVA CAST";B4
  80 PRINT"F0 :";F0
  90 PRINT:PRINT:GOTO 15

Vypočítejte nyní ručně LSB(4 bitové) a MSG(8 bitové) pro frekvenci f=109 Hz. Potom si přezkoušejte vypočtený výsledek pomocí výše uvedeného programu. Pro 6-ti bitové číslo (MSB) vychází 63, pro 4 bitové číslo (LSB) vychází 10. F0 je 1018.

Nyní můžete frekvence posílat na PSG, ale ještě mu musíte říci, kterým ze tří generátorů má funkci vytvořit. Nato přičteme k LSB(4 bitové číslo) v následujícím seznamu uvedené číslo:

Tónový generátor 1: 128
Tónový generátor 2: 160 Tónový generátor 3: 192

Chceme-li tedy spustit tónový generátor 2,přičteme k B4(LSB) číslo 160. B6(MSB) zde zůstává nezměněn. Nyní to bude vypadat takto:
  B4=B4+160  nebo  B4=11+160    dává 171

Nyní musíme tyto dva byty (B4 a B6) poslat na PSG. K tomu nám poslouží OUT, který můžeme použít i v Basicu např. formou:

  OUT@ 242,B4   242 má stejný význam jako
  OUT@ 242,B6   hexadecimální hodnota F2

Jestliže tedy chceme vytvořit tónovým generátorem druhý tón o frekvenci 442 Hz, jsou zapotřebí dva povely OUT a to:

  OUT@ 242,171
  OUT@ 242,15

Nyní ještě neuslyšíme žádný tón,protože jsme ještě nedefinovali hlasitost. K tomu potřebujeme ještě jeden povel OUT. Povel OUT pro nastavení tlumení si prosím vyberte z následující tabulky. V tabulce jsou uvedeny i tlumící povely pro šumový generátor o kterém budeme mluvit dále. Pro to co nyní popisujeme, nehraje žádnou roli.

Tlumení   Generátor 1   Generátor 2   Generátor 3   Šum

  0           144           176           208       240
  1           145           177           209       241
  2           146           178           210       242
  3           147           179           211       243
  4           148           180           212       244
  5           149           181           213       245
  6           150           182           214       246
  7           151           183           215       247
  8           152           184           216       248
  9           153           185           217       249
 10           154           186           218       250
 11           155           187           219       251
 12           156           188           220       252
 13           157           189           221       253
 14           158           190           222       254
 15           159           191           223       255
 
Když chceme náš tón o frekvenci 442 Hz nechat zaznít v plné hlasitosti, zadáme tlumení 0. To znamená, že má zaznít netlumený tón.

  OUT@ 242,176     176 odpovídá tlumení 0 pro tónový generátor 2

Nyní už musí náš tón zaznít. Samozřejmě můžeme během tónu tlumení měnit.

Uděláme to následujícím programem:

  10 FOR I=176 TO 191
  20 OUT@ 242,I
  30 WAIT 500
  40 NEXT I
  50 FOR I=191 TO 176 STEP-1
  60 OUT@ 242,I
  70 WAIT 500
  90 NEXT I

Tón bude pomalu tišší, a potom znovu hlasitější. Provádí se to takto: na řádce 10 necháváme I běžet od 176 do 191. To jsou  hodnoty tlumení tónového generátoru 2 pro povel OUT ve stoupajícím pořadí. Na řádce 20 potom toto tlumení jde přímo na PSG. Aby se rozdíl v hlasitosti dal lépe vnímat, zpomalujeme program na řádce 30 povelem WAIT 500. Díky tomuto povelu čeká program půl vteřiny, a potom zvyšuje stupeň tlumení skokem na NEXT I na řádce 40. Jestliže byla dosažena nejvyšší hodnota tlumení (tónový generátor vypnut), začne další smyčka stejným způsobem tlumení ubírat. Tomuto tlumení jako funkci času se všeobecně říká obalová křivka. Můžeme ji zvýraznit formou diagramu, ve kterém zakreslíme závislost hlasitosti na čase.

V posledním programu by obalová křivka vypadala následovně:

            ^          :
            |\        /:
            | \      / :
  hlasitost |  \    /  :
            |   \  /   :
            |    \/    :
           -|--------------->  čas

To znamená, že tón bude nejprve tišší a potom hlasitější. Nyní tedy můžeme obalové křivky tónů libovolně měnit. To můžeme sice dělat i v BASICu, ale se syntaxí tohoto jazyka můžeme volit pouze 9 různých obalových křivek. Tyto možné obalové křivky jsou také znázorněné v uživatelské příručce (OWNER'S MANUAL) na straně 6-80. Pomocí povelů OUT můžeme ale vytvořit úplně libovolnou obalovou křivku. Získali jsme tedy značnou výhodu oproti programování se sadou povelů BASICu. Nyní můžeme vytvářet tóny na třech tónových generátorech o navzájem nezávislé frekvenci a hlasitosti. Dále se budeme zabývat tím, jak může být detekován generátor šumu. Nejlepší možnost detekovat šumový generátor je detekovat třetí tónový generátor tou frekvencí, kterou má kmitat šumový generátor. K tomu musíme ale nejprve vypnout hlasitost tónového generátoru 3. To uděláme tak, že zvolíme maximální tlumení (povelem OUT@ 242,223). Nakonec můžeme již popsaným způsobem spočítat odpovídající bity frekvence. Předpokládejme, že jsme B4(LSB) a B6(MSG), tedy 4 a 6 bitová čísla, spočítali. Nyní přičteme 192 (tónový generátor 3) k B4 (4 bit. číslo), a potom vydáme frekvenci v pořadí LSB,MSB. To všechno se provádí podle již popsaného postupu. Nyní musíme PSG sdělit, že má frekvenci inicializovanou v generátoru 3 považovat za šumovou frekvenci. Toho docílíme povelem OUT@ 242,227. Pomocí tohoto povelu se vytvoří synchronní šumění. Dále můžeme pomocí PSG vytvořit i bílý šum, a to tím, že místo OUT@ 242,227 nyní vložíme OUT@ 242,231. Potom může být hlasitost měněna, jak je uvedeno v tabulce hlasitosti pod šuměním. Také zde může být samozřejmě vytvořeno mnoho libovolných obalových křivek. Protože zde můžeme vytvořit synchronní šumění, máme velkou výhodu oproti programování v BASICu povelem NOISE, který může vytvořit pouze bílý šum. Vyplatí se tedy řídit zvukový generátor povely OUT, protože získáváme možnosti, které se pomocí normálních povelů v BASICu nedají realizovat.

[POZN. Tyto možnosti se dají realizovat pomocí příkazu, který v obecném manuálu není uveden. Je to příkaz SOUND=(X,Y). Je tedy nesmysl řídit zvuk příkazy OUT, protože to jde lépe a rychleji pomocí tohoto specifického SOUNDu a není-li to nutné, použijeme příkazů MUSIC a NOISE, protože pracují přes přerušení.]

Zvláštnosti:
Mohou být zásadně hrány pouze tři tóny polifonně (současně). Přitom nemůže být hrán více než jeden šumový tón. Můžeme tedy hrát současně maximálně tři normální tóny nebo dva tóny a jeden šumový tón.

[POZN. Výhodné pro BASIC MZ-700,KU-BASIC,FORTRAN,Assembler apod. Ne pro BASIC MZ-800.] 
 

Kruhová modulace
Kruhová modulace se dá vytvořit tím, že se nechá kmitat např. tónový generátor 1 frekvencí od 200 do 1000 Hz a ve stejnou dobu tónový generátor 2 frekvencí od 1000 do 200 Hz. To tedy znamená, že frekvence (výšky tónů) běží protismyslně, jak je zřejmé z následujícího diagramu:
            
              ^
              |
              |\    - tónový generátor 1
              | \  /
  frekvence   |  \/
              |  /\
              | /  \- tónový generátor 2
              |/     
             -|------------>
                           čas

Fázování
Abychom mohli vysvětlit pojem fázování, museli bychom odbočit velice daleko - na samotnou stavbu kmitu. Vysvětlíme si tedy pouze na příkladu, co znamená fázování. Frekvence, kterou slyšíme, není nic jiného, než kmitání. Jestliže kmitání probíhá asi tak, jak je zobrazeno na následujícím diagramu, jedná se o kmitání sinusové.

        |
        |
  U     |    ..                ..
   1    |   .  .              .  .
     +  |  .    .            .    .
        | .      .          .      . 
      0-|---------.--------.--------.--------------->
        |    t     .      .   t      .      .  čas

     -  |     1     .    .     2      .    .
        |            .  .              .  .
  U     |             ..                ..
   0    |
        |


Na základě této křivky může být ledacos vysvětleno. Rozdíl mezi U1 a U0 odpovídá hlasitosti tónu. Čím vyšší je tedy U1, tím hlasitější je tón. Frekvenci odpovídá čas, který proběhne mezi t1 a t2. Jestliže tyto hodnoty leží dále od sebe, nezmění funkce tak rychle znaménko. Frekvence je potom nižší. Jestliže hodnoty leží blíže u sebe, je frekvence vyšší než v našem příkladě. Všeobecně se dá říci, že zvýšení frekvence vnímáme jako zvýšení tónu. Označíme-li čas mezi t1 a t2 jako "T" a frekvenci jako "t", vychází následující vzorec:
                       
  f=1/T  nebo  T=1/f

Jestliže tedy vytvoříme tón o frekvenci 400 Hz, potom víme, že odstup mezi t1 a t2 je nyní 1/400 Hz, tedy 0.0025 sekund. Abychom nyní vytvořili fázování, můžeme využít vlastnost, která není popsána v žádné uživatelské příručce. Spustíme dva tónové  generátory se stejnou frekvencí. Tzn., že při obou tónech je odstup mezi t1 a t2 stejný. Tónový generátor nechá křivku začínat v přesně stejnou dobu. A tak dostáváme následující diagram.


  ^
  |
  |    .. _             .._
  |   .  . \           . /.\
  |  .  / . \         . /  .\
  | .  /   . \ t1 t4 . /    .\
 -|---------.-\-----.-/------------------>
  |       t3 . \   . / t2           čas
  |           . \ . /
  |            ..\_/
  |            
  |
  |
 
Jak vidíte, je doba, která uběhne mezi tím, než křivka proběhne nulou t1 a t2 tónového generátoru 1 přesně rovna době t3 a t4 tónového generátoru 2. Máme tedy stejnou frekvenci. Fáze (průběhy frekvencí) jsou ale časově posunuty, a to o rozdíl mezi t1 a t3. Tomuto efektu se říká fázování. Protože se tím získá velice zajímavý zvuk, vyplatí se to vyzkoušet. Posluchač totiž vnímá v každé chvíli součet kmitů. Posunutí fází se ale mění také během hraní dvou stejných tónů, takže dochází ke změně součtové křivky a tím také ke změně hlasitosti. Myslitelný by byl také ten případ, že by oba kmity ležely u sebe následovně:

  |
  |      
  |      ..        ..        ..
  |     .  .      .  .      .  .  tónový gen. 2
  |    .    .    .    .    .    .
  |.  .      .  .      .  .      .
  | ..        ..        ..        .
 -|-.---------.----------.--------.------->
  |.  .      .  .      .  .      .
  |    .    .    .    .    .    .
  |     .  .      .  .      .  .  tónový gen. 1
  |      ..        ..        ..
  |
  |
  |


Potom by byl součet obou tónů v každé době roven nule. Neslyšeli bychom tedy žádný tón. To se také skutečně někdy stává. Abychom mohli všechno vyzkoušet a tónový generátor se mohl optimálně detekovat, je jak vidíme nutné velké množství programátorské práce. Proto na tomto místě doporučujeme program, který bravurně řeší všechny možnosti v tvoření hudby. Jmenuje se SYNTHY-800 a je k dostání v každé prodejně BBG. Pomocí programu SYNTHY-800 může uživatel pomocí menu zadávat celé posloupnosti tónů, ve kterých může být kdykoliv volně vložena přes obrazovku jak frekvence, tak hlasitost. Grafická křivka je zobrazena na obrazovce pomocí dialogu s uživatelem. Může být vytvořen libovolný tón a může být uložen na libovolné paměťové médium (kazetu,RAM disk,quick nebo floppy disk). Tóny nebo řady tónů mohou být potom znovu nahrány do paměti a měněny nebo zlepšeny. Mohou být najednou hrány až tři hudební sekvence. Samozřejmě je detekovaný i šumový generátor. I úplní začátečníci jsou s tímto programem schopni vytvářet dobře znějící hudbu. Člověk tedy nemusí být zvláštně muzikální, aby tento program mohl obsluhovat. Může být vytvořeno přes 20 000 různých tónů. Hotové posloupnosti tónů s jedním nebo více tónovými generátory mohou být vkládány do vlastních programů v BASICu i ve strojovém jazyce. Tento program nabízí v oblasti tvoření hudby opravdu něco nového a otvírá bohaté možnosti. Program byl dokončen krátce před vydáním této knihy a může proto být u nás zakoupen.   
Následující dva programy v BASICu vám přináší trochu hudby.

  1 TEMPO 6
  10 FOR JT=1 TO 2
  20 FOR I=1 TO 10
  30 READ A$,B$,C$
  35 MUSIC A$;B$;C$
  40 NEXT I
  50 RESTORE "ENTRY"
  60 NEXT JT
  70 END
  100 DATA O3V15S0M10
  110 DATA O2V13S0M10
  120 DATA O2V11S0M10
  160 REM
  170 DATA R9
  180 DATA D5E3#FA#F1EM4D3E
  190 DATA R9
  220 REM
  230 DATA R9
  240 DATA #F#FEEDR6
  250 DATA R9
  290 LABEL "ENTRY"
  299 REM
  300 DATA M10#F3AA5M20A7
  310 DATA M6#F5M13A7M4+#C0+D2A3
  320 DATA M6D5M20#F6M4R5
  325 REM
  330 DATA M10#F3AA5M20A7
  340 DATA M6D5M20#F7M4R5
  410 DATA M6#F5M13A7M4+#C0+D2A3
  415 REM
  420 DATA M10R3BAABBAA
  430 DATA R3M10B3A5M4B3RAA
  440 DATA V15-D5-D-D-D
  470 REM
  480 DATA #F3ABGM18A7M10
  490 DATA #F3ABGAM10D1E#F5
  500 DATA -D-D-D-DV12
  530 REM
  540 DATA R3#FAA#FAAA
  550 DATA M5R3DM15#F5M10R3#F3AA
  560 DATA M5R3M15#F5M10R3D#F#F
  590 REM
  600 DATA B3B1+#C+D3EA7
  610 DATA R5M20D5D7M10
  620 DATA R5M20-B5-A7M10
  640 REM
  650 DATA R3+DA#FEBBB
  660 DATA M3R2D5M10R0R3M20E7M10
  680 DATA M3R1A5M10R4M20B7M10
  710 REM
  720 DATA +D3A1#FE5M14#F7M10
  730 DATA +D3R5#G0A2+D3+B+A+#F1+E
  740 DATA A3R3R7
  770 REM
  780 DATA R9
  790 DATA O3M10D5E3#F3M4A3M10#F1ED3M4E3
  800 DATA R9
  830 REM
  840 DATA R8+D5
  850 DATA M3#F3#FEEDR3+A5
  860 DATA M4+D3+DAA#FR3+#F5
 

 

  10 TEMPO 5
  20 DIM M$(3,10)
  30 FOR J=1 TO 3
  40 FOR I=1 TO 9
  50 READ M$(J,I)
  60 NEXT I,J
  70 FOR I=1 TO 10
  80 MUSIC M$(1,I);"O2"+M$(2,I);M$(3,I)
  90 NEXT I
  100 DATA O3V15S0M10
  110 DATA +C5B1+C+D+CBA+C3+C1A+C5B1+C
  120 DATA A1GEFG6R1FEDEFGAG6
  130 DATA A1BAGFEDEDC5C1DM6E3FM10
  140 DATA D5M20G9R4M10+D6+C1BAB+C+D+CB4
  150 DATA +C1BA+C1BAF4M5F1FF3A+C1ABD
  160 DATA F3F1FF3AM10B1GAF
  170 DATA D3D1CD6M5D1DD3FM10A1FGED3D1C
  180 DATA D6D1CD3E1FM15G7M10R1FEDC9 190 REM
  200 DATA V10S0M10
  210 DATA E5D1CDCDFE3G1FE5D1C
  220 DATA F1ECDE6R1FEGCDEFE6
  230 DATA F1DECDGBGBG5C1GM6A3GM10
  240 DATA B5M20E9R4M10B6G1GFDEGEG4
  250 DATA E1GFEGFA4M5D1DA3FE1FGG
  260 DATA A3A1AC3FM10G1GFA
  270 DATA G3F1EB6M5D1FG3AM10C1GECB3G1E
  280 DATA B6G1ED3G1FM15E7M10R1DGGG9
  290 REM
  300 DATA O1V1S0M5
  310 DATA C3C1C0CC3C1C0CC3CCE1E0EE3E1E0E
  320 DATA C3C1C0CC3C1C0CC3CCC1C0CC3C1C0CG1G0GG1G0G
  330 DATA C3C1C0CC3CCC1C0CG3G1G0GG1G0G
  340 DATA C3C1C0CC3C1C0CG3GGG1C0CC3C1C0CC3C1C0C3C1C0CC3C1C0CC3C1C0C
  350 DATA G3G1G0GG3G1G0GC3CCC1C0C
  360 DATA C3C1C0CC3CCC1C0C
  370 DATA G3C1E0EE3E1E0GG3GCG1C0CC3C1C0C
  380 DATA G3G1G0GG3G1G0GG3GCG1C0CC3C1C0CC3C1C0CC3C1C0CC1C0C

 

Úvod | Sharp MZ-800 | 8 bit klub Brno | Download | Kniha návštěv | Vyhledání na těchto stránkách | Mapa stránek

 

Tyto stránky byly naposledy aktualizovány dne 08. 02. 2014      Copyright © 05/2006 - SCAV - Pavel Brázda webmaster(c)scav.cz

 

 

Google