Zkreslení z Moravy Reportáž z Audiffexu

Simulace kytarových aparátů a krabiček, už tu s námi jsou hezkých pár let. Někteří je bez výčitek používají a obdivují, jiní je naopak neuznávají a zarputile je zatracují. Nicméně ne všichni ví, co stálo za jejich zrodem a na jakých principech simulace vlastně pracují.

Podobná úvaha utkvěla v hlavě i nám, a tak jsme využili příležitosti dozvědět se něco více o jejich vývoji. Vypravili jsme se tedy pohodlným vlakem EC 275 Jaroslav Hašek napříč republikou do firmy Audiffex, kde jsme se setkali přímo s tvůrci tuzemských simulací, Jaromírem Mačákem a Luborem Přikrylem. Náš rozhovor začal zcela spontánně už cestou od vlaku a tak trochu „odprostředka“ – debatou o převodnících a dynamice. Vstupme do něj tedy ze stejného místa...  

Pro časopis Muzikus napsal Michal Snížek

 

Je nějaký požadavek na vstupní převodníky z hlediska speciálnosti hudebních nástrojů, konkrétně hlavně kytary?

Nemyslím si, je to naprosto standardní studiová věc. Pouze je nutné použít převodník s vysokou vstupní impedancí, abych nezatěžoval snímač kytary. Řada lidí se snaží hrát přes software a diví se, že jim to nehraje, když to mají zapojené do klasického vstupu zvukové karty. Pokud nemám vysokoimpedanční vstup přímo na kartě, musím mít nějaký předzesilovač nebo zařízení, které mi to zajistí. Jinak bych řekl, že zrovna u kytary jsou převodníky možná trochu přeceňovaným faktorem vzhledem k jejímu frekvenčnímu rozsahu. Podle mě je nezbytné mít dobrý odstup signálu od šumu. Když se budeme bavit o zkreslovačích, tak ty udělají v principu to, že vstupní signál mnohonásobně zesílí a potom ho nějakým způsobem „ořežou“. Pokud mám na vstupním převodníku nějaký šum, nechci teď říkat nějaké konkrétní hodnoty, tak po zesílení budu mít na výstupu samozřejmě mnohonásobně zesílený i ten šum. Ořezáním ale změním jeho poměr vůči užitečnému signálu a šum se pak, bohužel, projeví mnohem více.

Zajímavé je, že většina lidí v souvislosti s převodníky řeší spíš dynamiku než šum... O tom vím, ale podle mě u převodníku problém s dynamikou určitě není. Vezmi si, že dnes se převodníky dělají běžně čtyřiadvacetibitové, takže máš k dispozici 224 (16 772 216) hodnot. Například z kytarového snímače jde řekněme +/-300 mV, které lze rozdělit na necelých sedmnáct miliónů úrovní. To je dostatečně jemná škála k pokrytí celé úrovně signálu. Ale hlavně je to důležité pro ten odstup signálu od šumu.

Převodníky tedy nevyvíjíš. Už dostaneš nějaký hotový a ten použiješ?

Řekl bych to možná trochu jinak. Ty systémy jsou v podstatě dva. Jeden je klasické PC, kde je tohle všechno vyřešené pomocí zvukové karty, tam se o to hardwarové propojení nemusíme starat. Druhá možnost je vyvíjet vlastní hardware, kde si musíme naopak všechno řešit sami, tj. procesor, vyrovnávací paměti, převodníky atd. Já osobně se zabývám většinou implementací nějakého algoritmu, o ty hardwarové věci se až tak starat nemusím.

Dobře, mám tedy jack z kytary zapojený do správného vstupu, co se děje dál?

