Symfonie na jednom bitu

Kdo by neznal jednobitovou muziku! Tedy vlastně, hm, všichni Ataristi a Commodoristi, jejichž počítače měly mnohakanálové zvukové generátory. To my na Spectru jsme si museli vystačit s jedním drátem, kde byla buď 0, nebo 1, a podle toho, jak rychle se s ním (programově) vrklalo, tak takový zvuk to dělalo…

Tak samozřejmě nebyla to žádná extra sláva, ale šlo to, a když se tomu trošku dalo, tak byly výsledky opravdu zajímavé. Jak se tomu dalo dát?

Trocha teorie na úvod… Jo, je to nezbytné!

Zvuk je, jak známo, vlnění, přenášené vzduchem nebo jiným médiem. Jako základní typ vlnění se bere sinusoida.

Tón je základní stavební jednotkou hudby. Jeho nejdůležitějším parametrem je frekvence, udávaná v hertzech, neboli „počet cyklů za sekundu“.

Komorní A je tón, který má většinou frekvenci 440 Hz. (Proč většinou? Protože jsou ladění, které mají komorní A někde jinde, např. na 442 Hz, Händel používal třeba i 409 Hz, La Scala v 18. století zase měla komorní A na frekvenci 451 Hz…)

Oktáva je podle klasických hudebních teoretiků interval osmi tónů. Podle Franty Fuky to je 12 půltónů a vřele doporučuju si jeho článek přečíst. Pokud to z jakéhokoli důvodu neuděláte, tak aspoň vězte, že „o oktávu vyšší tón“ má dvojnásobnou frekvenci v Hz. Pokud má komorní A frekvenci 440 Hz, tak o oktávu vyšší A bude mít 880 Hz. Vzhledem k tomu, že frekvence vibrace je nepřímo úměrná délce vibrujícího předmětu, tak by mohlo platit, že struna délky L vydává nějaký tón a struna délky L/2 vydává tón o oktávu vyšší. Máte-li kytaru, račte si přeměřit vzdálenosti od pražce ke kobylce a ověřit, jestli pražec v poloviční vzdálenosti vyvolá o oktávu vyšší tón.

Samplování je postup, při kterém ze spojitého průběhu, třeba té sinusovky, uděláme nespojitý. Děje se to tak, že v pravidelných intervalech bereme vzorek (sample) aktuální hodnoty jako číslo a ukládáme si ho. Pokud pak ve stejných intervalech nastavíme výstup na tuto hodnotu, dostaneme průběh, který s určitou mírou tolerance odpovídá původnímu.

Samplovací frekvence je frekvence, s jakou vzorkujeme. Pro nás u jednobitové muziky to bude frekvence, s jakou jsme schopni změnit hodnotu na výstupu. Z čehož vyplývá, že pokud budeme s touto rychlostí měnit jedničky a nuly, dostaneme obdélníkový průběh o poloviční frekvenci – a to bude zároveň maximální dosažitelná frekvence hraní. (Čímž jsme si, mimo jiné, hezky odvodili Shannonův, též Nyquistův, teorém).

Sinusoida je základní zvukový průběh. Naštěstí žádný nástroj nemá zvuk, který by byl přesně sinusový, což je dobře, protože sinusoida je velmi plochý, tupý a bezbarvý zvuk.

Amplituda je pro nás totéž co hlasitost.Čím větší jsou výchylky vln od neutrální hodnoty, tím hlasitější zvuk vnímáme. Ucho vnímá jen absolutní odchylku, nerozlišuje, jakým je (ta odchylka) směrem, jestli kladným, nebo záporným (v případě přenosu zvuku vzduchem: nerozlišuje, jestli přišlo zředění nebo zhuštění, vnímá jen rozdíl oproti normálu).

Barva zvuku je dána v reálném světě stavbou nástroje, materiálem, ozvučnicí – každý z těchto faktorů přidá k základnímu tónu nějakou další složku, jiné chvění s jinou intenzitou, čímž dodá zvuku charakteristické zabarvení. U složitých hudebních nástrojů rezonují různé součástky na různých frekvencích a kombinace těchto rezonančních efektů je unikátní a pro daný nástroj charakteristická. Jednoduché nástroje mají jednoduchý zvuk – například nejrůznější píšťaly. Složité nástroje, třeba takové, kde vzniká tón například drnkáním, mají zvuk složený z nejrůznějších frekvencí, které v čase mění svou amplitudu…

Pila (sawtooth) je průběh zvuku, který vypadá – inu, jako pila. Je zvláštní, že pilu můžeme snadno sestrojit ze sinusovek – vezmeme tu základní, třeba 440, k ní přidáme dvakrát rychlejší (880) s poloviční amplitudou, k tomu třikrát rychlejší (1320) s třetinovou amplitudou… A když to uděláme donekonečna, dostaneme pilový průběh.

