Zvukový editor a syntezátor DIPLOMOVÁ PRÁCE
Bc. Luděk Stoklasa
Brno 2008
Prohlášení: Prohlašuji, že tato diplomová práce je mým původním autorským dílem, které jsem vypracoval samostatně. Všechny zdroje, prameny a literaturu, které jsem při vypracování používal nebo ze kterých jsem čerpal, v práci řádně cituji s uvedením úplného odkazu na příslušný zdroj.
V Brně dne 16. dubna 2008
............................................ Luděk Stoklasa
2
Poděkování: Za cenné rady a připomínky k této diplomové práci bych rád poděkoval vedoucímu práce MgA. Rudolfu Růžičkovi, dále bych rád poděkoval vývojovému týmu švédské firmy Propellerhead, která uveřejnila na trhu program Reason, jenž byl z části zdrojem mé inspirace k vývoji této práce, a také všem autorům uvedené literatury, ze které jsem čerpal.
3
Shrnutí: Cílem této práce je realizace programového celku sloužícího zejména pro syntézu, úpravu a editaci zvuků na počítači, tedy hudebního software s jeho následným popisem, dokumentací a demonstrací na příkladu. Důraz je kladen také na nadstandardní a inovační prvky, jakými jsou fraktální či granulární syntéza s netradičním spojením sampleru (zařízením pro úpravu již existujícího zvuku) a syntezátoru (zařízením pro tvorbu zvuku) spolu s efektovými jednotkami. Možností tohoto software je pak tvorba velice široké škály nejrůznějších zvuků. V textu této práce autor popisuje programovou část, teorii, historii, použité postupy, vlastní přínos a odkazuje na možnosti použití a také na zvukové ukázky.
4
Klíčová slova: Sampler, syntezátor, efektová jednotka, frekvenční filtr, echo jednotka, vzorek, tvar vlny, frekvence, amplitudová modulace, frekvenční modulace, šum, oscilátor, posunutí, intenzita, obálka, fraktální syntéza, granulární syntéza.
5
Obsah 1 Úvod.................................................................................................................... 7 1.1 Historie zvukové teorie a tvorby zvuku na počítači.............................. 8 2 Popis programu...................................................................................................12 2.1 Vývojové prostředí, nástroje................................................................. 12 2.2 Popis zařízení v programu................................................................... 13 2.2.1 Struktura zařízení v programu............................................... 13 2.2.2 Sampler................................................................................. 14 2.2.3 Syntezátor..............................................................................16 2.2.3.1 Popis typů a tvarů oscilačních vln (waveforms)...... 18 2.2.3.2 Frekvence, fázový posun a hlasitost oscilátoru.......24 2.2.3.3 Generátor obálky.....................................................24 2.2.3.4 Typy oscilátorů a jejich použití, modulace...............26 2.2.3.5 Fraktální oscilace a syntéza.................................... 28 2.2.3.6 Tabulka parametrů syntezátoru.............................. 34 2.2.4 Delay efektová jednotka........................................................ 37 2.2.5 Frekvenční filtr....................................................................... 38 2.3 Nabídky na hlavní liště......................................................................... 40 2.4 Požadavky programu na hardware...................................................... 43 3 Příklad použití..................................................................................................... 44 3.1 Ptáci..................................................................................................... 44 3.2 Buben................................................................................................... 46 3.3 Použití modulace.................................................................................. 47 3.4 Parní lokomotiva...................................................................................51 3.5 Zvuková ukázka................................................................................... 53 4 Závěr................................................................................................................... 54
Literatura................................................................................................................ 55 Mapa přiloženého CD............................................................................................ 57 Přílohy - ukázky částí zdrojového kódu................................................................. 58
6
1 Úvod Když se podíváme na dnešní dobu, zjistíme, že je dobou nutně spjatou s počítači. Počítače pronikají doslova všude. Počítačem můžeme nakoupit akcie, řídit průmysl, provádět platbu, zapsat si předmět, vytvořit film, komponovat hudbu, napsat scénář či diplomovou práci. Nemohu se zbavit pocitu, že lidé se čím dál více separují do dvou gigantických skupin. Ti, kteří pracují u počítače, a ti, kteří pracují manuálně. Počítač opravdu mnohdy usnadňuje rutinní práci a umožňuje pracovat tvořivěji. Je zajímavé poslouchat scénáristy filmů, jak tvrdí, že si v době, kdy nebyly počítače, museli za svým scénářem stát, protože než by scénář měli celý ručně přepisovat, to by raději napsali nový. Podobně na tom byl vědec, který dopsal 200 stránkovou kandidátskou práci a dozvěděl se, že by práci měl ještě upravit. Dnes by mu podobná úprava textu v počítači zabrala nesrovnatelně méně času. A podobně je tomu dnes i s nahráváním a úpravou zvuků. Když například při nahrávání skladby kytarista chyboval, musel celou stopu na magnetickou pásku natočit znovu. Dnes již nahrává do počítače s mnohem většími možnostmi střihu a úprav nahrané stopy. Počítač dnes umožňuje se zvukem pracovat úplně jiným způsobem, než jak tomu bylo v minulosti, a vnáší do tvorby a úpravy zvuků na počítači zcela nové možnosti. A proto si nejprve v první kapitole řekneme něco málo o historii tvorby zvuků na počítači, ve druhé přistoupíme k motivaci pro vznik programu (zvukového editoru a syntezátoru), k jeho popisu, vysvětlení jak pracuje a na jakých základech je postaven. Třetí kapitola pak bude věnována demonstraci na praktických příkladech a čtvrtou kapitolou bude závěr.
7
1.1 Historie zvukové teorie a tvorby zvuku na počítači Počátky zvukové teorie se datují již před mnoha staletími do doby řeckého impéria a řeckých filozofů, myslitelů a prvních matematiků, jakým byl třeba Pythagoras, který se mimo jiné významným způsobem podílel na vzniku hudební teorie a teorie ladění, stanovil Pythagorovo ladění (viz.[11]). Avšak prvním významným objevem z hlediska teorie zvuku byla vlnová teorie, tedy fakt, že zvuk je tvořen pohybem vln spíše než pohybem částic. S touto teorii přišel poprvé v počátcích 17. století Leonardo Da Vinci (viz. [5]). Byl výjimečným myslitelem v počátcích období renesance. Učil se od řeckých vědců a matematiků a použil toho jako silný základ pro mnoho jeho nových objevů. Nejenom že byl matematikem, vědcem a proslulým umělcem, byl také muzikantem a hudbu miloval. Bohužel ne mnoho z jeho hudebního života je známo, ale jeho vrstevníci jako Luca Pacioli, Paolo Giovio, Benvenuto Cellini a další ho velebili jako prvotřídního hudebníka. Nikdy neinterpretoval žádnou známou skladbu, bylo to zřejmě kvůli faktu, že byl spíše improvizátor, a proto nikdy skutečně nenapsal nic na papír. Je známo, že byl učitelem hudby a věnoval se akustice. V rámci zkoumání akustiky podnikal mnoho experimentů. Nejvýznačnější z jeho experimentů spekuloval o vlnové povaze zvuku. Demonstroval tuto vlnovou teorii vhozením 2 kamenů do rybníku. Oba kameny kolem sebe vytvářely kruhové vlny, které se postupně utlumovaly, až se zcela rozptýlily. Uvedl, že akce těchto kamenů ve vodě by mohla být velmi podobná tomu, co dělá zvuk ve vzduchu. Významné zjištění tohoto experimentu bylo, že vlny protějších kamenů křižující své cesty, procházejí jedna druhou bez zastavení. Srovnal tuto akci s běžnými zvukovými jevy, kdy posluchač slyší zvuk ze dvou zdrojů zároveň bez nějakého zkreslení. Také si uvědomil přímé spojení mezi zvukem a světlem a uvedl, že pozorovatel může pozorovat světlo z více než jednoho zdroje najednou, aniž by světlo z jednoho zdroje nějak blokovalo světlo přicházející z druhého zdroje nebo ho nějak poničilo. Přisuzoval tuto povahu zvuku a světla právě vlnám. Kdyby to byly jen částice, určitě by navzájem kolidovaly. Uvedl také, že částice se nepohybovaly společně s produkovanými vlnami, ale spíše si jen předávaly energii, na základě které se vlny šířily. Tyto postřehy mu postačily k přesvědčení, že zvuk musí být složen z vln.
8
Slavný vědec a astronom Galileo Gallilei navázal na Leonardův výzkum. V roce 1638 Galileo provedl experiment, ve kterém vzal sklenici vody a třel její okraj, aby vyprodukoval tón. Pozoroval, že produkovaný tón vytvořil malinké vlnky, které se vyskytovaly ve vodě. Všechny vycházely z místa, ve kterém se utvářel zvuk, jak Galileo předpokládal. Galileo použil tento experiment k dalším spekulacím a k prověření teorie Leonarda Da Vinci, že zvuk putuje ve vlnách. Tato vlnová teorie zvuku byla velice významná pro další výzkum a osvětlila cestu pro mnoho dalších kroků v teorii zvuku. Marsenne, Boyle, Newton a další následovali Galilea v této teorii během 17. století a ta se stala známou jako vlnová teorie. Současník Galilea byl nizozemský vědec Isaac Beeckman (viz. [5]). Některá z Beeckmanových zjištění jsou notoricky známé případy, které jsou nyní považovány za samozřejmé, ale které tehdy potřebovaly být stanoveny formálně. Například pomocí mnoha experimentů Beeckman vyzkoumal, že zvuk je vytvářen vibrováním objektů. Zajímavostí bylo, že Beeckman také provedl experiment identický tomu, který provedl Galileo v roce 1638, rok po Beeckmanově smrti. Tedy taktéž ukázal, že třením okraje sklenice s vodou vznikají malé vlnky na vodní hladině. Beeckman také usuzoval, že velikost těchto vlnek vody určuje frekvenci tónu (intonaci). Čím větší byly vlnky, tím nižší byl tón. Isac Beeckman je také považován za toho, kdo poprvé uvedl koncepci granulární metody ve zvukové analýze ve svém článku Kvantifikující hudba, viz. [5,11]. Tento dokument pojednává o uspořádání hudby
do jakýchsi
“zvukových částí”. K tomuto se ale ještě dostaneme později v sekci 2.2.3, při popisu granulární syntézy. Až do počátku 20. století lidé vytvářeli zvuky v podstatě tak, jak popsal Beeckman, tedy vibrováním objektů. A na akustické úrovni (při reprodukci zvuku) je tak tomu dodnes. Buď se chvějí ozvučnice jednotlivých nástrojů, nebo třeba blány reproduktorů. V tomto okamžiku bych již ale rád přistoupil k historii tvorby zvuku na počítači, se kterou je má práce spjata.
9
Koncem padesátých let 20. století začala být aktuální myšlenka syntézy zvuku pomocí počítače (viz. [4]). Teorie analogových syntezátorů byla rozpracována ve třicátých letech a v polovině padesátých let zdokonalena H.F.Olsonem, který postavil v Princetonu pětikanálový syntezátor řízený (úměrně širokou) děrnou páskou. Vrchol analogových syntezátorů však přišel až v 50. letech, kdy R. Moog sestrojil napěťově řízený filtr (VCF) přeladitelný přes několik oktáv. Max Mathews v Bellových laboratořích přišel na myšlenku, aby data, která počítač zapisuje na magnetickou pásku, reprodukoval pomocí D/A (Digitálně analogového) převodníku. Protože rychlost i kapacita počítačů na přelomu padesátých a šedesátých let byla malá, naprogramoval kompilátor, který kompiloval informace na děrných štítcích, jež v podstatě představovaly partituru, na magnetickou pásku do podoby zvukové nahrávky. K tomu samozřejmě potřeboval definice, jak jsou „nástroje“ sestaveny a jisté vzorky signálů, které nástroje budou hrát. Pro definice toho,
jak jsou „nástroje“
sestaveny, vytvořil zvláštní jazyk na úrovni assembleru. Tento jazyk zdokonaloval až do podoby MUSIC V (1963), jež se používá v rozšířené formě jako Csound dodnes. Akustické signály mají jednu zvláštnost. Spektrum se relativně pomalu mění s časem. To umožňuje použít například okénkovanou Fourierovu transformaci pro analýzu (a resyntézu) zvuku (viz.[15]) a také třeba provádět změnu intonace (Pitchshifting). Je to veskrze příjemná vlastnost, která může uspořit drahocenný počítačový čas. V principu počítačem ovládáme přes D/A převodník klasický
analogový
syntezátor (Voltage Controlled Oscillator – VC Amplifier – VC Filter). Pokud máme jednotek více, jsme schopni syntetizovat polyfonní zvuk. S touto myšlenkou přišel v 50. letech Lejaren Hiller na universitě v Illinois. Systém se nazýval Illiac. Počítač řídil relativně pomalu klasický syntezátor a podařilo se vytvářet hudbu v reálném čase. Pro malé nároky na výpočetní výkon se uvedené syntézy začalo užívat v televizních hrách (SAA 1099 (1984) –2 x 3kan. ) a pro efekty v počítačových hrách (OPL3) a to i dnes!
10
Slangově se tato metoda nazývá FM syntéza (řízení kmitočtu oscilátoru je v podstatě ekvivalentní
kmitočtové modulaci). Pro vážnější tvorbu je možné této
metody použít k syntéze např. Hammondových varhan. Pro připomínku bylo i u nás v 60. letech ve Výzkumném ústavu rozhlasu a televize v Praze podobné zařízení postaveno. Jenom analogová část zabrala dva stojany. Je zde ještě jedna možnost syntézy zvuku, jíž doposud nebyla věnována velká pozornost. Jde o použití digitálních filtrů s jednotkovým přenosem ve zpětnovazební smyčce. Filtry druhého řádu můžeme generovat harmonické kmity s exponenciální změnou amplitudy. Pomocí filtrů vyšších řádů můžeme generovat složené kmity, například řeč. Takto generovaný zvuk je subjektivně velmi dobře hodnocen, existují i multiprocesorové systémy na bázi DSP, které dokáží syntézu v reálném čase (viz. [4]). Dnes je již situace poněkud jiná. Počítače mají takový výkon, že samotná syntéza (a to pohodlně na digitální úrovni) bez použití jakýchkoli externích zařízení není ani při 32-bitové kvalitě nikterak velkým problémem. Jednoduše máme k dispozici univerzální hardware (počítač) a my si „hrajeme“ s čísly, která pak posíláme na zvukovou kartu. Každé takovéto číslo pak představuje velikosti amplitudy v daném čase. Například při přehrávání hudebního CD je takových čísel posláno do D/A převodníku 44100 za sekundu a každé toto číslo muže nabýt 65536 (216) hodnot, protože je reprezentováno 16 bity. A proto dnes různých programů, editorů a plug-inů pro úpravu a syntézu zvuku existuje nespočet. Není v mých silách vyjmenovat všechny subjekty, zabývající se tvorbou tohoto typu software, jako jsou např. Steinberg, Propellerhead, Native Instruments, Waves, Ircam, IK Multimedia, Sonic Foundry, Arturia a mnoho dalších.
11
2 Popis programu Jak již jsem psal v kapitole 1.1, na trhu je dnes spousta programů a nejrůznějších editorů a VST plug-inů pro tvorbu a úpravu zvuků na počítači. Poznámka: Vitual Studio Technology (VST) je standard rozhraní pro propojování audio syntetizérů a efektových plug-inů do audio editorů a hard-disk recording systémů a také dává plug-inům grafické uživatelské rozhraní (GUI) pro snadnou manipulaci. Protože kompozice hudby na počítači a používání těchto aplikací je má záliba, rozhodl jsem se, že bych se do této problematiky také velice rád zapojil a zhotovil zvukový editor, který je jedinečný svou možností jak na sebe nejrůzněji navázat a aplikovat jednotlivé funkce úpravy zvuků a vytvářet tak ojedinělé zvukové úryvky.
2.1 Vývojové prostředí a nástroje K tvorbě programu jsem zvolil programovací jazyk Borland Delphi 7, protože umožňuje definovat moderní grafické uživatelské rozhraní. Programoval jsem na platformě
MS Windows XP. Program je složen z různých virtuálních zařízení
(popsaných v kapitole 2.2), obvykle používaných pro tvorbu a úpravu zvuků (sampler, syntezátor, frekvenční filtr atd.).
12
2.2 Popis zařízení v programu 2.2.1 Struktura zařízení v programu Program můžeme v podstatě chápat jako virtuální skříň, ve které máme jednotlivé přístroje pro práci se zvukem. V konkrétním programu se tedy jedná o tato zařízení: sampler, syntezátor, efektová jednotka delay a frekvenční filtr. Zařízení jsou vzájemně propojena v pořadí sampler, syntezátor s efektovou jednotkou delay, frekvenční filtr (viz. obrázek 2.1). Přičemž sampler a filtr můžeme mít jen jeden, kdežto syntezátorů s delay jednotkou můžeme zapojit do série hned několik, a to konkrétně maximálně sedm.
Obrázek 2.1: Propojení jednotlivých zařízení
Zvuk tedy putuje přesně tak, jak je znázorněno černými šipkami na obrázku 2.1. Nyní přikročme k popisu jednotlivých zařízení, pro pochopení toho jak pracují a jak je můžeme ovládat.
13
2.2.2 Sampler Sampler je zařízení sloužící pro úpravu zvuku. A to takové, že se neobejde, jak již z názvu vyplývá, bez nějakého zvukového vzorku. Vzorek většinou dostáváme do sampleru ve formě audio formátu nebo souborů s příponou wav, jak je tomu v našem případě. S tímto vzorkem dále pracujeme a upravujeme ho. K tomu ale náš sampler neslouží, ten se stará pouze o náš vzorek, jeho délku, frekvenci a hlasitost. Ve spojení se syntezátorem však můžeme vzorek nejrůzněji opracovávat a upravovat. Rovněž umožňuje načíst a uložit vzorek na disk a to pomocí nabídky File na horní liště a zvolení Open/Save wave.
Obrázek 2.2: Sampler
Délku vzorku můžeme měnit v boxu Length (délka je v Bytech), hlasitost vzorku měníme v dráze Volume, frekvenci v boxu Freq. (v hertzech). Vzorek přehrajeme tlačítkem umístěným pod těmito boxy. A rozhodnout o tom, zda vzorek bude obsažen ve výsledném zvuku a bude tak vstupovat do syntezátorů, můžeme tlačítkem Wave v levém horním rohu (viz. obrázek 2.2).
14
Parametr
Popis
Length
Určuje délku a tedy dobu trvání výsledného zvuku v Bytech.
Freq.
Určuje frekvenci vzorku v Hertzech.
Wave
Tlačítko určuje, zda vzorek bude obsažen ve výsledném zvuku. Je-li tlačítko vypnuté, dochází tak ke stejnému efektu, jako by bylo zapnuté a my nastavili Volume na nulu.
Volume
Určuje hlasitost vzorku, který máme v paměti sampleru, a tedy i to, jakým způsobem se bude podílet na celkovém výsledném zvuku.
15
2.2.3 Syntezátor Dá se říci, že syntezátor je nejsložitějším zařízením v našem programu. Odměnou za to je, že zde máme také nejširší škálu možností, jak se zvukem pracovat a vytvářet ho. Každý syntezátor sestává z oscilátoru, a to v drtivé většině případů hned z několika. Oscilátor vytváří nějaký pravidelně se opakující vzorek (vlnu), kterou následným modulováním a upravováním můžeme opracovat až ke kýženému zvuku. Rozdíl mezi syntezátorem a samplerem je tedy ten, že v syntezátoru můžeme zvuk nejen upravovat, ale také jej přímo vytvářet, a to bez použití vzorku, protože ten nám právě generují oscilátory. Pomocí základních oscilátorů je možno vytvořit, více či méně složitěji, jakýkoli zvuk.
Obrázek 2.3: Syntezátor
My máme k dispozici čtyři oscilátory. Dva na tvorbu samostatné vlny (vzorku) a další dva na její modulaci. Dále bych rád podotkl, že syntezátorů můžeme použít několik. Měnit můžeme v nabídce Synth na hlavní liště programu. U každého z oscilátorů daného syntezátoru můžeme nastavit patrně nejdůležitější věc a to tvar vlny, tedy periodickou funkci tvořící základní nosnou vlnu (viz. [9]) k dalšímu “opracování”.
Poznámka: Pokud by čtenář pochyboval o tvrzení, že pomocí základních oscilátorů je možno vytvořit, více či méně složitěji, jakýkoli zvuk, tak důkaz plyne z Fourierovy řady (viz.[15]), ta vypovídá o tom, že libovolnou spojitou, periodickou funkci lze aproximovat součtem konečného počtu funkcí sinus a kosinus. Protože v našem programu vytváříme zvuky, které se dají vyjádřit spojitou funkcí na konečném
16
intervalu, lze tedy použít toho, co tvrdí Fourierova řada, protože perioda bude v našem případě celý tento interval. V programu je k dispozici potenciálně nekonečný počet sinusových oscilátorů, které můžeme posouvat minimálně o jedu periodu, tedy tvrzení je pravdivé. Tohoto potenciálně nekonečného počtu sinusových oscilátorů dosáhneme tak, že vytvoříme najednou maximálně 14 sinusových vln (dva použitelné oscilátory na každém z celkového počtu 7 syntezátorů), tento výsledný zvuk pak exportujeme do wav souboru, znovu importujeme do sampleru a můžeme přidat dalších 14 sinusových vln. Opakováním tohoto procesu dosáhneme potenciálně nekonečného počtu (samozřejmě ovšem s ohledem na výkon počítače). Tvořit však zvuky za pomocí čistě sinusových oscilací je v praxi, zvláště pro některé typy zvuků, velmi náročné, až témeř nereálné. Proto přistupme k popisu dalších typů oscilačních vln, které nám vytvářejí přímo složené tóny a práci při tvorbě zvuků takto usnadňují.
17
2.2.3.1 Popis typů a tvarů oscilačních vln (waveforms)
Sine Sinusový vzorek je nejjednodušší možný a základní vzorek. Tvar vlny má klasický sinusový průběh, s žádnými harmonickými tóny. Sinusová vlna produkuje bezbarvý a „měkký“ zvuk.
Triangle Trojúhelníková
vlna
představuje
vzorek
vznikající
skládáním
všech
harmonických tónů – sudých i lichých, tedy superpozicí kmitů o kmitočtech f, 2f,3f,4f, 5f, ... a to tak, že amplitud harmonických kmitů ubývá s první mocninou pořadového čísla harmonického tónu (viz. [1]).
Sawtooth Tento „pilovitý“ výsledný vzorek vzniká skládáním základního sinusového tónu s lichými harmonickými tóny, amplitudy těchto harmonických tónů klesají s druhou mocninou pořadového čísla příslušného částkového tónu. Kromě toho 3., 7., 11., atd. harmonický tón je proti ostatním ve fázi posunut o π, tj. o půl periody (viz. [1]).
Square Obdélníkový vzorek obsahuje kromě základního tónu o frekvenci f všechny liché harmonické tóny s kmitočty 3f, 5f ,7f, ...., při čemž amplitudy těchto harmonických tónů ubývá lineárně s pořadovým číslem harmonického kmitu (viz. [1]).
18
Noise Šum je založen na „náhodném souzvuku náhodných zvuků“. Šumy se dělí na bílé a barevné. Zbavením bílého šumu některých frekvencí získáváme šumy barevné.
Generátor
v programu
generuje
klasický
šum
bílý
s plným
frekvenčním spektrem. Vytvořit z něj růžový však není složité. Stačí použít našeho frekvenčního filtru vestavěného v programu a snížit jeho frekvenční hladinu (dolní pásmovou propust), popř. jí modulovat hyperbolickým tvarem vlny nízkofrekvenčního oscilátoru (viz. 2.2.3.4 Typy oscilátorů a jejich použití, modulace). Vzniká takzvaný 1/f šum známý také jako šum růžový. Tedy odfiltrováním vysokých frekvencí bílého šumu získáme šum růžový. Přesněji hlasitost částkové frekvence f ve frekvenčním spektru růžového šumu je zastoupena koeficientem 1/f. Tedy čím vyšší je částková frekvence, tím menší má hlasitost.
Hyperbolic Hyperbolický tvar vlny je zde pro možnosti generování výše zmíněného růžového šumu, ale hlavně kvůli metodě neharmonického modelování zvukového spektra ve smyslu fraktální aditivní syntézy detailně popsané v [8,10]. Této syntézy se používá zejména pro modelování zvukového spektra zvuků jako je trubka, lesní roh, klarinet nebo nástroje perkusí (různé gongy, tympány nebo zvony). Takovéto zvuky jsou složeny ze dvou složek – deterministické a stochastické. Deterministická složka zvuku určuje intonaci a globální zabarvení tónu, je základní a stěžejní strukturou zvuku, ale použitím jí samotné by zvuk zněl moc “elektronicky”. Proto je zde stochastická část, která obsahuje šumové složky, mikrofluktuace, které zvuku dodávají “život”, a ten pak zní přirozeněji. A právě pseudoperiodický, 1/f hyperbolicky tvarovaný šum tvoří spektrální postranní pásmo, a tedy zmíněnou stochastickou část zvuku (viz. [8,10]). Pro účely vytváření této stochastické složky je proto potřebný hyperbolický tvar. Ten můžeme použít například u oscilátoru amplitudové modulace a modulovat jím šumový generátor a vytvářet stochastickou složku tak, jak je popsána v [8,10] s případným použitím frekvenčního filtru pro dosažení syntézy růžového šumu.
19
Hyperbolic + ESN (Energy scaled noise) Tento oscilátor přímo generuje jednu ze zmíněných stochastických složek zvuku popsaných u hyperbolického tvaru výše a detailně popsaných v [8].
Grain Tento vzorek nám umožní použití granulární syntézy. Granulární syntéza je inovativní přístup k reprezentaci a generování hudebních zvuků. Koncepce granulární metody ve zvukové analýze byla poprvé navržena již Isaakem Beekmanem, jak jsme zmínili v sekci 1.1. Isac Beeckman je považován za toho, kdo poprvé uvedl tuto koncepci ve svém článku Kvantifikující hudba, viz. [5,11]. Tento dokument pojednává o uspořádání hudby do jakýchsi “zvukových části”. Bohužel teorie granulární syntézy nebyla nadále zkoumána po docela dlouhou dobu. Britský fyzik Dennis Gabor, který mimo jiné dostal Nobelovu cenu v roce 1968 za vynález holografie (viz. [5]), podnítil nové zajímavosti v granulární syntéze okolo roku 1946 (viz. [5,11]). Gabor věřil, že jakýkoliv zvuk by mohl být syntetizován pomocí správné kombinace určitého počtu jednoduchých zvukových granulí (malých zrnek).
Granule (zrnko) je především příhodná a flexibilní reprezentace hudebního zvuku, protože kombinuje informace z časové domény (čas spuštění, trvání, tvar obálky, tvar vlny) s informacemi z frekvenční domény (frekvence vlnového vzorku na dané granuli). Předtím, než začaly být lehce dostupné možnosti záznamů na magnetickou pásku, jediným způsobem, jak se pokusit o granulární kompozici, bylo použití extrémně složité a sofistikované manipulace s velkým počtem akustických nástrojů. Magnetické záznamníky umožnily jednodušší práci s granulemi. Avšak tento namáhavý proces odstřihávání a slepování stovek segmentů pásky pro každou sekundu hudby byl zastrašující a časově náročný. Skutečné experimentování s granulární syntézou bylo
nesmírně namáhavé. V podstatě nebylo
proveditelné, dokud se neobjevila digitální syntéza, která umožnila progresivní
20
sestavování granulí. Granule (zrnko) je malá část zvukového vzorku (obsahující jakýkoliv tvar vlny) s typickým trváním několika málo milisekund. Souvislé ovládání těchto malých zvukových událostí, které jsou rozeznány jako jedna rozsáhlá zvuková masa, dává granulární syntéze její sílu a flexibilitu. Zatímco různé způsoby uspořádání granulí se od sebe velmi liší, vytváření granulí (zrnek) je obvykle relativně jednoduché. Základní zařízení generující tyto granule by se mělo skládat z oscilátoru, který generuje každou granuli a rozhoduje o jejím umístění v časové doméně, a z generátoru obálky (viz. 2.2.3.3), který upravuje amplitudu každé granule podle Gaussovy křivky (úzká, zvonově tvarovaná křivka - viz. obr. 2.3.1). Typické trvání granule je v intervalu od 5 do 100 milisekund. Když je např. trvání granule menší než 2 milisekundy, je zvuk posluchačem vnímán jako lupnutí.
Z hudebního hlediska nejdůležitějším aspektem každé granule je tvar její vlny. Zvuk reprezentován touto vlnou, může být jak syntetický, tak třeba samplovaný (např. zaznamenaný pomocí mikrofonu). Když se podíváme na program, tak napravo od vybraného “Grain” na oscilátoru se narozdíl od jiných typů oscilačních vln objeví žlutá ikonka, když na ni klikneme, tak můžeme importovat zmíněný tvar vlny pro danou granuli ve formátu wav. Jak již bylo zmíněno výše, každá granule je opracována generátorem obálky podle Gaussovy křivky, tato je v programu aproximována funkcí (sin(x) + 1) / 2 na intervalu od 3/2 π do 7/2 π . Viz obrázek 2.3.1, na kterém je zobrazena jednoduchá, syntetická granule nesoucí klasický sinusový tvar
vlny.
Poskládáním takovýchto granulí dostaneme původní sinusovou vlnu, jak je znázorněno na obrázku 2.3.2.
21
Obrázek 2.3.1: Příklad jednoduché, syntetické granule
Obrázek 2.3.2: Příklad reprodukce původního vzorku pomocí granulární syntézy
22
Async Grain Tento typ oscilátoru umožňuje pracovat s asynchronní granulární syntézou (viz. [5,11]). V podstatě pro ni platí vše, co bylo řečeno u popisu synchronní granulární syntézy popsané výše s tím rozdílem, že granulární struktura je zde určována náhodnostně ve smyslu následujících parametrů:
1. Čas začátku a doba trvání každé granule 2. Hustota granulí za sekundu 3. Prostorové rozložení jednotlivých granulí
V [5] a [11] je podobných parametrů, které jsou náhodnostně ovlivňovány, popsáno vícero, naše implementace se soustředí jen na tyto tři parametry a stačí to k tomu, abychom byli schopni vytvořit komplexní a zajímavé zvuky. Obecně asynchronní granulární syntéza tedy upouští od použtí specifických algoritmů pro rozhodnutí o umístění granule s ohledem na ladění, amplitudu, hustotu a délku jejich trvání. Tato dynamická povaha specifikace jednotlivých parametrů s použitím AGS může vést ke vzniku komplikovaného a nezvykle zajímavého zbarvení tónu.
23
2.2.3.2 Frekvence, fázový posun a hlasitost oscilátoru
Každý oscilátor vytváří vlnu o frekvenci, kterou si nastavíme v sekci Frequency (viz. obrázek 2.3). Frekvence zde není udána v hertzech, ale je to frekvence jednoho ze sedmi základních tónů (c-h), který je vyjádřen světle modrým písmenkem vpravo. Pro převod frekvence vyjádřené v hertzech do frekvence jednotlivých celých tónů se používá následující postup (viz.[9]). Všichni asi známe frekvenci „komorního” A, která je 440 Hz. Pokud chceme dostat frekvenci o půltón vyšší podle západní hudební stupnice (nejběžněji používaná a pro většinu lidí jediná známá), která používá rovnoměrně temperované ladění (viz.[12]), vynásobíme původní frekvenci číslem 21/12. Je tomu tak proto, že v oktávě máme 12 půltónů, podle temperovaného ladění rovnoměrně rozložených, vynásobíme-li tedy frekvenci dvěma, dostáváme tón o oktávu vyšší (v oktávě je 12 půltónů, tedy násobíme (21/12)12 = 2). Dále potom v sekci Motion nastavujeme fázi (fázový posun) vlny a v sekci Volume pak její hladinu intenzity.
2.2.3.3 Generátor obálky
Pokud se podíváme ještě více vpravo, dostáváme se až k obálkám (viz. Envelope generators v [9]). Obálka nám hovoří o tom, jak bude náš zvuk probíhat. Zda bude pomalu nabíhat a pak se rychle utlumí či jinak. Tvarů (typů) obálek se utvořilo během času mnoho, avšak nejjednoduchší a stále nejoblíbenější a nejpoužívanější je ADSR obálka. “ADSR” je zkratka pro „Attack, Decay, Sustain, Release", čtyři segmenty výstupu generátoru obálky, tedy ta samotná se pak skládá ze čtyř nastavení Attack (náběh), Decay (útlum), Sustain (držení), Release (doběh). Obálka je v podstatě funkce, která nám vyjadřuje závislost intenzity oscilátoru (Volume) na čase. Attack vyjadřuje dobu, jak dlouho bude intenzita postupně (z nuly) stoupat, Decay jakou dobu bude klesat, než se dostane na hladinu Sustain (hodnota intenzity) a k Release dochází zpravidla po uvolnění klávesy (např. u piana) a je to opět doba, po kterou hladina intenzity klesá až k nule. Tato funkce je znázorněna na obrázku 2.4.
24
Obrázek 2.4: Průběh obálky
25
2.2.3.4 Typy oscilátorů a jejich použití, modulace
Je nutno také vysvětlit přesné rozdíly mezi jednotlivými oscilátory syntezátoru. Oscilátory Osc1 a Osc2 jsou shodné. Oba vytvářejí základní zvukovou vlnu a jejich parametr Volume tedy vyjadřuje hladinu intenzity zvuku. Další dva oscilátory (AM, FM) již však mají funkci odlišnou. Jedná se o amplitudovou a frekvenční modulaci a jak již z názvu vyplývá, tyto oscilátory pouze modulují předešlé dva. Tudíž se bez nich neobejdou, jinak bychom neslyšeli žádný zvuk, pokud by ovšem do syntezátoru nevstupoval vzorek ze sampleru. Oscilátory AM a FM tedy efektují zvuk a to takto. U amplitudové modulace (AM) tvar vlny (vzorek) vyjadřuje funkci závislosti hladiny intenzity zvuku na čase. U frekvenční modulace (FM) tvar vlny vyjadřuje funkci závislosti frekvence nějakého z oscilátorů Osc1, Osc2, AM na čase.
Dále je pro nás důležité pochopení funkcí mnoha tlačítek na syntezátoru. Ty nám právě umožňují „vykouzlit“ zajímavé zvuky. Pomocí těchto tlačítek můžeme oscilátory různě proplétat a vzájemně je modulovat. Tlačítka umístěná nejblíže názvům oscilátorů (viz. obrázek 2.5) zapínají a vypínají příslušné oscilátory. Pokud jsou všechna vypnuta, zvuk syntezátorem pouze prochází bez jakékoli změny a parametry nemají na výsledný zvuk žádný vliv.
Obrázek 2.5: Tlačítka na syntezátoru
Tlačítka umístěna nalevo v sekci s názvem Fm určují, zda čtvrtý oscilátor frekvenční modulace (FM) bude modulovat ostatní, příslušné oscilátory.
26
Obrázek 2.6: Tlačítka na syntezátoru
Tlačítka umístěna úplně vpravo syntezátoru (viz. obrázek 2.6) umožňují pracovat hlavně s LFO (low-frequency oscilator), tedy nízkofrekvenčním oscilátorem. U oscilátorů AM a FM se chová jednoduše tak, že jejich frekvence je mnohonásobně snížena. Takto můžeme dosáhnout úplně jiných efektů, co se tvorby zvuku týče. U oscilátorů Osc1 a Osc2 to tak jednoduché není. Jelikož snižování frekvence by zde nenabylo širšího smyslu, při zapnutí těchto tlačítek zde dochází k změně oscilátorů na modulační filtr frekvenční a resonanční oscilátory. Tedy Osc1 se mění na filtr Cutoff oscilátor, což znamená, že tvar vlny nám zde vyjadřuje funkci závislosti hladiny frekvence dolní pásmové propusti filtru (Cutoff) na čase. Osc2 se mění na filtr Resonance oscilátor, což znamená, že tvar vlny (vzorek) vyjadřuje funkci závislosti resonance filtru na čase. Oba jsou v nízkofrekvenčním módu.
27
2.2.3.5 Fraktální oscilace a syntéza
Slovo fraktál pochází z latinského slova fractus – rozbitý. Vymyslel ho matematik Benoît Mandelbrot v roce 1975 a definoval ho jako geometrický útvar, který lze rozdělit na části, přičemž tyto části jsou (alespoň přibližně) zmenšené kopie celého útvaru. Je to nekonečně členitý útvar. Přesná matematická definice pojmu fraktál dosud neexistuje. Asi dosud nejpřesnější definici fraktálu formuloval sám B.Mandelbrot: Fraktál je množina, jejíž Hausdorffova dimenze je větší než dimenze topologická. Ne všichni matematikové se však ztotožňují s touto definicí. Pro naše účely je však tato definice dostatečná. Zajímavé také je, že Hausdorffova dimenze byla známa dlouho před definováním pojmu fraktál, ale neměla žádné praktické využití. Co je to tedy ta Hausdorffova dimenze. Měřením délky geometricky hladké křivky, která má dimenzi 1, dostaneme při měření v různých měřítkách vždy stejné konečné číslo. Měřením délky ostrova se při zmenšování měřítka toto číslo stává nekonečně velkým. Záleží totiž na měřítku mapy, kterou k měření použijete. Při zmenšení měřítka vidíte i detaily pobřeží, které nebyly na mapě s větším měřítkem viditelné. Pobřeží můžete obejít i pěšky, potom bude naměřená hodnota délky pobřeží zase o něco větší, budete si totiž všímat už ne jenom zálivů, ale i jednotlivých kamenů, případně nerovností na kamenech atd. To znamená, že se zmenšením měřítka se délka obvodu neustále zvětšuje a blíží se k nekonečnu. Pobřeží tedy v rovině zabírá více místa než hladká křivka. Nezabírá však všechno místo (nevyplňuje celou rovinu). Jeho skutečná dimenze je tedy větší než dimenze křivky (ta je rovna jedné) a současně je menší než dimenze roviny (ta je rovna dvěma). Z toho vyplývá, že dimenze takového útvaru není celočíselná. Toto neceločíselné číslo se nazývá Hausdorffovou dimenzí. Hodnota Hausdorffovy dimenze udává, jakou rychlostí délka těchto útvarů (či odpovídající veličina při větším počtu rozměrů) roste do nekonečna. Jestliže se bude Hausdorffova dimenze a topologická dimenze lišit velmi málo, bude takový objekt málo členitý. Bude-li Hausdorffova dimenze ostře větší než dimenze topologická, bude objekt velmi členitý. Hausdorffova dimenze se někdy nazývá též fraktální dimenze.
28
Na následujících třech obrázcích jsou vidět příklady fraktálních obrazců (2-3 iterace):
Obrázek 2.7: Van Kochova vločka
Obrázek 2.8: Sierpinského trojúhelník
Obrázek 2.9: Sierpinského koberec
29
Když se podíváme úplně na pravou stranu syntezátoru, tak si povšimneme sekce Fractal. Díky tomuto modulu můžeme používat fraktální oscilaci a syntézu v programu. Např. na obrázku 2.7 je vyobrazeno, jak zapnout aditivní fraktální syntézu u prvního oscilátoru a bi-sekvenční fraktální oscilaci u druhého oscilátoru. Co tyto pojmy znamenají, si nyní vysvětlíme.
Obrázek 2.7: Fraktální modul syntezátoru
Fraktální syntéza
Asi nejběžněji používanou fraktální syntézou je fraktální aditivní syntéza, je to dokonce velice přirozená syntéza, protože se dá v zásadě říci, že nedělá nic moc jiného, než že přidává vyšší harmonické tóny. Zvuky vytvořené pomocí sinusového oscilátoru a s použitím fraktální aditivní syntézy mohou připomínat např. zvuk varhan nebo zvonků. Tato syntéza funguje tak, že k základnímu tónu (ne nutně sinusovému, tedy i složenému tónu) přidává s každou iterací tóny získané zdvojnásobením (obecně n-násobením) frekvence předchozího tónu a se zmenšenou amplitudou.
Formálně zapsáno (v jazyce Pascal) tato rekurzivní funkce vypadá přibližně takto: function FxFractalAdd( iter: integer; t: real): real; var AmplitudeCoef, FrqCoef : real; begin inc( iter); // inkrementace iterace o 1 AmplitudeCoef := (1/iter); FrqCoef := power( 2, iter-1); // mocnění 2 na iter-1 result := FxSimple( FrqCoef * t) * AmplitudeCoef; if not ( iter > MAX_FRACTAL_ITER) then result := result + FxFractalAdd( iter); end;
30
Proměnná t vyjadřuje časový okamžik, funkce FxSimple odpovídá vybranému typu oscilátoru. Například pro sinusovéhý oscilátor je to funkce sinus, návratovou hodnotou této funkce je velikost amplitudy v čase t. Proměnná iter určuje hodnotu iterace (kolikátou iteraci provádíme), konstanta C_MAX_FRACTAL_ITER pak určuje maximální počet iterací. Jak lze ze zápisu vypozorovat, amplitudy ubyvá s každou iterací (dle funkce 1/iter), tedy hodnoty amplitudy jsou v druhé iteraci dvákrát menší, v třetí třiktát, atd.
Další možností, jak využít fraktály při tvorbě zvuků, je použití některé fraktální oscilace. K dispozici máme dvě: bi-sekvenční a tri-sekvenční. Obě jsou vymyšleny autorem této diplomové práce a největší využití najdou asi při spojení s modulačními funkcemi v nízkofrekvenčním módu (viz. kapitola 3.3 Použití modulace). Popišme si tedy, jak vypadají a jak pracují.
Tri-sekvenční fraktální oscilace
Jak tato oscilace pracuje, je vyobrazeno na obrázku 2.8, kde je pro názornost požit jednoduchý základní sinusový tón a na něm je tato oscilace demonstrována. Tento tón má základní nosnou frekvenci f, čemuž odpovídá na obrázku vlnová délka x. Tedy x = 1/f. Jak je ovšem z obrázku patrné, tento tón je v průběhu (v pravidelných intervalech) nahrazován tóny s třikrát vyšší frekvenci a menší amplitudou a to tak, že jenom v druhé třetině právě iterovaného intervalu je ponechán tón s třikrát vyšší frekvencí původního tónu, v první a třetí třetině intervalu se iterační proces opakuje.
Obrázek 2.8: Tri-sekvenční fraktální oscilace
31
Formálně zapsáno (v jazyce Pascal) tato rekurzivní funkce vypadá přibližně takto: function FxFractal3Seq( iter: integer; len: real; t: real): real; begin while t > len do t := t - len; inc( iter); if ((t< len/3) or (t> 2*len/3)) and not ( iter > C_MAX_FRACTAL_ITER) then result := FxFractal3Seq ( iter, len/3, t) else result := FxSimple( power( 3, iter-1) * t) * (1/iter); end;
Proměnná t zde opět vyjadřuje časový okamžik, funkce FxSimple odpovídá vybranému typu oscilátoru. Například pro sinusový oscilátor je FxSimple funkcí sinus, návratovou hodnotou této funkce je velikost amplitudy v čase t. Proměnná len vyjadřuje délku periody. Proměnná iter určuje hodnotu iterace (kolikátou iteraci provádíme), konstanta C_MAX_FRACTAL_ITER pak určuje maximální počet iterací. Dále jsou zde použity standardní funkce jazyka Pascal. Funkce power(x,y) vrací hodnotu x umocněnou na y, tedy xy. Funkce inc(x) inkrementuje svůj argument o jedničku. Jak je z formálního zápisu funkce FxFractal3Seq vidět, amplitudy ubyvá s každou iterací (dle funkce 1/iter), tedy hodnoty amplitud jsou v druhé iteraci dvákrát menší, v třetí třiktát, atd.
Bi-sekvenční fraktální oscilace
Tato oscilace je v zásadě podobná Tri-sekvenční fraktální oscilaci. Proč se však jmenuje bi-sekvenční, za chvíli pochopíme. Na obrázku 2.9 je znázorněno, jak tato oscilace funguje. Opět pro názornost použijeme jednoduchý základní sinusový tón. Tento tón má základní nosnou frekvenci f, čemuž odpovídá vlnová délka x. Tedy x = 1/f. Jak lze ovšem na obrázku 2.9 pozorovat, tón je v průběhu (v pravidelných intervalech) nahrazován tóny s dvakrát vyšší frekvenci a také zmenšenou amplitudou a to tak, že jenom v druhé polovině iterovaného intervalu je ponechán tón s dvakrát vyšší frekvencí původního tónu, v první polovině intervalu se iterační proces opakuje.
32
Obrázek 2.9: Bi-sekvenční fraktální oscilace
Formálně zapsáno (v jazyce Pascal) tato rekurzivní funkce vypadá přibližně takto: function FxFractal2Seq( iter: integer; len: real; t: real): real; begin while t > len do t := t - len; inc( iter); if ( t < len/2) and not ( iter > C_MAX_FRACTAL_ITER) then result := FxFractal2Seq( iter, len/2, t) else result := FxSimple( power( 2, iter-1) * t) * (1/iter); end;
V zápisu jsou použity shodné proměnné a funkce jako u tri-sekvenční fraktální oscilace popsané o stránku výše.
33
2.2.3.6 Tabulka parametrů syntezátoru
Parametr
Popis
Osc1
První z oscilátorů. Vytváří základní, slyšitelnou zvukovou vlnu. Tlačítko blízko nápisu Osc1 nalevo určuje, zda je oscilátor zapnutý (tlačítko žlutě vysvíceno) nebo vypnutý.
Osc2
Druhý z oscilátorů. Vytváří rovněž (jako Osc1) základní, slyšitelnou zvukovou vlnu. Tlačítko blízko nápisu Osc2 nalevo určuje, zda je oscilátor zapnutý (tlačítko žlutě vysvíceno) či vypnutý.
AM
Oscilátor amplitudové modulace (AM). Oscilátor moduluje zvuk tak, že tvar vlny (vzorek) oscilátoru AM vyjadřuje funkci závislosti hladiny intenzity zvuku na čase. Tlačítko blízko nápisu AM nalevo určuje, zda je tento oscilátor zapnutý (tlačítko žlutě vysvíceno) nebo vypnutý.
FM
Oscilátor frekvenční modulace (FM). U frekvenční modulace (FM) oscilátor moduluje zvuk tak, že
tvar vlny (vzorek) oscilátoru FM
vyjadřuje funkci závislosti frekvence nějakého z oscilátorů Osc1, Osc2, AM na čase. Tlačítko blízko nápisu FM nalevo určuje, zda je tento oscilátor zapnutý (tlačítko žlutě vysvíceno) nebo vypnutý. Fm
V této sekci můžeme rozhodnout, u kterého z oscilátorů Osc1, Osc2, AM
chceme, aby jeho frekvenci moduloval frekvenční oscilátor FM.
Tohoto docílíme zapnutím příslušného tlačítka, tedy jeho žlutým vysvícením. Waveform
Zde vybíráme tvar vlny.
Frequency
Ovládá frekvenci oscilátorů. Frekvence zde není vyjádřena v hertzech, ale je identická s frekvencí celého tónu, který je vysvícen světle modrým písmenkem napravo.
34
Motion
Ovládá fázi (posunutí) příslušného z oscilátorů.
Volume
Ovládá hladinu intenzity oscilátorů. V případě oscilátorů Osc1 a Osc2 se jedná o hladinu intenzity zvuku, tedy hlasitost. U oscilátorů AM a FM se jedná o intenzitu s jakou se podílejí na modulaci zvuku.
Attack
Ovládá náběh, tedy vyjadřuje dobu, jak dlouho bude intenzita postupně (z nuly) stoupat. Nastavit jej můžeme v rozmezí 0 až 100.
Decay
Ovládá prvotní pokles intenzity oscilátoru, tedy dobu po kterou bude klesat, než se dostane na hladinu Sustain (hodnota intenzity). Nastavit jej můžeme v rozmezí 0 až 100.
Sustain
Vyjadřuje hladinu intenzity oscilátoru po dokončení doby poklesu (Decay) a před začátkem doby uvolnění (Release). Nastavit jej můžeme v rozmezí 0 až 100.
Release
K Release dochází zpravidla po uvolnění klávesy (např. u piana) a je to doba, po kterou hladina intenzity klesá z hodnoty Sustain až k nule. Nastavit jej můžeme v rozmezí 0 až 100.
cut
Při zapnutí tohoto tlačítka (jeho žlutém vysvícení) dochází ke změně oscilátoru na modulační filtr frekvenční oscilátor. Tedy Osc1 se mění na filtr Cutoff oscilátor, což znamená, že tvar vlny nám zde vyjadřuje funkci závislosti frekvence dolní pásmové propusti filtru na čase. Oscilátor je v nízkofrekvenčním módu.
res
Při zapnutí tohoto tlačítka (jeho žlutém vysvícení) dochází ke změně oscilátoru na modulační filtr resonanční oscilátor. Tedy Osc2 se mění na filtr Resonance oscilátor, což znamená, že tvar vlny (vzorek) nám zde vyjadřuje funkci závislosti resonance filtru na čase. Oscilátor je v nízkofrekvenčním módu.
am
Je-li tlačítko zapnuto (žlutě vysvíceno), dochází u oscilátorů AM k mnohonásobnému snížení jeho frekvence a stává se tak z něj nízkofrekvenční oscilátor amplitudové modulace.
35
fm
Je-li tlačítko zapnuto (žlutě vysvíceno) dochází u oscilátorů FM k mnohonásobnému snížení jeho frekvence a stává se takto z něj nízkofrekvenční oscilátor frekvenční modulace.
fractal
Zapnutím tohoto tlačítka u příslušného oscilátoru zapneme fraktální syntézu popř. oscilaci pro příslušný oscilátor. Typ fraktální oscilace nebo syntézy můžeme zvolit v boxu napravo od tohoto tlačítka. Vidíme, že k dispozici máme tři typy ( aditivní, tri-sekvenční, bi-sekvenční), tak jak jsou popsány v předchozí kapitole.
36
2.2.4 Delay jednotka Delay jednotka - jinak řečeno echo efektová jednotka (laicky ozvěna). Zvuk, který do Delay vstupuje, se vrací zpět v pravidelných intervalech, vyjádřených parametrem Time, se sníženou hladinou intenzity zvuku, vyjádřenou parametrem Feedback.
Obrázek 2.7: Delay efektová jednotka
Parametr
Popis
Time
Časový interval (doba), v jakém se vrací původní zvuk, u kterého je však
snížena jeho hladina intenzity v závislosti na parametru
Feedback. Feedb.
Feedback vyjadřuje poměr hladin intenzity zvuku dry (tedy prvotního nezefektovaného signálu) ku wet (efektovanému signálu se sníženou hladinou intenzity zvuku). Tedy čím větší je tato hodnota, tím menší je útlum zvukové intenzity.
Delay
Tlačítko nalevo od tohoto nápisu určuje, zda je Delay efekt zapnutý či vypnutý, tedy zda zvuk jednotkou jen prochází, nebo je skutečně efektován.
37
2.2.5 Frekvenční filtr Frekvenční filtr je další efektovou jednotkou, kterou můžeme v našem programu směle využívat. Náš filtr patří do skupiny low pass filtrů, tedy nízko pásmových filtrů. Podstata spočívá v tom, že nízko pásmový filtr zbavuje zvuk vysokých frekvencí (ořezává je), na rozdíl od high pass (vysoko pásmového) filtru, který ořezává naopak nízké frekvence. Low pass je mnohem více užívaný, a proto je do tohoto programu zařazen právě tento. O tom, zda ořežeme vysoké frekvence a v jaké míře, rozhoduje parametr Cutoff (hladina dolní pásmové propusti). Je-li Cutoff nastaven na maximum, nedochází k žádnému ořezávání a čím níže je nastaven, tím více slyšíme jen nízké frekvence. Cutoff nám tedy určuje frekvenční hranici - jaké frekvence ještě uslyšíme a naopak, jaké už ne. Frekvence nad touto hranicí slyšitelné nejsou. Parametr Resonance slouží k tomu, aby zdůraznil frekvence blízko této frekvenční hranice.
Obrázek 2.8: Frekvenční filtr
38
Parametr
Popis
Cutoff
Určuje frekvenční hranici - jaké zvukové frekvence ještě uslyšíme a jaké už ne. Frekvence nad touto hranicí slyšitelné nejsou. Jedná se tedy o dolní pásmovou propust. Je-li Cutoff nastaven na maximum, nedochází k žádnému ořezávání a slyšíme všechny frekvence.
Res
Resonance slouží k tomu, aby byly zdůrazněny frekvence blízko hranice, kterou určuje parametr Cutoff.
Filter
Tlačítko nalevo od tohoto nápisu určuje, zda je filtr zapnutý či vypnutý, tedy zda zvuk jednotkou jen prochází, nebo zda je skutečně efektován.
39
2.3 Nabídky na hlavní liště programu [File] Popis: Tato nabídka slouží pro práci se soubory a přednastaveními, které můžeme importovat či exportovat z programu.
Struktura:
[Open wave] -klávesová zkratka: Ctrl+O -funkce: Otevře dialog pro import souboru s příponou wav do samoletu.
[Save wave] -klávesová zkratka: Ctrl+S -funkce: Otevře dialog pro export souboru s příponou wav ze sampleru na disk počítače.
[Import preset] -klávesová zkratka: F3 -funkce: Otevře dialog pro import nastavení všech zařízení v programu (tlačítek atd.) ze souboru disku počítače s příponou ssb.
[Export preset] -klávesová zkratka: F2 -funkce: Otevře dialog pro uložení nastavení všech zařízení v programu do souboru s příponou ssb na disk počítače.
40
Poznámka: Soubor typu ssb je vlastní formát této aplikace (programu). Soubor obsahuje přesné informace o tom, jak jsou nastaveny všechny parametry v programu. Např. zdali je oscilátor zapnutý, na jakou hodnotu je nastavena jeho hlasitost, který soubor byl importován do sampleru atd. Tedy výhodou je, že uložený soubor je mnohem menší, než by byl soubor typu wav a navíc se při pozdějším otevření ssb souboru dá s původními parametry zvuku nadále pracovat a modifikovat je. Nevýhodou naopak je, že zvuk se takto nedá importovat do jiných programů, pokud tak chceme učinit, musíme exportovat do wav souboru, což je běžný formát, který podporuje snad každá hudební počítačová aplikace. Pro přirovnání z branže počítačové grafiky ssb soubor odpovídá uložení vektorového obrazu a wav soubor odpovídá uložení rastrového obrazu.
[Reset] -klávesová zkratka: Ctrl+R -funkce: Nastaví všechny zařízení v programu na původní hodnoty, které program vykazuje po spuštění.
[Exit program] -klávesová zkratka: Ctrl+X -funkce: Ukončí program.
41
[Synth] Popis: Tato nabídka slouží pro přepínání mezi jednotlivými syntezátory. Těchto můžeme najednou v programu používat až sedm. Každý syntezátor se pak skládá ze 4 oscilátorů, s kterými se dá různě pracovat (jak je popsáno v sekci 2.2.3).
[Language] Popis: Tato nabídka slouží pro přepínání mezi jazyky. Dostupné jazyky, do kterých je program lokalizován, jsou angličtina a čeština.
[Help] Popis: Tato nabídka nám řekne, jak program používat. Sdělí nám také informace o autorovi a o programu. Obsahuje manuál k programu.
Struktura:
[How to use] Tato nabídka otevře manuál programu, kde se můžeme dočíst jak program pracuje a jak ho používat.
[About] Tato nabídka slouží k podání informace o vzniku a o tvůrci programu.
42
2.4 Požadavky programu na hardware Minimální hardwarové požadavky jsou PC typu IBM, s procesorem 300 MHz, opatřený zvukovou kartou a vybavený operačním systémem MS Windows 98 až XP s minimálním rozlišením obrazovky monitoru 1024x768 pixelů.
43
3 Příklad použití 3.1 Ptáci Pro získání lepší představy o tom, jak program funguje, je možná nejlepší zvolit demonstraci na vybraném příkladu. Proto si tedy nyní ukážeme, jak na tvorbu zvuku v programu. V nabídce File, na hlavní liště programu, zvolme položku Open Wave a z adresáře, ve kterém je uložen celý program, zvolme soubor ptacci.wav, který byl mimochodem vytvořen rovněž pomocí tohoto programu (viz. obr. 3.1).
Obrázek 3.1: Načtení souboru s příponou wav
Nyní máme v sampleru „natažen“ soubor ptacci.wav reprezentující příslušný zvuk, což nám je dáno najevo tím, že se průběh tohoto zvuku ukáže na obrazovce (modrou křivkou) spolu s názvem souboru a cestou k němu (šedým písmem v levém horním rohu). Představme si, že bychom rádi k tomuto zvuku ptáčků přidali ještě zvuk šumu listí na stromě. Šum listí je šum, který se pokusíme vygenerovat šumovým generátorem. V sekci Synth zapněme první z oscilátorů Osc1 a v nabídce Waveform zvolme položku Noise, jak je znázorněno na obrázku 3.2.
44
Obrázek 3.2: Zapnutí prvního oscilátoru Osc1 a nastavení oscilátoru na šumový generátor
Když si přehrajeme výsledný zvuk, tak šum slyšíme, ale ne tak, jak bychom potřebovali. Zvuk je krátký, hlasitě zašumí a rychle skončí. A to je dáno nastavením obálky. Vypněme tlačítko Wave a podívejme se tedy na samotný šum. Vidíme, ale také slyšíme, že kroucením virtuálního potenciometru Decay se nám šum prodlužuje a zkracuje v závislosti na nastavení. Nastavme tudíž Decay na maximum (hodnota 100).
Obrázek 3.3: Zapnutí tlačítka Wave a nastavení Decay
Nyní již slyšíme, že šum pokrývá celou délku zvuku, ale je poněkud hlasitý. Zeslabíme ho tedy pomocí potenciometru Volume zhruba na úroveň naznačenou na obrázku 3.4. Zapneme tlačítko Wave a přehrajeme výsledný zvuk. Zvuk je však stále poněkud „ostrý”. Je to způsobeno přebytkem vysokých frekvencí, které nejsou pro šum listů stromu charakteristické. Odstraňme tedy tyto vysoké frekvence pomocí frekvenčního filtru, nastavením Cutoff na úroveň znázorněnou na obrázku 3.4. Výsledný zvuk se již podobá tomu, jaký jsme chtěli vytvořit.
45
Obrázek 3.4: Nastavení potenciometru Volume a Cutoff
Pokud bychom chtěli zvuk uložit, tak buď opět jako soubor s příponou wav, a to pomocí nabídky File a položky Save Wave, nebo je tu možnost uložit přednastavení do souboru s příponou ssb na disk počítače tak, že zvolíme nabídku File a položku Export Preset. Zvuk můžeme později pomocí Import Preset znovu upravovat, stejným způsobem jako doposud.
3.2 Buben Jiný pěkný příklad úpravy zvuku, je úprava zvuku bubnu. Budeme upravovat základní vzorek snare.wav, který by se měl po spuštění programu automaticky načíst do sampleru. V našem případě zvolme nabídku File a nejprve položku Reset pro nastavení všech tlačítek a potenciometrů do původní polohy. Dále volme položku Load Wave pro načtení zmiňovaného souboru snare.wav stejným způsobem, jako jsme načítali soubor ptacci.wav. Využijme nyní toho, že můžeme již existující zvuk načtený v sampleru nejrůzněji upravovat a modulovat pomocí syntezátoru a efektových jednotek. Například použitím obyčejné amplitudové modulace, která ovlivňuje jen hladinu intenzity, můžeme výrazně změnit charakter celého zvuku. Zapněme tedy oscilátor amplitudové modulace a nastavme ho podobně, jak je znázorněno na obrázku 3.5. Slyšíme, jak se zvuk razantně změnil. Nyní buben zní, jako bychom do něj udeřili paličkou o rám s velkou razancí. Dále můžeme pomocí
46
echo efektové jednotky vytvořit ozvěnu a buben pak bude podle toho znít. Zapněme tedy Delay jednotku a nastavme parametry Time a Feedback podobně jako na obrázku 3.5. Abychom ozvěnu mohli slyšet celou, potřebujeme ještě celý zvuk prodloužit. To můžeme na sampleru v boxu Length (viz obr.3.5). Pozn. Zajímavé je rovněž pozorovat, jak se charakter zvuku bubnu mění v závislosti na parametru Cutoff a Resonance frekvenčního filtru.
Obrázek 3.5: Nastavení amplitudové modulace, délky vzorku a echo jednotky
3.3. Použití modulace Nyní odstupme od úpravy zvuku a přikročme přímo k úplnému vytvoření nového zvuku. K tomu nám je zapotřebí syntezátoru. Vypněme tedy sampler vypnutím tlačítka Wave a měli bychom místo modré křivky charakterizující zvuk vidět jen vodorovnou čáru. Pokud tomu tak je, neslyšíme žádny zvuk a můžeme ho tedy začít vytvářet. Ještě než začneme zvolme nejprve nabídku File a položku Reset pro nastavení všech tlačítek a potenciometrů do původní polohy. Délku vzorku přepišme na 150000 bytů (viz. obr. 3.5).
47
Dále zapněme první z oscilátorů Osc1 a nastavme ho tak, aby generoval sinusovou vlnu, jeho frekvenci (Frequency) nastavme na tón F v nejvyšší oktávě, jeho posunutí (Motion) do poloviny a intenzitu (Volume) na pozici 9 (obrázek 3.6).
A
zbytek, což je obálka, rovněž podle obrázku 3.6 (Hodnoty parametrů Attack, Decay, Sustain, Release jsou po řadě 8, 96, 50, 25).
Obrázek 3.6: Nastavení sinusového oscilátoru
Vytvořili jsme tedy pomocí prvního z oscilátorů sinusovou vlnu, určili její délku (frekvenci oscilátoru), posunutí, hlasitost a průběh. Nyní máme vygenerován základní sinusový zvuk. Ukážeme si, jak můžeme tento zvuk dále modulovat. Zapněme oscilátor amplitudové modulace AM, nastavme jeho intenzitu na maximum a zapněme nízkofrekvenční LFO mód tohoto oscilátoru (pro lepší pochopení a slyšení toho, co oscilátor opravdu dělá).
Jeho frekvenci a obálku pak nastavme podle
obrázku 3.7 (Hodnoty parametrů Attack, Decay, Sustain, Release jsou po řadě 14, 90, 66, 68).
Obrázek 3.7: Nastavení oscilátoru amplitudové modulace
Nyní slyšíme, že se zvuk v pravidelných intervalech (podle sinusové vlny) stále jakoby zeslabuje a znovu zesiluje. A to je přesně to, co amplitudová modulace dělá (moduluje amplitudu).
48
Obdobným způsobem si ukážeme, jak funguje frekvenční modulace (FM). Zapněme oscilátor frekvenční modulace FM a nastavme jeho intenzitu rovněž na maximum a opět použijme LFO mód, ať výrazně slyšíme to, co frekvenční modulace dělá. Frekvenci oscilátoru a obálku nastavme podle obrázku 3.8 (Hodnoty parametrů Attack, Decay, Sustain, Release jsou po řadě 8, 99, 63, 64).
Obrázek 3.8: Nastavení oscilátoru frekvenční modulace
Když nyní zvuk přehrajeme, tak slyšíme, že se vůbec nezměnil. To je dobře, protože oscilátor frekvenční modulace nám může sloužit jen k tomu, aby nějaký jiný oscilátor moduloval, ale v žádném případě ne k tomu, aby zvuk nějakým způsobem sám vytvářel. Nyní si tedy můžeme vybrat, který ze zbývajících oscilátorů bychom rádi modulovali, zapnutím příslušných tlačítek v sekci Fm. Například zapnutím tlačítka Fm u oscilátoru (Osc1), generujícího základní nosnou a slyšitelnou sinusovou vlnu. Pokud takto učiníme (viz. obr. 3.9), tak po přehrání výsledného zvuku slyšíme, že jeho frekvence se v pravidelných intervalech neustále zvyšuje a snižuje, přesně podle průběhu sinusové vlny. A to je přesně to, co frekvenční modulace dělá (moduluje frekvenci). Zvuk pak může připomínat například zvuk sanitního vozu.
Obrázek 3.9: Zapnutí tlačítka Fm u oscilátoru (Osc1)
49
Nyní tlačítko Fm u oscilátoru Osc1 opět vypněme (viz. obr. 3.9) a obdobným způsobem zapněme tlačítko Fm u oscilátoru AM. Přehrajeme zvuk a krásně slyšíme, jak amplitudová modulace (zeslabováni a zesilování) již neprobíhá v pravidelných intervalech, ale v intervalech, které se pravidelně zkracují a opět prodlužují. A toto je tedy důsledek aplikace frekvenční modulace na amplitudovou.
Dále můžeme se zvukem experimentovat tak, že ku příkladu zapneme fraktální oscilace u oscilátorů amplitudové a frekvenční modulace (viz. obr. 3.10). Zvuk pak bude připomínat jakési “vrkání”, popřípadě při snížení hodnot parametru Volume u oscilátorů AM a FM na třetinu, pak zvuk bude připomínat spíše houkání sovy -
toto přednastavení nalezneme v souboru /Presets/experimental.ssb, který
načteme pomocí nabídky File, položky Import Preset.
Obrázek 3.10: Nastavení fraktální oscilace
50
3.4 Parní lokomotiva V posledním z příkladů použití bych rád ukázal, jak využít možnosti filtr modulace u oscilátorů Osc1 a Osc2. Pokusíme se napodobit zvuk náhonu parní lokomotivy. Přednastavení tohoto zvuku nalezneme v souboru /Presets/train.ssb, jež pomocí nabídky File, položky Import Preset můžeme načíst. Protože zvuk páry ženoucí se z náhonu parní lokomotivy je šum, tak jako základní nosnou a slyšící vlnu zvolíme první oscilátor Osc1 a nastavíme ho na šumový generátor podle obrázku 3.11.
Obrázek 3.11: Nastavení oscilátoru šumového generátoru
Nyní slyšíme klasický bílý šum. Udělejme z něho barevný, tedy zbavme ho vysokých frekvencí, a to
pomocí frekvenčního filtru tak, že filtr nastavíme podle
obrázku 3.12. Šum teď připomíná spíše hukot, možná hukot řeky.
Obrázek 3.12: Nastavení frekvenčního filtru
51
Abychom z tohoto „hukotu“ vytvořili zvuk páry ženoucí se z náhonu parní lokomotivy, využijeme právě zmiňované filtr modulace.
Protože parní lokomotiva
využívá pístů a táhel, o kterých se dá říct, že jejich pohyb má harmonický průběh, tedy funkce amplitudy táhla pístu v závislosti na čase lze vyjádřit sinusovkou, použijeme zřejmě sinusový oscilátor. Zvolíme tedy oscilátor Osc2, protože ten nám umožní, abychom z něho pomocí tlačítka na obrázku 3.13 učinili filtr resonanční oscilátor v nízkofrekvenčním módu. A to je přesně to, co v tuhle chvíli potřebujeme. Tento oscilátor nyní dělá se zvukem to, že pravidelně zvyšuje a snižuje resonanci frekvenčního filtru, tedy zvyšuje a snižuje hladinu intenzity zvuku u frekvence vyjádřené parametrem Cutoff frekvenčního filtru v pravidelných intervalech. A takto přesně se chová pára, ženoucí se z motoru, pod vyšším tlakem, její charakteristický šum slyšíme v daný okamžik více nahlas. Přehrajme tedy zvuk a slyšíme, že se již podobá tomu, který jsme chtěli vytvořit.
Obrázek 3.13: Nastavení filtr resonančního oscilátoru
52
3.5 Zvuková ukázka
Doufám, že tyto příklady posloužily k lepšímu pochopení principů tvorby zvuků v tomto programu. Vím, že tvorba zvuku je „vědou“ a v prvé řadě to chce mít nějaké zkušenosti, abychom vytvořili zvuk, jaký potřebujeme. Když je nemáme, můžeme si alespoň jen tak hrát a se zvukem takzvaně experimentovat. Třeba nějaký zajímavý vykouzlíme. Pokud chcete slyšet více zajímavých zvuků vytvořených autorem tohoto programu, můžete je najít v adresáři [Program/Spustitelná verze/Presets] ve formě ssb souborů. Mnohem zajímavější však asi pro vás bude zvuková ukázka, která představuje minutovou skladbu. Všechny zvuky použité v této skladbě jsou vytvořeny autorem přímo v tomto programu, bez požití jakýchkoliv importovaných zvuků, tedy jsou všechny syntetizovány pomocí syntezátoru tohoto programu. Jednotlivé zvuky můžete najít v adresáři [Zvuková ukázka/Exported Wavs/] (ve formě wav souborů) a v adresářii [Zvuková ukázka/Presets/] (ve formě ssb souborů). Skladba byla komponována za pomocí externího sequenceru (programu Reason švédské firmy Propellerhead), do kterého byly zvuky importovány ve formě wav souborů. Celou minutovou ukázku v souboru formátu mp3 pak naleznete v adresáři [Zvuková ukázka/Demo.mp3].
53
4 Závěr Doufám, že program a jeho popis poslouží jak k pochopení principů tvorby zvuků na počítači, tak ke tvorbě zvuků samotných. Dále program může najít využití na Fakultě informatiky Masarykovy univerzity při výuce předmětu Počítače a hudba I a II (více na http://www.fi.muni.cz/~qruzicka) a posloužit tak stejně dobře studentům i hudebním skladatelům a tvůrcům audio záznamů. Předností programu není to, že obsahuje virtuální komponenty (popsané v kapitole 2.2), protože tyto jsou již dnes běžně používané, ale jejich vzájemná provázanost a ojedinělá možnost, jak je kombinovat a vzájemně aplikovat ve spojení s modulačními funkcemi, dává uživateli příležitost vytvářet vskutku zajímavé a ojedinělé zvuky (k čemuž také přispívají dva typy Fraktálních oscilací, které jsou dodány a vymyšleny autorem). Dále možnosti kombinovat inovativní přístupy k syntéze zvuku, jakými bezesporu jsou Granulární syntéza a Fraktální syntéza, zajišťují komplexní přístup k vytváření, k syntéze a k teorii tvorby zvuků a toto by zde asi mělo být považováno za hlavní autorův přínos.
54
Literatura [1]
Antonín Špelda – Hudební akustika – Státní pedagogické nakladatelství Praha, 1978
[2]
Nápověda k programu Steinberg Cubase SX 1.0, r.2002 (http://www.steinberg.de)
[3]
Nápověda k programu Propellerhead Reason 2.5 – Stockholm, 2003 (www.propellerheads.se)
[4]
Michal Vlk – Počítačová syntéza zvuku – Praha, 2001 (http://hw.cz/Teorie-a-praxe/Dokumentace/ART458-Pocitacova-synteza-zvuku-1.html)
[5]
T.T.Opie, Creation of a Real-Time Granular synthesis – Queensland, 2003 (http://www.granularsynthesis.com/pdf/TimOpieM.pdf)
[6]
Marina Bosi – WAVE PCM soundfile format – Stanford, 2001 (http://ccrma.stanford.edu/CCRMA/Courses/422/projects/WaveFormat/)
[7]
R. Bristow-Johnson – Wavetable Synthesis 101, A Fundamental Perspective (http://www.musicdsp.org/files/Wavetable-101.pdf)
[8]
Fractal Additive Synthesis via Harmonic-Band Wavelets – Lausanne, 2001 (http://staffwww.itn.liu.se/~giaev/PolEva01b.pdf)
[9]
M. Puckette – Theory and Techniques of Electronic Music – California, 2003 (http://crca.ucsd.edu/~msp/techniques/v0.03/book-html/)
55
[10]
Inharmonic sound spectral modeling by means of fractal additive synthesis (http://infoscience.epfl.ch/getfile.py?docid=2187&name=PolottiE02&format=pdf&version=1)
[11]
Eric Stephen Kuehnl – Granular synthesis – California, 1999 (http://music.calarts.edu/~eric/gs.html)
[12]
Jan Obdržálek – Teorie Ladění – Praha, 2005
[13]
Pavel Tišnovský – Interaktivní editor afinních transformací – Brno, 1999 (http://www.fit.vutbr.cz/~tisnovpa/publikace/diplomka/doc/)
[14]
Markéta Breuerová – Fraktály – Praha, 2006
[15]
Fourierova transformace – Olomouc, 2003 (http://apfyz.upol.cz/ucebnice/down/mini/fourtrans.pdf)
56
Mapa přiloženého CD Na přiloženém CD naleznete tyto důležité soubory a adresáře (jsou v hranatých závorkách):
● [Diplomová práce] - [Zdroj]
-zdrojový text diplomové práce pro Word
- DP.pdf
-elektronická podoba textu práce ve formátu PDF
● [Program] - [Komponenty pro Delphi]
-komponenty potřebné pro kompilaci programu
- [Tiwd6]
-balíček s virtuálním potenciometrem
- Switch.pas
-grafická komponenta tlačítka (zapnuto/vypnuto)
- [Spustitelná verze]
-program ve spustitelné podobě
- [Doc]
-dokumentace k programu (lze spustit i z něj)
- [Presets]
-přednastavení spustitelná z programu
- BlueBoard.exe
-souborem spustíme program
- [Zdrojový kód pro Delphi] - project.dpr
-soubor projektu spustitelného v prostředí Delphi
- main.pas
-hlavní unit programu
- help.pas
-unit pro nápovědu k programu
- about.pas
-unit pro zobrazení informací o programu
● [Zvuková ukázka] - Demo.mp3 - skladba složená (pouze) ze zvuků vytvořených v programu - [Presets]
- Zvuky použité v ukázce Demo.mp3 (formát ssb)
- [Exported wavs]
- Zvuky použité v ukázce Demo.mp3 (formát wav)
● Zadání DP.doc
57
Přílohy function GetGrain(k: real; Osc : integer; idSynch : integer): real; {Graintable function} var idx, idx2, Grain1Amp, Grain2Amp, GrainLength : integer; GrainRealVal, Grain1EnvelopeRatio, Grain2EnvelopeRatio : real; GrainHeaderPointer: ^TPCMWaveHeader; begin result := 0; if (P.GrainDataPtr[ Osc, idSynch] <> nil) and (P.GrainDataLen[ Osc, idSynch]>0)then begin GrainHeaderPointer := Pointer( P.GrainDataPtr[ Osc, idSynch] - SizeOf( TPCMWaveHeader)); if GrainHeaderPointer^.nBitsPerSample = 8 then begin // 8 bits grain GrainLength := P.GrainDataLen[ Osc, idSynch]; idx := Round(k * C_SAMPLE_RATE / 100) mod GrainLength; idx2 := ( idx + (GrainLength div 2)) mod GrainLength; //Half shifted Grain1Amp := Integer( P.GrainDataPtr[ Osc, idSynch][ idx]); Grain2Amp := Integer( P.GrainDataPtr[ Osc, idSynch][ idx2]); Grain1EnvelopeRatio := ( sin( 3*pi/2 + 2*pi*idx/GrainLength) + 1) / 2; // H(f) = <0,1> Grain2EnvelopeRatio := ( sin( 1*pi/2 + 2*pi*idx/GrainLength) + 1) / 2; // H(f) = <1,0> GrainRealVal := (Grain1Amp * Grain1EnvelopeRatio) + (Grain2Amp * Grain2EnvelopeRatio); end else // 16 bits grain begin GrainLength := P.GrainDataLen[ Osc, idSynch] div 2; idx := Round(k * C_SAMPLE_RATE / 100) mod GrainLength; idx2 := ( idx + (GrainLength div 2)) mod GrainLength; //Half shifted Grain1Amp := ShortInt( P.GrainDataPtr[ Osc, idSynch][ 2*idx+1]) * 256 + Integer ( P.GrainDataPtr[ Osc, idSynch][ 2*idx+2]) + 32768; Grain2Amp := ShortInt( P.GrainDataPtr[ Osc, idSynch][ 2*idx2+1]) * 256 + Integer ( P.GrainDataPtr[ Osc, idSynch][ 2*idx2+2]) + 32768; Grain1EnvelopeRatio := ( sin( 3*pi/2 + 2*pi*idx/GrainLength) + 1) / 2; // H(f) = <0,1> Grain2EnvelopeRatio := ( sin( 1*pi/2 + 2*pi*idx/GrainLength) + 1) / 2; // H(f) = <1,0> GrainRealVal := ((Grain1Amp * Grain1EnvelopeRatio) + (Grain2Amp * Grain2EnvelopeRatio)) / 256; end; result := 3 * ( GrainRealVal - 128) / 256; end; end;
58
function hyp(k: real): real; {hyperbolic waveform function} var Subtract : real; const STreshold : real = 0.03; begin Subtract := k-round(k); if Subtract <> 0 then begin // Make some treshold in order to cutoff edge if (Subtract < STreshold) and (Subtract > -STreshold) then begin if Subtract > 0 then Subtract := STreshold else Subtract := -STreshold; end; result := -abs(1/(15*Subtract)) end else result := -1; end; function hyp_noise(k: real): real; {hyperbolic waveform function with energy-scaled white noise} begin result := hyp( k); result := result + (1/result/5)*(Random - 0.5) ; //Add energy-scaled white noise end; function tri(k: real): real; begin tri:=2*abs(k-round(k))-0.5; end; function saw(k: real): real; begin saw:= k-floor(k)-0.5; end;
{Triangle waveform function}
{Sawtooth waveform function}
function squ(k: real): real; {Square waveform function} begin if k-floor(k)<0.5 then squ:=0.5 else squ:= -0.5; end; function NG(k: real): real; begin // Randomize; NG:= Random - 0.5; end;
{Noise waveform function}
59
function FxSimple( Osc: integer; const k: real = 1): real; {Function Value, Select function } begin FxSimple := 0; case P.WaveForm[ Osc, idSynth] of C_SINUS: FxSimple:=Sin(k*fa[Osc,idSynth] *2*Pi/C_SAMPLE_RATE); // Sinus C_SAWTOOTH: FxSimple:=3*Saw(k*fa[Osc,idSynth] /C_SAMPLE_RATE); // Sawtooth C_TRIANGLE: FxSimple:=3*Tri(k*fa[Osc,idSynth] /C_SAMPLE_RATE); // Triangle C_SQUARE: FxSimple:=3*Squ(k*fa[Osc,idSynth] /C_SAMPLE_RATE); // Square C_NOISE: FxSimple:=3*NG (k*fa[Osc,idSynth] /C_SAMPLE_RATE); // Noise C_HYPER: FxSimple:=Hyp(k*fa[Osc,idSynth] /C_SAMPLE_RATE); // Hyperbolic C_HYPER_NOISE: FxSimple:=Hyp_noise(k*fa[Osc,idSynth] /C_SAMPLE_RATE); // Hyperbolic with ESN C_GRAIN: FxSimple:=GetGrain(k*fa[Osc,idSynth] /C_SAMPLE_RATE, Osc, idSynth); // Grain table end; end; function FxFractal2( Osc: integer; iter: integer; len: real; x: real): real; begin while x > len do x := x - len; inc(iter); // iter++ if (x < len/2) and not (iter > C_MAX_FRACTAL_ITER) then result := FxFractal2( Osc, iter, len/2, x) else result := FxSimple( Osc, power( 2, iter-1)) * (1/iter); end;
function FxFractal3( Osc: integer; iter: integer; len: real; x: real): real; begin while x > len do x := x - len; inc(iter); // iter++ if ((x < len/3)or(x > 2*len/3)) and not (iter > C_MAX_FRACTAL_ITER) then result := FxFractal3( Osc, iter, len/3, x) else result := FxSimple( Osc, power( 3, iter-1)) * (1/iter); end; function FxFractalAdd( Osc: integer; iter: integer): real; var AmplitudeCoef, FrqCoef : real; begin inc(iter); // iter++ AmplitudeCoef := (1/iter); FrqCoef := power( 2, iter-1); result := FxSimple( Osc, FrqCoef) * AmplitudeCoef; if not (iter > C_MAX_FRACTAL_ITER) then result := result + FxFractalAdd( Osc, iter); end;
60
function Fx(Osc: integer): real; {Function Value of x = amplitude} begin if P.Fractal[Osc, idSynth] then begin case P.FractalType[Osc, idSynth] of C_FT_ADD : result := FxFractalAdd( Osc, 0); C_FT_3_SEQ : result := FxFractal3 ( Osc, 0, 3, fa[Osc,idSynth] / C_SAMPLE_RATE); C_FT_2_SEQ : result := FxFractal2 ( Osc, 0, 2, fa[Osc,idSynth] / C_SAMPLE_RATE); else result := FxSimple( Osc); end; end else result := FxSimple( Osc); end;
//-------------------------------- {Oscilator} ------------------------------procedure Oscilator( Osc: integer); var Di, DiO : integer; Data : real; begin Modified := True; if P.LFO[4,idSynth] then Di :=128 else Di :=1; // LFO/Normal MODE for FM if P.LFO[Osc,idSynth] then DiO:=128 else DiO:=1; // LFO/Normal MODE for OSC if (P.FmOn[idSynth])and(P.FM[Osc,idSynth]) then begin fa[4,idSynth] := fa[4,idSynth] + Freq[P.Frq[4,idSynth]]/Di; // Set frequency of LFO fa[Osc,idSynth] := fa[Osc,idSynth] + Freq[P.Frq[Osc,idSynth]]/DiO *(Fx(4)*Ko(4)*P.Vol[4,idSynth]/20+1); end else fa[Osc,idSynth] := fa[Osc,idSynth] + Freq[P.Frq[Osc,idSynth]]/DiO; // Set frequency of OSC Data := P.Vol[Osc,idSynth]*6 *Ko(Osc) * Fx(Osc) * C_SCALE; // New Data if P.LFO[Osc,idSynth] then // Settings as Filter LFO: begin if Osc=1 then // Cutoff LFO begin FilterLFOCut:=True; CutOffData[i] := ClipOut( Round( CutOffData[i] + Data )) end; if Osc=2 then // Resonance LFO begin FilterLFORes:=True; ResData [i] := ClipOut( Round( ResData [i] + Data )) end end else SetAmplitude( i, ClipOut( Round( Amplitude(i) + Data ))) end;
61
//--------------------------{Amplitude Modulation}---------------------------procedure AM(x: integer); var Di,DiA: integer; begin Modified := True; if P.LFO[4,idSynth] then Di :=128 else Di :=1; // LFO/Normal MODE for FM if P.LFO[x,idSynth] then DiA:=128 else DiA:=1; // LFO/Normal MODE for AM if (P.FmOn[idSynth])and(P.FM[x,idSynth]) then begin fa[4,idSynth] := fa[4,idSynth] + Freq[P.Frq[4,idSynth]]/Di; // Set frequency of LFO fa[x,idSynth] := fa[x,idSynth] + Freq[P.Frq[x,idSynth]]/DiA *(Fx(4)*Ko(4)*P.Vol[4,idSynth]/20+1); end else fa[x,idSynth] := fa[x,idSynth] + Freq[P.Frq[x,idSynth]]/DiA; // Set frequency of AM SetAmplitude( i, ClipOut( Round( HALF_AMP + ( Amplitude(i) - HALF_AMP)* ( Ko(x)*P.Vol[x,idSynth]/20*Fx(x)+(1-Ko(x)*P.Vol[x,idSynth]/20) ) ) ) ); end; //----------------------------{Delay Unit}----------------------------------procedure DelayUnit; var j,K: integer; Dtm: Integer; Fbc: Real; begin Dtm:=abs(P.DT[idSynth]-TrackDTMax)*500+1000; // Delay Time Fbc:=abs(P.FB[idSynth]-TrackFBMax)/100+0.1; // FeedBack for j:=1 to 10 do begin K:=i+j*Dtm; if K < integer( GetEntireLength) then SetAmplitude( K, ClipOut( Round( Amplitude(K) + (Fbc/j/j)*( Amplitude(i) - HALF_AMP)))) end; end;
//-----------------------{SYNTH-AND-DELAY-BODY}-------------------------------BEGIN result := true; {-> Shift init (motions)} fa[1,idSynth] := P.Mot[1,idSynth] *C_SAMPLE_RATE/20; fa[2,idSynth] := P.Mot[2,idSynth] *C_SAMPLE_RATE/20; fa[3,idSynth] := P.Mot[3,idSynth] *C_SAMPLE_RATE/20; fa[4,idSynth] := P.Mot[4,idSynth] *C_SAMPLE_RATE/20; D := GetEntireLength; // Len for Envelope {-> f(x) } for i := 0 to GetEntireLength - 1 do begin if Terminated then //Check for terminaton begin result := false; exit; end; {Osc1:} if P.Osc1On[idSynth] then Oscilator(1); {Osc2:} if P.Osc2On[idSynth] then Oscilator(2); {AM: } if P.AMon [idSynth] then AM(3); {DELAY:} if P.DelayOn[idSynth] then DelayUnit; end; END;
62
//-------------------------------{Filter}-------------------------------------Function Filter : boolean; var i: Integer; fb, old1, old2, old1a, old2a, Res, Cutoff: single; begin result := true; old1:=0; old2:=0; old1a:=0; old2a:=0; Res:=abs( P.Res/20-1); Cutoff:=abs(P.CutOff/20-1); for i := 0 to GetEntireLength - 1 do begin if Terminated then begin result := false; exit; end; if FilterLFOCut then Cutoff:= CutOffData[i]/MAX_AMP; if FilterLFORes then Res := ResData[i] /MAX_AMP; if cutoff>0.9 then Cutoff:=0.9 else if cutoff<0.1 then Cutoff:=0.1; if res>0.8 then res:=0.8; fb:=res+res/(1-Cutoff); old1 :=old1+cutoff *( Amplitude(i) / MAX_AMP - old1+ fb*(old1 - old2 )); old2 :=old2+cutoff *(old1 - old2); old1a:=old1a+cutoff*( Amplitude(i+1) / MAX_AMP - old1a+fb*(old1a - old2a)); old2a:=old2a+cutoff*(old1a- old2a); //limit coeffcients - not very elegant, but else filter //is particularly unstable with high resonance and low //sample&hold rates if old1 >1 then old1 :=1 else if old1<-1 then old1 :=-1; if old2 >1 then old2 :=1 else if old2<-1 then old2 :=-1; if old1a>1 then old1a:=1 else if old1a<-1 then old1a:=-1; if old2a>1 then old2a:=1 else if old2a<-1 then old2a:=-1; SetAmplitude( i, ClipOut( Round(old2 *MAX_AMP) )); SetAmplitude( i+1, ClipOut( Round(old2a*MAX_AMP) )); end;{For} end;{Filter}
63