Obsah této stránky: |
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