MXTracker / připravujeme

Chystáme: ataristický SID zvuk v MXTrackeru

Člověk by si mohl myslet, že tři AY čipy, devět kanálů, obálky, šum, ornamenty a všechno ostatní už jsou dostatečný prostor k tomu, aby byl hudebník chvíli spokojený. Samozřejmě nejsou. Pro MXTracker a přehrávač .mxplay proto chystáme další věc, kterou budou dobře znát hlavně lidé z ataristické scény: SID voice. Tedy trik, díky kterému lze z obyčejného AY dostat mnohem živější, pulzujcí zvuk připomínající Commodore 64.

A protože nestačí napsat „bude to znít hezky“, pojďme se podívat, odkud se tenhle trik vzal, proč funguje a co všechno bude potřeba na ZX Spectrum Next udělat, aby to nebyla jen další pěkná kolonka v menu.

Odkud se to vzalo

Atari ST používá zvukový čip Yamaha YM2149, tedy velmi blízkého příbuzného AY-3-8912 ze Spectra. Tři kanály, pravoúhlý tón, šum a hlasitost po šestnácti úrovních. Na papíře nic, z čeho by člověk čekal zvukové zázraky. Jenže atarští muzikanti zjistili, že když se hlasitost nezmění jednou za snímek, ale mnohokrát během jediné periody tónu, začne se čip chovat podstatně zajímavěji. Atari ST má k tomu obvod MFP 68901 s časovači, které mohou pravidelně vyvolávat přerušení a velmi rychle přepisovat registr hlasitosti.

  • SID voice – rychlé přepínání hlasitosti v rytmu tónu vytvoří pulz s proměnnou šířkou.
  • Sync-buzzer – časovač opakovaně restartuje hardwarovou obálku a vytváří vlastní bzučivý tón.
  • Digidrums – rychlé změny hlasitosti fungují jako jednoduché přehrávání krátkého vzorku, typicky bicích.

Jako první chceme udělat SID voice, protože je z těchto triků nejzajímavější pro melodické nástroje a zároveň dává největší smysl jako první krok. Jinými slovy: nezačneme rovnou třemi problémy, když si můžeme nejdřív vyrobit jeden.

Proč obyčejný AY zní „ploše“ (vím, za tuto větu se dostanu do pekla)

Tónový generátor AY umí v zásadě obdélník se střídou 50 %. Výšku určuje 12bitová perioda TP a frekvence tónu se počítá:

f = takt AY / (16 × TP)

Na ZX Spectrum Next běží AY na 1,75 MHz. Čip sám o sobě neumí plynule měnit tvar tónu. Hudebník má k dispozici hlavně hlasitost, šum a hardwarovou obálku. Ta je navíc sdílená pro celý čip a k tónu se zrovna dvakrát přátelsky nechová.

Jak z obdélníku udělat pulz

Výstup AY se dá zjednodušeně chápat jako tón vynásobený hlasitostí. Když je obdélník tónu nahoře, slyšíme nastavenou hlasitost; když je dole, je ticho. Pokud ale začneme hlasitost měnit během jediné periody, dostaneme součin dvou průběhů.

Tón vynásobený posunutou vlnou hlasitosti vytváří pulz; rozladění mění jeho šířku

Pokud má „vlna hlasitosti“ stejnou periodu jako tón, výsledkem je pulz. Jeho šířku určuje vzájemný fázový posun obou průběhů. Při nulovém posunu dostaneme 50% pulz, při půlperiodovém posunu může výsledný tón na okamžik prakticky zmizet. Pokud vlnu hlasitosti proti tónu nepatrně rozladíme, fázový posun se začne pomalu měnit. Tím se plynule mění i šířka výsledného pulzu. Přesně tenhle pohyb dává zvuku živost známou z pulzně šířkové modulace na C64. Rychlost pohybu se dá spočítat. Pokud je každý krok vlny delší o d/1024, posune se fáze během jedné periody tónu o d/1024 periody a celý cyklus proběhne za 1024/d period tónu. Pro 440 Hz a d = 3 to vychází přibližně na 0,8 sekundy. Hlubší tóny mají delší periodu, takže potřebují větší rozladění, jinak se pulz bude měnit tempem, které ocení hlavně geologové.

Nejen obyčejné zapnuto/vypnuto

Vlna hlasitosti nemusí mít jen dva stavy. Chceme ji popsat krátkou tabulkou o 2 až 16 krocích s hodnotami 0 až 15, která se přehraje během jedné periody tónu. Díky tomu se možnosti dost rozšíří.

  • Hloubka modulace: průběh 15,0 dává plnou PWM, průběh 15,9 druhou polovinu jen zeslabí a zní jemněji.
  • Vlna bez tónu: při vypnutém tónovém generátoru funguje registr hlasitosti jako malý 4bitový DAC a může přehrávat pilu, trojúhelník nebo sinus.
  • Oktáva: vlna může běžet dvakrát, čtyřikrát nebo osmkrát rychleji či pomaleji než základní tón, což dává další „syncované“ barvy.

Je dobré připomenout, že DAC v AY není lineární. Jeden krok hlasitosti odpovídá zhruba 3 dB, takže hodnota 9 rozhodně není „60 % hlasitosti“. Hladiny vlny proto chceme násobit aktuální hlasitostí nástroje v krocích čipu. Díky tomu zůstanou funkční obálka hlasitosti, dozvuk i změny hlasitosti z patternu.

Časovače na Nextu: Z80 CTC