Signál z kytary mi převodník navzorkuje. To znamená, že v příslušné vzorkovací frekvenci (např. 48tisíckrát za vteřinu) mi v každý okamžik odečte úroveň vstupního signálu a převede ji na číslo v digitální formě, tj. na sled nul a jedniček. Ovšem to není pro člověka dobře čitelný formát. Při programování tedy využíváme tzv. datové typy (různý pohled na sled nul a jedniček). Nejčastěji používáme celočíselné datové typy a nebo čísla s tzv. plovoucí řádovou čárkou, což je reprezentace reálných čísel.
A to už je vlastně to, co já dostanu do programu. Řekněme tedy, že mám na vstupu zvukové karty hudební signál jako střídavé napětí ±1 V. Následuje převod té vlny (vlastní digitalizace) na sled jednotlivých bitů. Pak zpracovávat, musí jít přes vyrovnávací paměť. Tzn. že si musíme vzít vždycky nějaký úsek dat, která přijdou z převodníku, poslat si je do procesoru na zpracování, tam se příslušná čísla zmodifikují, a pak se uloží zase do výstupní vyrovnávací paměti, ze které jdou na výstupní převodník a přemění se na výsledný zvuk. Na tom procesu je důležité, jak jsou vyrovnávací paměti velké. Čím bude paměť větší, tím máme větší výhodu v tom, že
bude míň operací, jako je naplňování pamětí, přepínaní procesů apod., ale současně mi bude narůstat latence (zpoždění) zpracování signálu. Samozřejmě to vždy záleží na hráči, ale musíme se pohybovat někde v rozmezí 5–10 ms.

Tohle jsem si také zkoušel, a když jsem se dostal na hodnotu cca 13 ms, tak už mi začínalo vadit, že slyším zvuk zpožděný. Jakou s tím máte zkušenost?

(vstupuje Lubor Přikryl)

My jsme dělali společně s VUT v Brně docela rozsáhlý výzkum, že jsme si zvali od každého nástroje několik aktivních muzikantů a zkoušeli jsme různé latence. Výsledky jsme vyhodnotili a zjistili jsme, že každý muzikant to vnímá naprosto jinak. Nicméně kytaristé jsou jedni z nejcitlivějších. Naopak nejméně citliví byli například klávesáci nebo dechaři. Těm třeba i nějakých 20 ms ještě nevadilo. Záleží také samozřejmě na stylu, jaký kdo hraje.
Ona je také pravda, že lidi jsou z toho někdy strašně vystresovaní, ale když si uvědomíš, že zvuk se šíří rychlostí těch 300 m za sekundu, tak 30 m je 100 ms, 3 m je 10 ms. No a tři metry od boxu stojíš na pódiu poměrně běžně, a už tam těch 10 milisekund zpoždění hned máš.

Máme tedy vstupní signál převedený na čísla, vyřešené vyrovnávací paměti... Co následuje?

No, prakticky, když už mám digitalizovaný signál, tak si ho můžu představit jako nějakou matematickou funkci, a pak si s tím můžu dělat cokoliv, co mi umožňuje matematika. Čili mám-li například sinusovku a chci z ní udělat obdélníkový průběh, je to úplně jednoduché. Dejme tomu, že amplituda dané sinusovky je řekněme opět 1, a já průběh signálu tisíckrát zesílím, tj. každé číslo ve vyrovnávací paměti vynásobím tisícem, čímž dostanu sinusovku o amplitudě 1000. A já si pak řeknu, že vše, co je nad 1, oříznu (nahradím jedničkou), čímž simuluji saturaci. Takže ve výsledku dostanu signál se strmým náběhem, který se rychle dostane na hodnotu 1, všechny vyšší hodnoty oříznu, a pak mám zpět zase strmý do -1, kde opět nastává oříznutí. Takhle jednoduše vyrobím jiný tvar vlny. A to je základ digitálních distortionů a overdrivů. Tohle se dělá prakticky v každém zkreslovacím obvodu, v analogové oblasti funguje úplně stejný princip. Já vlastně kopíruji základní princip analogových obvodů.

Takže se tedy vlastně snažíš napodobit průběh analogových obvodů, nebo si s tím „hraješ“ tak dlouho, až se ti to prostě líbí?

