Thursday, September 2, 2010

Elektronmuusika tarkvara

Peale nüüd mõningast uurimist olen jäänud kolme (programmeerimis)keele õppimise juurde:
  1. ChucK
  2. Faust
  3. PureData
(PureData)

Kolmas kolmest on visuaalne programmeerimiskeel, mida õpin tänu sellele, et sugulase soovitatud raamat on sellele üles ehitatud. Visuaalne programmeerimine on algajale mugav - lausa võiks soovitada -, aga elu on näidanud, et suht võimatu on luua visuaalseid keeli, mis väljendusvõimsuse või arenduskiiruse osas kasvõi läheneks sümboolsetele keeltele.

Ehkki väga paljud projektijuhid ja arhitektid armastavad vahekeeli, nagu UML - ehk siis skeeme ning jooniseid. Isegi leian, et näiteks süntaksireegleid on lihtsam lugeda skeemide kujul, kui tundmatus (või, peab möönma, isegi tuntus) süntaksiväljendamise keeles ..siiamaani on minu jaoks näiteks YACCi süntaks üsna tüütu. Igaljuhul tulevad visuaalsetele keeltele ette teatud piirid - väga suuri ja keerulisi, samuti ka semantiliselt-loogiliselt mitmetahulisi programme on nendes väga raske väljendada; teiseks ei saa nendes väga kiiresti asju teha - hiirega mõne kasti joonistamine ja juhtmete ühendamine võtab aega.

Nõustun ka sellega, et millegi tegemine heas visuaalses keeles, eriti kui tegu on muusikaga, nõuab algajalt viieminutilist sissejuhatust, samas kui vähegi huvipakkuva programmeerimiskeele aluste õppimine on ilmselt ligilähedaselt sarnane mõne naturaalkeele aluste õppimisega - ka programmeerimiskeeles on suht võimatu teha midagi vähegi kasulikku, kui ei tunne esimest kolmesadat sõna ning parajat portsu süntaksireegleid. Arvutikeelte polüglotile, samas, on see ehk sama lihtne, kui polüglotile õppida harilikku keelt; programmeerimiskeeled jaotuvad paradigmadeks, need omakorda millekski keelkondadele väga lähedaseks ning keelkonnad keelteks ja nende spetsiifilisteks implementatsioonideks (murreteks) - loomulikult on ka palju vastastikuseid laenusid.

Arvutikeeled arenevad harilikest keeltest kiiremini - täiesti fundamentaalseid asju tehakse tihti ringi. Ükski arvutikeel ei jõua kuhugi, kui selles ei ole võimalik saavutada kergema vaevaga suuremat väljendusvõimsust, aga ka paljusid muid asju (mille kirjeldamine läheks ehk pisut tehniliseks). Nendel kahel põhjusel on ka vastastikused laenud - eriti keelte, aga mingil määral ka paradigmade vahel - küllaltki tavalised. Asjad, mis midagi uut väga palju ei paku, laenatakse olemasolevatest keeltest - lihtsustamaks uue keele õppimist -, samas kui asjad, mis väga palju pakuvad, levivad mööda keeli. Siiski ei levi nad igale poole kahel põhjusel - esiteks ei sobi iga featuur teise keelde, kuna seal on sama asja tegemine juba võimalik hoopis teisiti (ja väga raske on lugeda koodi keeles, kus sama põhilist asja väljendatakse kümnel täiesti erineval viisil, justkui kümnest keelest selles, mis autorile parasjagu hea valikuna pähe tuli) ning teiseks ei pruugi see teise keele loogikaga isegi mitte sobida, selles võimalik olla.

(ChucK)

ChucK on keel, mis pakub kaks huvitavat uuendust (lisaks sellele, et see on helisüntesaatorite tegemiseks mõeldud domeenipõhine keel [DSL]):
  • Aeg on fundamentaalselt keele loogikas sees.
  • Programmi töö ajal on võimalik seda mingil määral muuta (tegelikult peamiselt komponente vahetada).