Harmonická frekvence je taková, jejíž velikost je nějakým celočíselným násobkem základní frekvence. První harmonická je rovna základní frekvenci, druhá harmonická dvojnásobné, třetí trojnásobné… Předchozí definici pily bychom mohli zjednodušit tak, že to je součet všech harmonických (první, druhé, třetí, …) s lineárně klesající amplitudou. Viz též ladění.

Trojúhelník je další oblíbený průběh, který uvádím vlastně jen tak do počtu. Stejně jako pilu lze zkonstruovat i trojúhelník součtem harmonických – tentokrát lichých harmonických (1., 3., 5., …) s exponenciálně klesající hlasitostí.

Obdélník je poslední ze svaté čtveřice základních průběhů. Namísto plynulého klesání nebo stoupání má pouze dvě hodnoty – maximum a minimum. Konstruuje se stejně jako trojúhelník, tedy součtem lichých harmonických, ale hlasitost tentokrát neklesá exponeniálně, tedy s druhou mocninou, ale lineárně.

Šum je náhodný průběh.

557px-Waveforms.svg
Zdroj: http://en.wikipedia.org/wiki/File:Waveforms.svg

To rozkládání základních periodických funkcí na součty sinusovek je samo o sobě velmi zajímavá část matematiky, a pokud by vás to zajímalo víc, tak klíčová slova jsou Fourierova transformace a Fourierovy řady.

Zdroj: http://cs.wikibooks.org/wiki/Soubor:Synthesis_square.gif

Obdélník vládne všem

Jednobitová hudba je generována, jak buď ze zkušenosti víte nebo si domyslíte, páč jste bystří, tím, že měníme hodnotu jediného bitu – buď je 0, nebo 1. Výsledkem je tedy, když se zamyslíme, obdélníkový průběh. On nakonec nebude úplně přesně obdélníkový, protože na cestě od procesoru k zesilovači jsou ještě různé obvody, které ten obdélník trošičku zdeformují, ale to není teď pro nás podstatné. Podstatné je, že můžeme zapomenout na sinusoidy a trojúhelníky, protože vygenerujeme vždy a pouze obdélník.

Když chceme zahrát třeba tón o frekvenci 1000 Hz, bude to znamenat, že tisíckrát za sekundu (=každou milisekundu) musí proběhnout oba cykly, tedy 1 a 0. Nejjednodušší tedy bude, když necháme půl milisekundy logickou 1, další půl milisekundy logickou 0, dohromady to dá jednu milisekundu, a když to budeme opakovat, dostaneme tisícihertzový obdélník jako víno!

Když je polovinu doby 1 a polovinu 0, říkáme tomu, že signál má střídu 1:1 (též 50%). Stejnou dobu je zapnuto, jako vypnuto. Spectrum 48 nám takový signál vygeneruje na požádání – ano, je to to, co zahraje BEEP.

Co když ale zmenšíme dobu, po kterou máme tu logickou 1, o polovinu? Výsledek bude tedy mít střídu 1:3 (25%, tj. čtvrtinu doby 1, tři čtvrtiny 0) a zvuk bude znít jinak, bude ostřejší – i když ho stále budeme vnímat jako „stejně vysoký“. S šířkou střídy pracuje například hradlo Jonathana Smitha, použité v Ping Pongu.

Zvláštní, takovou bzučivou, hudbu měl třeba Heartland nebo hry od Special FX (Firefly). BTW, tu rutinu pro Special FX napsal opět Jonathan Smith (před několika lety zemřel) a použitá byla i v známém editoru Orfeus. Má střídu 1:N – tedy pouze na začátku cyklu na malou chvíli zapneme log. 1 a pak je logická 0 až do konce požadované doby. (Ta malá chvíle je dána samplovací frekvencí, tedy rychlostí, s jakou jsme schopni v naší rutině přepínat 1 a 0.)

Dělíme frekvence

Jak tedy budeme hrát jednotlivé tóny? Když chci zahrát 440 Hz, co to přesně znamená?

Tak dejme tomu, že máme Spectrum 48, jehož základní taktovací frekvencí je 3,5 MHz. Tedy tři a půl milionu hertzů. Známé T – doba jednoho cyklu hodin – je tedy 0,285714 mikrosekundy.

Frekvence tónu f je 440. Za jednu sekundu proběhne tedy 440 cyklů, to znamená, že na jeden cyklus vyjde… 3500000/f = 7954,545454 cyklů T.

A protože jste programátoři assembleroví, tak si tu nebudeme vysvětlovat, jak se počítá, kolik která instrukce zabere T, stačí vědět, že když každých zhruba 3977 T změníme výstup z log. 0 na log. 1 (resp. obráceně), bude nám Spectrum hrát krásné obdélníkové komorní A.