Ne, já to opravdu dělám tak, že to vypočítám podle obvodů. Ale je pravda, že to „hraní si“ je historicky starší způsob. Když se dřív simulovalo zkreslení, tak se programovalo přesně to, co jsem před chvílí řekl. Ale kdyby sis to poslechl, tak to moc hezky nehrálo. Znělo to spíš jak přebuzený hi-fi zesilovač. Hledalo se tedy, proč aparáty hrají lépe. Je to například tím, že existují i nějaké frekvenční závislosti – že v analogových předlohách se obvod chová jinak na nižších kmitočtech, jinak na vyšších kmitočtech apod. Ten původní systém pro simulaci saturace frekvenčně závislý není, takže ať do toho pouštím nižší frekvence nebo vyšší frekvence, saturuje to pořád stejně. Začalo se tedy experimentovat s různými filtry zapojenými před obvodem a za ním, se zesílením a ořezáním. I toto mělo své opodstatnění.
Hezky je to vidět například u klasického elektronkového (triodového) zesilovače, kde je v katodě zapojen kondenzátor, kterým se určuje předpětí lampy, a tím, v jaké části převodní charakteristiky lampa pracuje. Kondenzátor (kapacita) je frekvenčně závislý prvek, tím je tedy daná jiná saturace na basech a jiná na výškách. (viz obrázek vlevo).
Tím bylo dosaženo věrnějšího zvuku a na tomhle principu byly založené první digitální zkreslovací efekty. To se bavíme o době zhruba před deseti až dvaceti léty, kdy procesory zvládaly pouze takovéhle operace – filtraci a saturaci. Moji předchůdci pak v podstatě hledali možnosti, jak tyhle algoritmy vylepšit a dosáhnout tím věrnějšího zkreslení. Například použili banky filtrů, které signál rozdělily na vyšší a nižší kmitočtová pásma, každé pásmo zpracovali zvlášť a na konci je sečetli. Prostě se snažili nějak napodobit fyzikální chování analogových předloh. Ale pořád to ještě nebyla přesná simulace obvodu zkreslení.
A k tomuhle existuje paralelně druhá linie simulátorů elektronických obvodů, která je mimochodem už také poměrně stará. Tyto simulátory jsou opravdu velmi přesné a používají se při designu elektronických zařízení. Pokud chceš dnes navrhovat nějaký obvod, můžeš nejprve navrhnout model v počítači, ověřit si, že je to správně zapojené, a až pak realizovat hardware. Problém je, že výpočetní náročnost těchto simulátorů je tak obrovská, že nějaké trochu složitější schéma ani dnes, se současným výkonem počítačů, nejsme schopni v reálném čase spočítat.
Když si vytvořím model lampy a zasadím ho do systému, tak to je sice technicky možné, ale je problém to použít v reálném čase? Přesně tak. Postupy na to jsou, ale je to výpočetně strašně náročné. Ovšem skutečnost, že to nedokážeme spočítat jako celek, neznamená, že nedokážeme spočítat menší části, což je přesně směr, kterým jsme se vydali. To znamená, že my si stavíme elementární bloky, které simulujeme tak, jak se má: Vezmu si obvod, podívám se, jak je zapojený, analyzuji si ho, napíšu si pár diferenciálních rovnic a snažím se je vypočítat pomocí určitých matematických postupů. A když je těch rovnic opravdu málo, třeba tři nebo čtyři, tak už jsme dnes schopni je v reálném čase spočítat se stejnou přesností jako u zmíněných simulátorů obvodů, které se používají pro design obvodů. V případě složitějšího obvodu musím uvnitř najít jednotlivé bloky, jak jsou zapojené za sebou. Pak je počítám samostatně a zvukový signál v programu jde v podstatě stejně jako v daném analogovém zařízení. Tzn. projde prvním blokem, který s ním něco udělá, vstupuje do druhého bloku, kde se zase něco stane, atd. A tohle už jsme schopni spočítat. Problém bohužel je, že dělení na bloky není úplně jednoduché. Když si vezmeme nějaké klasické kytarové krabičky, kde jsou převážně operační zesilovače, tak tam je to většinou v pohodě. Jde tam o to, že výsledek následujícího bloku vyloženě neovlivňuje funkci předchozího bloku. Můžu to potom poměrně jednoduše rozdělit a výrazně mi to usnadňuje práci. Není tam navíc zpětná vazba mezi bloky. Ve složitějších zařízeních nebo zesilovačích, obzvlášť elektronkových, už to tak jednoduché, bohužel, není.

Ty rovnice vznikají jak?

