2017. november 16., csütörtök

Tanítsuk meg a számítógépet zenét szerezni!

Már régen felmerült bennem a gondolat, hogy vajon hogyan lehetne rávenni a számítógépet, hogy magától, emberi beavatkozás nélkül dallamokat, zenéket generáljon. Talán mindenki hallott már a véletlenszám generálásról, leginkább talán retro számítógépekkel kapcsolatban. Annyi a lényege, hogy ha például beírjuk a gépbe azt az utasítást, hogy PRINT RND(50), akkor 0 és 50 között egy teljesen véletlenszerű számot fog kiírni. Ha újra kiadjuk a PRINT RND(50) utasítást, akkor már nem biztos, hogy ugyanazt a számot adja ki. Ha mondjuk a kromatikus skála minden egyes hangjához hozzárendelünk egy számot (pl. a C hang legyen 1, a Cisz 2, a D 3, a Disz 4, az E 5 és így tovább), majd véletlenszerű számokat generálunk mondjuk 1 és 12 között (tehát egy oktáv hangtartományán belül), akkor kapunk is egy véletlenszerű "zenét", pontosabban hanghalmazt. Teljesen összevissza, mindenféle logika nélkül jönnek a hangok egymás után így. Nagyon kicsi a valószínűsége, de nem zárható ki teljesen, hogy ezzel a módszerrel akár ismert zeneszerzők műveit is előállítsa a számítógép. Én rengetegszer próbálkoztam a véletlenszámokkal, de sose jött ki belőle semmi értelmes. Ez tehát még nem a megfelelő módszer arra, hogy a számítógépet rávegyük, hogy dallamot generáljon, de valahol ebbe az irányba kellene elindulnunk, csak "kicsit" több szabályosságot kéne belevinni abba, hogy ezek a számok hogyan jöjjenek egymás után.
Mi is ez a szabályosság? Hogyan lehetne megközelíteni? Elsőre azt próbáltam ki, hogy megadok 4 hangot a gépnek, a C-dúr négyeshangzatot: C, E, G, H, és a gép e közül a 4 hang közül válasszon ki egyet véletlenszerűen, majd még egyet véletlenszerűen, ezt kb. 5-10-szer egymás után, de még azt is a gép döntse el véletlenszerűen, hogy 5 és 10 között hányszor rakjon még egy hangot a készülő "dallamhoz". Ha 5-10 alkalommal elvégezte ezt a gép, akkor utána a D-moll négyeshangzat hangjai közül válogasson véletlenszerűen egymás után 5-10-et, amiket szintén hozzáír a készülő "dallamhoz". Ha pedig ez is megvolt, akkor újra a C-dúr négyeshangzatok közül válogasson. Ezzel nagyjából, úgy ahogy összerak a gép egy 3 patternből álló motívumot, a legegyszerűbb tonika-domináns-tonika patternekből rak össze valamit. Persze ezzel sem nyerünk valószínűleg olyan dallamot, amivel a Zeneakadémián fel lehet lépni, de még mindig jobban hasonlít valami zeneszerűséghez, mint ha teljesen véletlenszerűen válogat egymás mellé hangokat akár a kromatikus, akár valamilyen más skála hangjaiból.
Megpróbálkoztam ezután egy másik módszerrel. Ha megfigyeljük a zeneműveket, azt láthatjuk, hogy az egymás után következő hangok közötti hangköz az esetek nagy részében kicsi. A leggyakrabban szekund hangtávolság van két egymás mellett álló hang között, ennél valamivel ritkább a terc, a kvart még ritkább, és így tovább. Lényegében a szekund és a terc vezet elsöprően a többi hangközzel szemben (akár kisszekund, nagyszekund, kisterc, nagyterc legyen). A kisgyerekek legelőször a nagyszekund és a kisterc hangközöket éneklik ki, ez tehát valahogy benne van az emberben, hogy pl. nem alapból szexteket és szeptimeket énekel ki életében először. Ebből kiindulva összerakhatunk ez alapján is egy 5-10 hangból álló dalrészletet. Indulhat a gép tetszőleges hangról, utána véletlenszerűen eldöntheti, hogy szekund vagy terc következzen-e, és azt is eldöntheti véletlenszerűen, hogy magasabb vagy mélyebb hang következzen-e az előzőnél. Ezt úgy oldottam meg, hogy a dúr (vagy éppen moll) skáláról véletlenszerűen választott egy hangot a gép, és ha ez a hang szekund vagy terc távolságra van a készülő dallam utolsó hangjától, csak akkor rakja hozzá a készülő dallamhoz. Ha nagyobb a hangköz, akkor addig választ véletlenszerűen egy új hangot, amíg megfelelő nem lesz. Ebből már egész érdekes dallamok születtek. A Zeneakadémián ezzel a zenével sem lehet még fellépni, de már alakul. Itt most tényleg felmerül, hogy akkor kvartok, kvintek, stb. egyáltalán ne legyenek-e a zenében, de ezt a problémát egyelőre hagyjuk. Ami a leginkább zavaró az így előálló 5-10 hangban, hogy a vége lezáratlanság érzetét kelti az esetek nagy részében, tehát nem tér vissza az adott hangnem alaphangjára, vagy semmiféle megnyugvásról, lezárás érzetéről nem gondoskodik. Az egyik megoldás erre, hogy az utolsó 2-3 hangnak mi adjunk meg néhány lehetőséget, amelyek közül a gép választ egyet véletlenszerűen. Tehát pl. egy C-dúrban írt, pár hangból álló dallam vége lehet mondjuk E D C, vagy F E C vagy F D C vagy D H, C, vagy éppen H C' vagy A H C', de akár még az E F G is elmehet. Nyilván itt sem mindegy, hogy az utolsó 2-3 hang előtt milyen hang áll, így pl. egy E F G előtt a H általában kevésbé szól jól, mint mondjuk a C. De ha van néhány lehetőség az elfogadhatóbb lezárásra, máris jobban  hangzik a "dallam".
Egy lehetséges lényeges lépést tehát megtettünk elfogadható, 5-10 hangból álló zenerészlet generálása felé, ennek 3 pontja:
1. Lehetőleg valamilyen dúr vagy moll skála hangjaiból válogassunk;
2. egymás után szekund vagy terc távolságra lévő hangok következzenek;
3. gondoskodjunk olyan befejezésről, amely megnyugvás érzetét kelti.
Egy dologról nem esett még szó, a hangok hosszáról. Eddig alapnak tekintettem, hogy minden hang egyforma hosszú, így alkotnak egy ütemet, és nincs köztük szünet. Ezen is lehet változtatni. A generált dallamrészletből a gép tetszőleges hangokat megnyújthat kétszer olyan hosszúra. Itt is sok dolog felmerül. Például nem is lenne muszáj csakis kétszer olyan hosszú hangok lehetőségében gondolkodni, de az egyszerűség kedvéért maradjunk ennél. Ha minden egyes hangról eldönti véletlenszerűen, hogy kétszer olyan hosszú legyen-e vagy ne, az nem feltétlen lesz jó. Megadhatunk például "előre legyártott" sémákat, például nyújtsa meg az első kettő és a 7. és 8. hangot, vagy nyújtson meg minden második hangot, minden harmadikat, és még van számos lehetőség. Az is lehetne, hogy két hangot "mosson egybe", tehát a megnyújtott hang után lévő hangot törölje, aminek sajátossága, hogy esetleg becsúszhat egy tercnél nagyobb hangköz is a dallamba, ha éppen a törölt hang előtt és után is legalább az egyik hang terc volt. Az említett lehetőségeket kombinálni is lehet. Mindemellett célszerű lehet megmaradni egy ütem hosszúságán belül, így ha a hangok nyújtásával "megnyúlik" a zenerészlet, akkor különböző módszerekkel csökkenthetjük vissza a hosszát, például az utolsó, az ütemen túllépő hangokat töröljük, és a már meglévő utolsó 2-3 hang magasságát a korábban említett módszerrel módosítjuk véletlenszerűen. De még az is lehet, hogy a véletlen folytán a gép úgy dönt, hogy nem nyújtja meg egyik hangot se. De gondolhatunk arra is, hogy egy vagy akár több hangot esetleg ennél hosszabbra nyújtsunk meg, a lehetőségek eléggé tágak.

