Tento článek už byl jednou připraven k publikování ve stylu „zrychlil jsem hudební knihovnu, teď bude díky přesnějšímu časování lepší..“ Ale nebyla. Přestože se mi níže uvedenou knihovnu podařilo zrychlit o více jak 20%, její zasazení do frekvenčního rastru výsledných not bylo nakonec horší než u té původní, pomalejší. Paradoxně i rozsah generovaných tónů je (s ohledem na dosahované odchylky) větší u té „pomalejší“ verze. Takže jsem dvoutýdenní práci dal bokem a začal znovu.
Nyní tedy popíšu knihovnu původní a připojím její přesnější popis. Přeci jen v hrách Arkanoid a Treasure Island běží tato knihovna stylem „funguje to, nevím proč“. Tedy vím, ale nelámal jsem si tam hlavu s frekvencemi tónů, jen jsem poměrově změnil hodnoty jejich softwarových děliček. Nyní jsem pro každý tón vygeneroval v simulátoru PMD-85 od RM-TEAMu zvukový záznam, změřil čím jak nejpřesněji frekvence generovaných tónů a pokoušel se udělat optimalizace z pohledu kvartových, kvintových a oktávových intervalů. Ovšem jako nejlepší se nakonec s ohledem na hrubý rastr generovaných frekvencí (dělička má pouze 8 bitů) jevilo „naladit“ tóny tak, aby frekvence každého jednoho tónu byla čím jak nejpřesněji rovna frekvenci daného tónu v temperovaném ladění. Navíc je doplněn popis technického řešení generování dvouhlasé hudby a připojen komentovaný výpis programu. Program je také očištěn od zbytečností, které tam byly historicky zavlečeny.
Abych někde začal, začnu tedy od absolutního začátku. Hudbu, či lépe řečeno zvuky, mohu na jednobitovém digitálním výstupu generovat tak, že budu s dostatečnou frekvencí střídat logické nuly a jedničky a vytvářet takový časový průběh napětí, který se po zesílení a přivedení na reproduktor změní v akustické vlnění, které naše ucho vnímá jako zvuk. Pro zajímavost dodám, že pokud použiju vzorkovací frekvenci řádově 1MHz a před zesilovač umístím ještě integrační filtr (stačí obyčejný RC článek), mohu takto generovat celkem srozumitelně hlas či záznam jakéhokoliv nástroje. Je tedy jen otázkou dosažené frekvence v kombinaci s bitovým rozlišením amplitudy, jaké kvality dosáhneme. Teď zpátky na zem, na PMD-85 dosáhneme vzorkovací frekvence řádově 10kHz, samozřejmě s rozlišením 1 bitu (proud reproduktorem buď teče nebo neteče). To samo o sobě je část problému. Druhá polovina problému je, kde uskladnit obrovské množství požadovaných dat, které bych chtěl na ten reproduktor posílat. Takže na PMD-85 (stejně jako na ZX Spectru) můžeme generovat pouze pravoúhlé signály, jejichž průběhy lze počítat za chodu a nemusíme mít uložena žádná data pro tvar generované vlny.
Princip generování jednohlasé hudby (tónu) pomocí obdélníkového tvaru vlny je tedy jasný. Nebo taky ne. Pak vás mohu odkázat na detailní článek Martina Malého viz odkaz na konci článku. O level vyšší problém je, jak souběžně generovat tóny dva. To ukazuje následující obrázek.
S frekvencí řádově kolem 10kHz přepínáme na digitální výstup střídavě hodnotu vlny 1. tónu (modré „hodnoty“) a hodnotu vlny 2. tónu (červené „hodnoty“). Ano, zcela správně tušíte, že při trvalé logické nule u vlny č.1 a trvalé logické jedničce u vlny č.2 bude systém generovat parazitní tón na polovině „přepínací“ frekvence. Ale pokud ošetříme tento nedostatek, který může nastat pouze u generování pauzy, nic dalšího nežádoucího se neděje a princip funguje. Jádro procedury tedy bere hodnoty z třetího průběhu na předešlém obrázku v pořadí červená-modrá-červená-modrá-.. a tyto logické nuly či jedničky „háže“ v pravidelných intervalech na digitální výstup. Ta pravidelnost je důležitá, jinak se nám v generovaném zvuku začnou objevovat různé pazvuky.
Samotná knihovna pro přehrávání dvouhlasé hudby na PMD-85 vypadá takto.
Knihovna pro generování dvouhlasé hudby na PMD-85
Pokud chceme generovat hudbu souběžně s čekáním na stisk klávesy nebo provádět nějakou jinou nenáročnou činnost během hudby, lze takovou programovou sekvenci umístit do procedury „player“ za instrukci „call tongen“. Ovšem už třeba ono zmíněné čekání na stisk klávesy bude „obslouženo“ vždy až po doznění tónu, což může být velmi dlouhá a tím pádem nedostatečná časová odezva. Pak je nutno přestěhovat takový prográmek dovnitř procedury „tongen“ až téměř na samý závěr za sekvenci „dcr c/jnz chanl1“ a před sekvenci „dcr b/jnz chanl1“. V praxi je odzkoušeno, že i test několika kláves v tomto místě nemá negativní vliv na rychlost a čistotu přehrávané hudby.
V následujícím souboru v Excelu jsou na záložce TABLE uvedeny dělicí poměry, skutečné frekvence tónů a odchylky frekvencí. Do bílé tabulky (dělicí poměry) zadáváte hodnoty pro jednotlivé tóny, ostatní (barevné) tabulky se automaticky přepočítávají.
Přehled tónů a jejich odchylek (Excel – výpočty platné pro PMD-85)
Velice užitečné povídání o generování jednobitové hudby lze nalézt na níže uvedených odkazech:
Martin Malý: https://retrocip.cz/symfonie-na-jednom-bitu/
František Fuka: http://www.fffilm.name/2012/02/hudebnim-skladatelem-snadno-rychle.html
Vzhledem k tomu, že jsem si nepohlídal verzi emulátoru, odladil jsem absolutní frekvence not chybně a tím pádem zbytečně. Na poslechu takto vyluzované „hudby“ to asi ani moc znát nebude, tónové intervaly budou zhruba stejné, jen absolutní frekvence not se změní a já v tom chci mít pořádek. Takže hned jak RM TEAM vypustí upravený emulátor PMD-85 nebo až opravím čítač a změřím to na reálném hardware, umístím zde opravenou knihovnu. Sám jsem zvědav, o kolik se ty dělicí poměry not (a tím pádem samozřejmě i frekvence) posunou. Pokud by odchylka v předpokládané reálné rychlosti CPU dělala ca 6%, bude ten posun ladění o jeden celý půltón..
Vzorkovací frekvence řádově 10kHz, zmíněná na dvou místech v článku, už je minulost. To platilo jen u původní rutiny, převzaté ze ZX Spectra. Dokážu se dostat až nad 40kHz. Problém, který ovšem při překročení 44100Hz (vzorkovací frekvence zvukové karty) nastane, předpověděli kdysi dávno pánové Shannon, Nyquist a Kotělnikov. Proto je vzorkovací frekvence v uvedené proceduře pro generování dvou souběžných tónů „držena“ těsně pod 44kHz. I tak už narůstá poslechem detekovatelný rušivý signál, který má původ v nadbytečných samplech, které se „minuly“ se vzorkováním 44100Hz zvukové karty.