Ty se dají odvodit přímo ze schématu. Existují postupy, jak popsat obvod. Mám teď na mysli Ohmův zákon, Kirchhoffovy zákony a další známé formule. Z toho vznikne soustava rovnic, kterou musím vyřešit. Ovšem problém je, že vzniklá soustava je nelineární, takže řešení není triviální. Prostě nevznikne něco ve tvaru y = 2x, ale řešení hledám iterativně – tedy jako kdybych hádal. Čili nějaké odhadnuté řešení zkouším, jestli vyhovuje, a většinou samozřejmě napoprvé nevyhovuje, takže odhad trochu zpřesním a znovu zkouším, zda vyhovuje, a tak dále, dokud se k správnému řešením nepřiblížím s dostatečnou přesností. Proto je to tak náročné na výpočet. Když je nelinearita jen jedna, tak konvergence ke správnému řešení je poměrně rychlá. Když je ten obvod složitější a nelineárních funkcí je tam víc, dostaneme se do nějakého n-dimenzionálního prostoru, a tam jsou řešení kolikrát i nejednoznačná. Ale asi dost matematiky. :-)

Dobře, ale když už u té matematiky jsme, vrátím se ještě k té výpočetní náročnosti. Je problém v tom, že současná výpočetní technika je pořád ještě pomalá, a nebo se jedná o úlohy, které se nedají řešit nějakým jasným sledem kroků?

Limituje nás čistě výpočetní výkon. Sekvence kroků je daná, ale je jich moc. Když si uvědomím, že pro každý vzorek, kterých je za sekundu standardně 48 000, ale interně se pracuje s daleko vyššími vzorkovacími frekvencemi, musím řešit poměrně složitý matematický problém, a tak se dostávám opravdu k limitujícímu počtu operací v procesoru. Navíc ta povaha úlohy je svým způsobem nešťastná i v tom, že se nedá řešit paralelně na více jádrech procesoru současně. Pro výpočet každého vzorku potřebuji výsledek z toho předchozího. Takže kdybych to chtěl rozložit, tak by to teoreticky v některých případech možné bylo, ale zase by začala rychle narůstat latence. Navíc je třeba připočíst i režii spojenou s paralelizací, takže ve výsledku by to moc efektivní nebylo.

Jak pak pracuješ s tím navrženým obvodem? Pustíš do něj kytaru a zkoušíš, jak to hraje? Děláš nějaká měření, nebo to jen posloucháš? Zveš si někoho?

Nejprve si navrhnu model, napíšu algoritmus a testuji ho na umělých signálech, které mám v počítači. To znamená, že používám sinusovku, ale klidně i nahraný kytarový riff. Ale napřed vizuálně kontroluji, jestli ten signál po zpracování vypadá tak, jak očekávám. Algoritmus je potřeba pořádně odladit, aby dělal opravdu to, co to dělat má. Přeci jen programátor je jen člověk, takže to většinou nefunguje na první pokus. Vždycky se najde nějaká chyba.
Pak to samozřejmě i poslouchám. Většinou stačí testovat jen na brnknutí. Přišel jsem na to, že neodladěné algoritmy není úplně dobré zkoušet třeba na sluchátka. Občas to může i zabolet. :-) Když je všechno v pořádku, tak mě čeká velká řehole. Algoritmus musím implementovat v „něčem“, v čem ho mohu vyzkoušet v reálném čase. Na to jsou ideální VST plug-iny. My na to máme už připravený vývojový plug-in, který má prázdnou smyčku pro vlastní zpracování zvuku, do které musím vepsat navržený algoritmus. Pak teprve můžu začít testovat, jak se algoritmus chová při reálném hraní – to se dost často liší od umělých a předem nahraných zvukových signálů.
Když to hraje blbě, tak musím hledat, kde je problém, když to hraje dobře, tak si můžu pogratulovat. Pak už můžu konečně ze svého algoritmu dostat nějaké charakteristiky, které bych mohl srovnat s charakteristikami simulovaného obvodu. Můžu provést úplně stejná měření jako u analogového obvodu. Do plug-inu pustím sérii testovacích signálů s různým spektrem, abych zjistil např. frekvenční zabarvení. Pak už můžu konečně začít porovnávat algoritmus s analogovou předlohou. Z výsledků vidím, co je jinak, a přemýšlím, proč to tak je a co mám změnit, aby se to víc podobalo originálu. Což je tedy obrovská alchymie a je to ve výsledku třeba i nějakých osmdesát procent práce vývoje algoritmu. I když, pokud se budeme bavit o simulaci obvodu s „operáky“, tak tam to většinou, pokud není chyba v algoritmu, hraje stejně hned, protože zde jsou poměrně přísné normy na toleranci součástek a operační zesilovač prostě dělá to, co má. Ale například u elektronek je tolerance klidně i 20 %, a tam je zkrátka všechno jinak. Ostatně to všichni známe. Když vezmeš lampu a v aparátu ji vyměníš za jinou, tak bude hrát jinak. Ta simulace pak v zásadě nemůže být nikdy naprosto stejná, jako aparát, který máš doma. 