Jenže my nemůžeme měnit výstup s frekvencí hodinového signálu – nejrychlejší instrukce má 4 takty, navíc my potřebujeme OUT, a ten má aspoň 11 taktů, k tomu nějaké počítání… No, dejme tomu, že jeden průběh smyčkou našeho hracího programu, tedy tou částí, kde se rozhodne, jestli teď 0 nebo 1, zabere třeba 120 T. Prostým podělením 3500000/120 zjistíme, že tahle smyčka proběhne zhruba 29166x za sekundu, což nám dává samplovací frekvenci cca 29kHz. Když budeme pravidelně střídat 1 a 0, vygenerujeme tón o frekvenci 14,5kHz – to je docela vysoké pištění. Ultrazvuk to není, ale je to hodně vysoké a člověk by to měl slyšet (horní hranice slyšitelné frekvence je okolo 20 kHz, v mládí víc, k stáru se zhoršuje).

Hrací smyčka funguje v zásadě – a hrubě zjednodušeně – tak, že počítá průběhy, tj. kolikrát proběhla. Když je dosaženo hodnoty D (dělitel), jede se zase od nuly, protože to znamená nový průběh. Během té doby je tedy potřeba změnit výstup podle požadovaného průběhu. Příklad: pro „heartlandovský“ průběh 1:N bude na výstupu log. 1 pouze když je počítadlo rovno 0, pak bude na výstupu log. 0. Logická jednička bude na výstupu tedy po dobu jednoho průběhu, 120T.

Kolik je tedy dělitel? Je to v zásadě převrácená hodnota frekvence (1/f) a vzorec je: D = M / f / Tcyc. M je frekvence hodin (3500000), f je požadovaná frekvence tónu, Tcyc je trvání smyčky v taktech hodin (T), a výsledkem je číslo, které udává, kolik průchodů smyčkou připadá na jeden cyklus výsledného tónu. Pro komorní A nám to vychází 66,287878…, a protože jsme na Spectru a máme registry celočíselné, tak 66. Tón o oktávu vyšší bude mít dělitele 33 (čím menší dělitel, tím vyšší tón), o oktávu nižší pak 133 (zaokrouhleně).

Jaká je maximální a minimální frekvence našeho hypotetického hradla? Maximální frekvence je taková, která se ozve s dělitelem 2 (pokud by byl 1, hodnota na výstupu by se neměnila) – po dosazení do vzorce vychází 14,6 kHz. Minimální frekvence bude, při osmibitovém počitadle, 114 Hz.

Teď už zbývá jen spočítat hodnoty pro jednotlivé půltóny. Podíl frekvencí dvou sousedních tónů je dvanáctá odmocnina ze dvou (neptejte se mě proč a přečtěte si toho Fuku) – naštěstí si to nemusíte počítat a můžete využít tabulky. (Z ní se taky dozvíme, že naše nejnižší frekvence je cca tón B2, nejvyšší pak zhruba A9.) Dostaneme tabulku dělitelů – nějak takhle.

Vzhledem k tomu, že používáme celočíselné operace, tak nebudou frekvence přesné a v místech, kde máme hodně tónů na málo hodnot (tedy u vysokých tónů) bude už velmi slyšitelné rozladění. Ostatně už v sedmé oktávě připadá na jednoho dělitele několik tónů a šestá bude taky slyšitelně rozladěná.

Vícehlas

Probrali jsme si teorii jednoho tónu. Jenže jednobitová hudba dokáže hrát i víc tónů naráz, šílenci jako Tim Follin třeba i tři, nebo pět. Jak se to dělá?

Tak, buď můžete rychle měnit frekvence tónů a hrát chvilku C a chvilku E a takhle to střídat, podobně jako to třeba dělá Fuka v prvním Jonesovi. Anebo můžete oba tóny skládat dohromady – tj. ve smyčce máte dvě počítadla, každé pro jeden tón, takže vám vznikají dva průběhy, a výsledek je pak OR nebo AND těchto průběhů. (U střídy 1:N nemá AND smysl.)

Takhle jednoduché že by to bylo? No ano, je to tak. Teoreticky. V praxi narazíte na spoustu zádrhelů. Například na to, že když použijete generátor se střídou 1:N a zahrajete dva tóny, které jsou od sebe přesně o oktávu, tak vám impulsy toho vyššího splynou s impulsy toho nižšího a vy uslyšíte jen ten vyšší (tím trpí například hradlo huby). Řešit to lze – buď jeden tón decentně rozladíte, tj. posunete jeho frekvenci o kousíček jinam, např. přičtete k děliteli 1 (což dělejte s tím nižším tónem), nebo mu posunete fázi (tj. nebudete posílat log. 1 ve chvíli, kdy je počítadlo rovno 0, ale třeba 4). Tím sice docílíte toho, že budou znít oba, ale navíc si přidáte do výsledku parazitní frekvence. Na druhou stranu – v tom obdélníkovém šumu se to ztratí…