Ezzel tehát generáltunk egy dallamrészletet, ami, ha szerencsénk van, még akár elfogadható is lehet egy zene részének. Hogyan tovább? Itt ismét sok lehetőség kínálkozik. Az egyik lehetőség, hogy ezt a generált zenerészletet megismételjük még egyszer vagy akár többször is. A másik lehetőség, hogy megismételjük ezt a zenerészletet, de egy vagy két félhanggal mélyebbre vagy magasabbra transzponálva véletlenszerűen. Harmadik lehetőség, hogy egy újabb, az előzőhöz hasonló módszerrel generált zenerészletet teszünk a meglevő után, melynek generálásakor figyelembe vehetjük az előző zenerészlet hangnemét. Negyedik lehetőség, hogy az előzőhöz hasonló zenerészletet generálunk, de az előző zenerészletből a hosszabb hangok helyét (részben, véletlenszerűen) megőrizzük. Újabb lehetőség, hogy az előző zenerészletnek az első néhány hangját teljes egészében meghagyjuk, és ahhoz illesztünk az előző módszerek alapján újabb hangokat. Vagy az előző zenerészletnek az utolsó felét őrizzük meg, az első felét újrageneráljuk. De teljesen másfajta folytatás is lehetséges. A tonika-domináns-szubdomináns-tonika menetet érdemes lehet tartani, vagy akár véletlenszerűen el is térhetünk tőle.