Nicméně tobě se poměrně vysoké věrnosti podařilo dosáhnout...

To je pravda. Ve své disertační práci jsem publikoval simulaci pre-ampu a potřeboval jsem doložit, že je ta simulace opravdu věrná. Musel jsem ale kvůli tomu elektronky z toho pre-ampu vytáhnout, naměřit přesně jejich charakteristiky, což byl týden měření, a získaná data jsem pak použil ve svém softwarovém modelu elektronky. Jen díky tomu jsem mohl dojít k tomu, že algoritmus hrál opravdu stejně jako předloha, což se také skutečně stalo.
Dělali jsme na to poslechové testy a naprostá většina lidí nebyla vůbec schopna poznat rozdíl. Ale musím zdůraznit, že to byl jeden konkrétní pre-amp. Když budu srovnávat s jiným preampem stejného typu, tak už to nebude pravda. Protože jsou tam jiné elektronky, jsou tam jiné rezistory (opět záleží na toleranci) atd., takže všechny pracovní body budou zase malinko posunuté a bude to hrát prostě jinak. Musí.

Zatím se pořád bavíme o zkreslení, ale je problém simulovat i ostatní efekty? Mám na mysli např. chorus, delay apod.

To takový problém není a může to být i poměrně snadné. V podstatě i některé analogové krabičky jsou prakticky řešené jakoby digitálně. Najdeš tam posuvný registr, což je v podstatě digitální součástka, na vstupu je vzorkovač... Tyto efekty se simulují opravdu docela jednoduše.
Ale znáš to, zvuk obyčejného digitálního chorusu je úplně sterilní. V analogové variantě jsou opět nějaké vstupní obvody, které jsou frekvenčně závislé, často tam bývají kompresory a expandéry, aby snížily šum zpožďovací linky, na výstupu je sumační zesilovač s další frekvenční charakteristikou, a i ten BBD obvod (zpoždovací linka) není bezeztrátový, frekvenčně nezávislý. Čili pokud chci udělat věrnou simulaci chorusu, musím se všemi těmito závislostmi počítat. Opět vstupují do hry filtry, podobně jako u zkreslení. Výhodou ale je, že filtry jsou lineární obvody, takže jsou jednoduché na simulaci.

A co třeba boxy, zesilovače...?

Ten postup je jak u boxu, tak u zesilovače v zásadě úplně stejný jako u krabiček. Samozřejmě, že zvuk zkreslené kytary není jenom otázka zkreslení, ale je tam vliv i boxu a koncového zesilovače. Podle mě třeba box tvoří osmdesát procent zvuku. Takže ho do simulace musím také zahrnout. Jde jen o to, jakou metodu zvolím k simulování. Můžu použít například nějaký konvoluční algoritmus se změřenou charakteristikou boxu (to jsou ty dnes populární impulzy :-)). Je to vlastně jen dlouhý filtr, přes který signál prochází. Problém je v tom, že filtry mají ale nějaké zpoždění, což může být jedna z příčin pocitu určitého „odstupu“ zvuku od hráče.
U koncových zesilovačů musím zase provést celkovou analýzu, naměřit charakteristiky – úplně stejně jako u pre-ampů. Tady je bohužel překážkou, že ho nemůžu jednoduše rozdělit na ty zmíněné bloky. Je tam vždy zpětná vazba z výstupu až úplně na vstup, takže tam to už musíme určitým způsobem obcházet.