Nebo že u jiných stříd (1:1 například) zní dva tóny jako by měly poloviční hlasitost proti jednomu tónu. Mnojo…

Ještě takový detail – když u střídy 1:N měníme tu první hodnotu (tedy 2:N, 3:N, 4:N), tak do určité meze můžeme simulovat změnu hlasitosti. Pokud ale zvolíme první číslo příliš velké, tak se u vyšších frekvencí změní střída na něco blízké 1:1 – a zase máme jiný problém.

Když budou hrát dva tóny, jen mírně rozladěné, vzniknou ve výsledném průběhu takzvané zázněje. Je to tím, že při hraní dvou frekvencí naráz vnímáme i třetí, která je rovna jejich rozdílu – toho lze taky využít při generování zvuků, ale to si nechme až na příště.

Příště

Co jsme ještě neprobrali? Třeba jak se dělají perkuse, tj. bicí (pomocí šumu a skluzů). Jak se dělají zvukové efekty (glissando, tremolo, ornamenty – arpeggia). Co je to detune a co fáze. K čemu je obálka. Jaká jsou k dispozici hradla, editory… a jak která fungují. A možná i spoustu dalších věcí – a protože vím, že mezi čtenáři jsou zkušení skladatelé jednobitových symfonií, tak je tentokrát poprosím: přispějte tématem, radou, poznámkou… Děkuju!

Ke hraní

No ano, mám pro vás hračku…

Co s tím? Funguje to samozřejmě zase jen v novějších Chrome a FF (takže mi nepište, že to ve vašem prohlížeči nedělá nic, já to vím a je mi to jedno). Hrajeme si s tónem C. Nahoře je tlačítko MUTE, které vypne ten protivný tón. Vedle toho jsou tři základní průběhy: Sinusovka, trojúhelník, pila. Pod tím obdélník se střídou 1:1 – jeden tón, dva tóny (C a E) pomocí OR a totéž pomocí AND. Pak totéž pro obdélník se střídou 1:3. Pak následuje generátor se střídou 1:N a dvojtón (pomocí OR, AND nemá smysl). A pak pro srovnání je totéž se střídou 4:N – všimněte si, že tón zní hlasitěji. Pak jsou ukázky dvou tónů se střídou 4:N a kombinace tónu 1:N a 4:N

Ke čtení a inspiraci

Líbil se vám článek? Podpořte autora na Patreonu
Příspěvek byl publikován v rubrice Hardware se štítky , , . Můžete si uložit jeho odkaz mezi své oblíbené záložky.
  • odpad

    Myslím, že ve větě „struna délky L vydává nějaký tón a struna délky L/2 vydává tón o oktávu nižší“ je chybka.

    Jinak prima počtení. Díky.

  • Jasně že jo. Díky za upozornění, opravil jsem.

  • Zdeněk Starý

    To mi připomnělo, jak jsem tohle řešil na Didaktiku Gama někdy přibližně v roce 1991. Viděl jsem, že některé hry hrají vícehlas, takže jsem si řekl, že to dokážu taky. Zkoušel jsem to sice z her vyčíst, ale reverzní inženýrství mně nikdy moc nešlo, tak jsem začal bádat sám. Bylo to o prázdninách a skutečně: po asi 14 dnech jsem vyloudil první dvojzvuk. Pak už to bylo jasné a napsal jsem si čtyřhlas. Byl zcela bez editoru a hrál dost falešně, hlavně ve vyšších polohách. Ani jsem to nakonec nikde nepoužil. Za týden jsem v prodejně elektro objevil Deákův 8hlasý program ZX-7, to mě lehce namíchlo. Dokonce jsem před lety našel starou kazetu se zdrojákem čtyřhlasu do Promethea, ale už nešla přečíst. Bicí a šumy jsem však nevyloudil nikdy.
    Tehdy jsem taky žasnul nad mluvícím programem „Kecal“, to jsem taky nepochopil, jak to dělá, nakonec jsem z něj vybral jen tu kecací rutinu a udělal k tomu (dost špatnej) editor a udělal jsem z toho relokovatelnou rutinu jednoduše použitelnou v Basicu.
    http://www.worldofspectrum.org/infoseekid.cgi?id=0015650

  • Michal Selmi Seliga

    vyborny clanok, stale ma zaujimalo ako to je programovane, ale nejak som sa nevedel rozhybat patrat a experimentovat (a to co som skusal sa nedalo pocuvat 🙂