Lisaks on seal ka helikeelele kohustuslik osa - helivoogude saatmine ühelt komponendilt teisele on väga lihtne (tavalises, üldises programmeerimiskeeles kuluks sellele palju ridu või isegi eraldi keerulisi klasse, sellal kui ChucK'is käib see ühe sisseehitatud ja väga paljude olukordadega juba ette arvestava tehte kaudu).

Aja fundamentaalselt keele loogikas sees olemine erineb paljudest muudest keeltest - ChucK on üles ehitatud nii, et oleks kerge ja loomulik väljendada, millal täpselt üks või teine asi toimuma peab. Harilikes keeltes nõuab sünkroniseerimine eraldi tööd, kuid ChucK-is on see töö esiteks juba üldjuhul ära tehtud ehk siis teoreetiliselt läbi analüüsitud erinevad juhud ja sünkroniseerimine nendel juhtudel; nagu hästi teame, on teooria eelis praktika ees see, et on võimalik teha üks kord ja korralikult - arvestades kõikvõimalike sündmustega, mida ei ole veel kunagi juhtunud, aga mis on teoreetiliselt võimalikud. Nii ka ChucK - paljude protsesside omavaheline ajaline sünkroonsus on juba ette läbi analüüsitud, et see igas olukorras toimuks; asju on võimalik käivitada ühe sämpli või (täpselt) ühe tunni täpsusega; erinevaid protsesse on võimalik kahe reaga samasse taktimõõtu viia ja omavahel kooskõlastada; programmeerija ei pea mõtlema ajale - peab ainult (selgelt) väljendama oma soove aja osas.

Programmi muutmine selle töö ajal tähendab seda, et on võimalik anda ChucK'is näiteks laiv esinemisi, kus vastavalt esinemise flowle ja meeleolule saab kirjutada uusi koodijuppe-mooduleid, näiteks kuulata neid kõrvaklappidega ning samas ka siduda esinemise üldise meluga ilma, et see hetkekski katkeks - ja loomulikult on need ajaliselt sünkroniseeritud ning ülejäänud helide koodiga samas taktimõõdus ja ka muutujaruumis; näiteks saab mitte ainult sämpleri pilli, vaid terve sämpleri koodi (mis tekitab trummilöögi heli, kui sämpleri pihta trummipulgaga lüüa) vahetada hetkega välja ilma, et isegi sämpleri kaja ja sellele pandud effektid vaibuks - vahetub üks tükk koodi sellal, kui ülejäänu ajab oma asja segamatult edasi.

(Faust)

Niisiis, ChucK on hea, nagu juba kirjeldatud - siiski on tal paar väikest puudust.

ChucK'i esimene puudus on tema kole kiviaegne kood - süntaks on võetud kuskilt eelajaloolisest ajast, nagu C, C++'i ja Pascali loogika; samas kui muud keeled on kiiresti arenenud. Teiseks ei toeta see paljusid võimalusi, mida iga korralik kaasaegne keel toetab - väikse näitena ei ole klasside konstruktorid veel implementeeritud. Kui ma peaksin ChucK-i süntaksiga keeles tegema infosüsteemi, siis ma arvaks, et tegu on debiilsusega. Selliste kriteeriumite järgi on see väga vilets keel. Teiseks on ka süntaks muus osas kole ja mitte eriti koherentne - aga selle võime välja vabandada ChucKi autorite (tegu on Princentoni ja Stanfordi ülikoolide elektronmuusika osakondade koostööprojektiga) tõsiste kiiksudega - ilmselgelt ei huvita neid konventsioonid ja head tavad. Tänu sellisele tavade eiramisele arendavad nad ChucK-i külge täiesti geniaalseid ja uudseid nähtusi, nagu näiteks editor Audicle - mis on küll kaugel valmisolemisest.

Aga teine, konkreetsem puudus - ChucK ei ole väga optimeeritud. See ei ole kiire. Väga keerulisi arvutusi - mida helide puhul ikka ju teha tasub - ei tasu sämpelhaaval ChucKis teha - heli hakkab ilmselt lagima (ehk siis ei suuda enam oma perfektselt sünkroniseeritud taktis püsida või õigesti kõlada).

Selle puuduse vastu aitab võimalus C++-is uusi UGene lisada - UGen on ChucKi unit generator. UGenid nimelt tegelevad keeruliste sämpelhaaval arvutustega.

Mis on ChucK-i nõrgad küljed, on õnneliku juhuse läbi Fausti tugevad küljed - Faust võimaldab luua UGeni ning kompileerida selle kiireks C++'i koodiks. Sestap leidsin ka, et see on ChucK-ile pea komplementaar. Ainus, mida tuleb teha - teha ChucK'ile plug-ini klass, mis strukturaalselt sobiks Faustis tehtud protsessiga ning seejärel muuta Fausti koodigenereerimist ChucK'iga ühilduvaks (võib-olla piisab, kui teha ühte kahest).

Mis teeb Fausti C++'i koodi kiireks? Sellel on hea põhjus - Faust on matemaatiliselt koherentse teooria põhjal tehtud ..fausti manuaal tegelikult kubiseb matemaatikast (siiamaani küll mitte väga keerulisest - peamiselt hulgateooria ning lihtsad tehted; muidugi võib see veel manuaalide käigus muutuda). Kuna see on matemaatiliselt tugeva pinna peal, on võimalik Fausti programmi matemaatiliselt lihtsustada - ka tänu sellele, et paradigmade mõttes on ChucK (peaaegu) imperatiivne keel, aga Faust on funktsionaalne keel. Funktsionaalsus tähendab just nimelt mõningast sarnasust matemaatikale - peamiselt funktsioonide loogika mõttes (sest teistmoodi sarnaseid keeli matemaatikale kutsutakse juba loogilisteks keelteks) ..tänu sellele funktsionaalsusele saab kasutada matemaatika täit võimsust, et kiirendada ja lihtsustada Fausti süntesaatoreid. See toimub nähtamatult-märkamatult ning annab tulemuseks väidetavalt pea sama kiire või praktikas isegi kiirema koodi, kui C++'is käsitsi tuleks - ja seda keeles, kus on helisünteesi tegemine kindlasti palju vähem energia- ja ajakulukas, kui C++'is.

(ChucK+Faust+Python+MIDI+OSC)

Et siis, täiskomplekt:
  • ChucK võimaldab teha helisünteesi, juhtida helisid reaalajas ning siduda kõiki heli ja muusika aspekte algoritmilise loogikaga - teha muusikat matemaatika (ja loomulikult inspiratsiooni) abil.
  • Faust võimaldab teha ChucKile sünteesikomponente, mis oleks kiired ning ei koormaks arvutit üle.
  • Python võib läbi OSC, aga ka läbi spetsiaalsete ühenduslülide, suhelda ChucK-iga - asju, mis ei puuduta muusikat (näiteks kasutajaliides muusika juhtimiseks, aga ka paljud muud asjad) võib olla Pythonis lihtsam ja parem teha - Python saab anda ChucKile infot ja korraldusi (ning ka vastupidi).
  • MIDI - mul on hetkel virtuaalne MIDI keyboard, mis töötab koos ChucKiga. Vajadusel saab selle asendada reaalse MIDI kontrolleriga.
  • OSC - Open Sound Control on protokoll, mille abil suhtlevad omavahel erinevad helisünteesi vahendid. Nende vahendite alla käivad arvutid, programmid ning seadmed. ChucK toetab OSC'd suurepäraselt (nagu ka vanemat osaliselt samu funktsioone täitvat protokolli - MIDIt) ning seega tasub neid ühendada.
Ja kõik see tehniline jutt ..eks ma alustan tehnikast (tehnoloogiast), aga loodetavasti jõuab see kõik üks hetk ka improvisatsiooni (kunsti) juurde välja, nii et ma saan mõne põneva loo teha - ehk ka mitte üksi :)

No comments:

Post a Comment