Én a következőkig jutottam: a gép legenerál egy ütemet, minimum 12, maximum 16 hangot C-dúrban vagy A-mollban, majd véletlenszerűen néhány hang hosszát megnyújtja kétszeresére úgy, hogy a következő hangot letörli. Ezután véletlenszerűen az egész ütemet vagy transzponálja 1-3 félhanggal feljebb vagy lejjebb, vagy nem. A következő ütem vagy ugyanaz lesz, mint az előző, 1-3 félhanggal véletlenszerűen vagy transzponálva, vagy nem; vagy pedig teljesen új ütemet generál, mégpedig ha az előző ütem C-dúrban volt, akkor A-mollban, ha pedig A-mollban volt, akkor C-dúrban. (De nem feltétlen ezek a hangnemek jönnek egymás után, hiszen a C-dúrból véletlenszerűen bármikor lehet pl. Cisz-dúr, D-dúr, H-dúr, az A-mollból Ász-moll, stb.) Ez is már olykor egész érdekes "dallamhalmazt" eredményezett.

Prím hangköz is előfordulhatna, azaz ugyanaz a hang következhetne egymás után többször is. Ezt nem vettem figyelembe, de érdemes lehet kipróbálni. Lehet játszani azzal is, hogy valamikor nagyobb valószínűséggel, máskor kisebb valószínűséggel, esetenként egyáltalán nem lehetnek prímek bizonyos ütemeken belül.

Mindez eddig csak az egyszólamú dallam generálásával foglalkozott. Elsőre belegondolva jóval bonyolultabb lehet többszólamú zenét generálni, amikor még az egyszólamú sem lesz mindig feltétlen elfogadható élvezhetőségű. Nyilván a tercpárhuzam generálása egyszerű lehet, vagy a második szólam hozzágenerálása az első szólamhoz olyan módon, hogy a leggyakoribb hangköz a két egyszerre megszólaló hang között a terc legyen.
Basszus generálása szintén érdekes kérdéseket vet fel. Egyik lehetőség, hogy a basszus első hangja ugyanaz legyen, mint a főszólam kezdőhangja (és ez szóljon tovább egy darabig), vagy véletlenszerűen térjen el tőle mondjuk egy terccel, kvinttel, de ezzel már óvatosan kell bánni.
Dobszólam generáltatása talán a legegyszerűbb. Itt eleve előre meghatározottak a lehetőségek, amik közül a gép véletlenszerűen választhatna. Lehet olyannal is próbálkozni, hogy ha a főszólamban egy hang nagyon meg van nyújtva, arra épp cintányér kerüljön, vagy éppen ott szóljon több hang egymás után akár a dobon, akár a basszusban.

Már régen kitalálták ezt, amit itt leírtam, és tovább is fejlesztették ennél, alaposan kidolgozták. A Youtube-on található olyan zene is, melyről laikus nem mondaná meg, hogy nem ember írta.

Nincsenek megjegyzések:

Megjegyzés küldése