Atari má MFP, Next má Z80 CTC. Osm kanálů čítačů, každý s vlastním přerušením. A tady má Next jednu velmi příjemnou vlastnost: CTC běží z 28MHz taktu procesoru a s předděličkou 16 tiká na 1,75 MHz, tedy přesně v taktu AY. Délku jednoho kroku vlny tak lze přímo odvodit jako:

délka kroku = 16 × TP / počet kroků vlny   [tiků CTC]

Každý SID hlas dostane vlastní kanál CTC. Na konci kroku přijde přerušení, jeho obsluha zapíše novou hlasitost a nastaví délku kroku následujícího. Teoreticky jednoduché. Prakticky přesně ten druh jednoduchosti, kvůli které pak člověk tři večery řeší jeden tik.

Přesné ladění

Časová konstanta CTC je jen osmibitová, takže délka kroku musí být celé číslo. Prosté zaokrouhlení by mohlo vytvořit chybu až kolem 0,4 %, tedy asi 7 centů. U normálního tónu je to málo, ale tady každá odchylka mění rychlost posunu fáze. Proto chceme počítat i se zlomkovou částí. Přerušovací rutina si ji bude akumulovat a při přetečení udělá jeden krok o tik delší. Průměrná perioda pak může sedět na 1/256 tiku a pulz se bude pohybovat jen podle zvoleného rozladění, ne podle náhody zaokrouhlení. U delších kroků se použije předdělička 256. Naopak u vysokých tónů, kde by byl krok kratší než samotná obsluha přerušení, se počet bodů vlny bude postupně redukovat: 16 na 8, potom 4 a nakonec 2.

Přerušení

Next v režimu IM2 umožňuje přiřadit různým zdrojům vlastní vektory. SID obsluhy tak mohou zůstat krátké a mít vysokou prioritu. V hustší skladbě půjde o tisíce přerušení za sekundu, ale při 28 MHz by to stále mělo zabrat jen malou část výkonu CPU.

Spolupráce s přehrávačem

Běžný přehrávač počítá AY registry jednou za snímek, tedy 50× za sekundu. Mezitím ale SID obsluha přepisuje hlasitost mnohonásobně častěji. To znamená dvě důležité věci.

  • Výběr registru: AY se ovládá přes volbu registru a následný zápis hodnoty. Přerušení mezi těmito kroky by mohlo poslat hodnotu jinam, takže vlastní zápis registrů musí probíhat se zakázaným přerušením.
  • Kdo píše poslední: přehrávač nesmí každý snímek přepsat aktuální SID hlasitost starou hodnotou. Těsně před zápisem proto použije hodnotu, kterou SID rutina nastavila naposledy.

Jinak by se vlna každý snímek nepatrně přeskočila a výsledkem by bylo praskání. Což je sice také zvukový efekt, ale tentokrát opravdu neplánovaný.

Kolik hlasů najednou

Počítáme se čtyřmi kanály CTC, takže SID by mohl současně běžet na čtyřech kanálech z devíti dostupných přes tři AY. Hlasy se budou přidělovat podle pořadí kanálů a kanál si SID hlas ponechá, dokud používá nástroj se SID. Pokud už žádný hlas nezbude, zahraje kanál normálně. Kanál používající hardwarovou obálku SID mít nemůže, protože jeho hlasitost neřídí registr, ale obálka. Ostatní vlastnosti nástroje by měly fungovat dál: hlasitost, její obálka, zapnutí tónu, šum, ornamenty, vibrato i portamento. Vlna se bude vždy odvozovat od aktuální periody tónu, takže změny výšky bude sledovat sama.

Formát: MXC

Nastavení SID chceme ukládat přímo do MXC, tedy formátu, který MXTracker exportuje a .mxplay přehrává. MXC přitom zůstává kompatibilní s PT3 principem: rozšířená data mohou ležet před vlastním vzorkem, zatímco PT3 ukazatel míří až na běžnou část. Starší přehrávač si tedy SID informací nevšimne a nástroj zahraje jako obyčejný.

Pro SID počítáme s blokem přibližně v této podobě:

+0   režim        0 = vlna hlasitosti
+1   délka vlny   2..16 kroků
+2   oktáva       -3..+3 proti tónu kanálu
+3   rozladění    -128..+127, krok delší o d/1024
+4   vlna         16 hladin 0..15
...  [příznaky] [konec smyčky] | data vzorku PT3

Výhoda je jednoduchá: všechno zůstane v jednom hudebním souboru, starší přehrávače skladbu pořád zahrají – jen bez SID – a pole režimu nechává do budoucna prostor třeba pro sync-buzzer nebo digidrums. .mxplay by navíc SID část načítal jen tehdy, pokud modul nějaký SID nástroj skutečně obsahuje. Běžná skladba bez SID tedy nebude platit ani bajtem navíc.

A jak by to mělo vypadat v MXTrackeru

V samotném trackeru chceme SID udělat podobně jako ornamenty.

  • Skladba bude mít až 31 SID tvarů, na které budou nástroje odkazovat číslem.
  • Samostatný celoobrazovkový editor ukáže tvar jako graf až 16 sloupců kreslitelných myší i klávesnicí.
  • K dispozici bude délka, oktáva, rozladění a několik předvoleb – čtverec, úzké pulzy, pila, trojúhelník nebo sinus.
  • Tvary půjde rovnou poslouchat na klaviatuře, protože SID se stejně nakonec ladí hlavně ušima.
  • Tvary se uloží do nativního MXM a při importu/exportu MXC se budou převádět spolu s nástroji.

Tak držte palce, snad se toto povede... ;)