(opět vstupuje Lubor Přikryl)
Ideální by bylo, kdyby se dala vyrobit skládačka, že by sis kteroukoliv část mohl dát analogovou a za ni si dal libovolně software. Což přesně z důvodu zmíněné zpětné vazby nejde. Kdybys mohl simulaci „useknout“, např. za koncovým zesilovačem (pak bys tam tedy musel dát nějaký naprosto nezabarvený koncový zesilovač), a připojit k tomu svůj kytarový box. A to se zkrátka nedá úplně udělat. Protože zase – mám tedy nějaký skvělý koncový zesilovač, ke kterému je připojený box, jenže reproduktor má impedanční charakteristiku, tím pádem i ten skvělý zesilovač je ovlivněný připojeným reproduktorem a zase jsme někde jinde. Ona je velice důležitá věc, přes co muzikanti zvuk simulací poslouchají. Protože když se udělá až do konce, tak je v ní zahrnutý i reproduktor. Takže když to poslouchají např. přes kytarový aparát, už je tam jeho charakteristika vlastně dvakrát.
Jinak to bude hrát zase např. na hi-fi komponentech apod. Oni si lidé pak stěžují, že jim to hraje jinak doma než ve zkušebně. Ale to ani jinak být nemůže, když to doma poslouchá na „nearfieldy“ a na zkušebně má za sebou „half stack“. Jednoduše řečeno, když už simuluji kytarový box, tak už přes něj nemůžu znovu fyzicky hrát. Je jasné, že jinak se ten zvuk někam posune.

Můžeme tedy na závěr udělat nějaké shrnutí celého vývoje?

Pravda je, že my neděláme nic, co by bylo vysloveně nové. Přesné (!) simulátory elektronických obvodů existují opravdu už desítky let. My jen hledáme způsoby, jak to zjednodušit, aby to bylo možné počítat v reálném čase. To znamená, že musíme zanedbávat určité věci, kde využíváme např. psychoakustiky.
Ale abych to tedy shrnul: Mám nějaké zařízení, které chci simulovat. První věc je, že si musím sehnat schéma. Ne vždy se podaří sehnat originál, takže nezbývá, než se podívat dovnitř na zapojení a překreslit jej. Naštěstí se dají dneska na internetu schémata dobře najít, ale bohužel v nich bývají chyby, kolikrát záměrně. Když mám schéma, tak se začnu dívat, co to tedy vlastně dělá, a snažím se identifikovat jednotlivé funkční bloky. Následně se pokusím bloky řešit samostatně, musím ale zároveň zohlednit všechny zpětné vazby, a popíšu je matematicky. To zatím vše probíhá ručně na papíře.
Potom si sednu k počítači a přepíšu získané rovnice do programu a napíšu algoritmus, který je umí vyřešit. Když mám návrh algoritmu hotový, tak ho začnu testovat pomocí testovacích signálů a sleduji, jestli to funguje tak, jak by mělo. Pokud ano, tak si takhle postupně připravím všechny bloky. Pak je teprve přepíšu do kódu v jazyce C, udělám si VST plug-in a začnu laborovat s vlastním zvukem a ladit obvod. To, jak jsem už řekl, trvá nejdéle, protože každá změna znamená nové měření a nové porovnání výsledků. Finální ladění probíhá pomocí poslechových testů. Používáme tzv. ABX testy, kdy do vzorku A nahraji reálný aparát, do vzorku B nahraji simulaci a vzorek X je náhodný výběr z těch dvou. Posluchač (samozřejmě neví, že A je realita a B simulace) má pak říct, jestli X je A nebo B. Může se pak pokusit identifikovat i samotné vzorky, tj. určit, který byl simulace a který skutečný aparát. Už se nám několikrát stalo, že byla takovým testováním vyhodnocena jako lépe znějící ta simulace. Což někteří testeři i těžce nesou a nechtějí tomu věřit. Jíní to zase přijmou v pohodě, že to tak prostě je. :-) K tomu vývoji patří samozřejmě i tvorba uživatelského rozhraní, různé marketingové záležitosti apod. To by ale bylo zase na jiné povídání.

Produkty, o kterých se píše v tomto článku, najdete i v našem eshopu:
Líbí se Vám tento článek? Pošlete ho dál!
Přečtěte si také další související články:

Komentáře