Când am început să lucrez la acest articol, mi-a revenit în minte un citat al lui Carl Sagan: "Dacă vrei să faci o plăcintă cu mere, mai întâi trebuie să inventezi Universul."
La început, m-am gândit să "traduc" algoritmii muzicali, precum regulile de contrapunct, pentru a-i decodifica într-un limbaj accesibil programatorilor și inginerilor. Dar mi-am dat seama rapid că trebuie să pornesc de la noțiunile de bază și să construiesc contextul. Prin urmare, în această introducere, voi trece în revistă câteva elemente fundamentale care sunt necesare pentru a aprofunda algoritmii muzicali.
Dicționarul Merriam-Webster definește pe larg algoritmul ca fiind "o procedură sistematică pentru rezolvarea unei probleme sau atingerea unui scop". Înainte de a vorbi despre proceduri, trebuie să definim domeniul asupra căruia aplicăm aceste proceduri. Același dicționar definește muzica drept "știința sau arta de a ordona tonuri sau sunete în succesiune, în combinație și în relații temporale, pentru a produce o compoziție cu unitate și continuitate."
Privind mai atent, observăm că fiecare proprietate fizică a sunetului se mapează direct pe o caracteristică muzicală și se ramifică în domenii întregi de studiu: frecvența undei devine înălțime (pitch), spectrul armonic devine timbru, amplitudinea este percepută ca intensitate, durata este organizată în ritmuri guvernate de tempo. Algoritmii se pot aplica fiecărei proprietăți pentru a obține "unitate și continuitate" în "ordonarea sunetelor în succesiune", conform definiției de mai sus. În mod natural, prima proprietate supusă acestui tratament este frecvența, care va fi și tema principală a acestui articol.
Pentru a vizualiza seria armonicelor putem lua exemplul unei corzi în vibrație. Având fiecare capăt fixat, când punem coarda în mișcare, aceasta va vibra ca un singur segment aflat între două puncte fixe, dar, totodată, ca mai multe segmente mai mici, cu puncte fixate, adiționale, sau noduri, poziționate pe lungime. Toate aceste moduri de vibrație produc unde sinusoidale care se combină în sunetul perceput. Există o operație matematică numită transformata Fourier, care descompune un semnal dependent de timp, arătând cât din fiecare sinusoidă se regăsește în acel semnal.
Seria armonică este setul de frecvențe care sunt multipli întregi ai unei frecvențe fundamentale: f, 2f, 3f, 4f, 5f etc., generate de modurile naturale de vibrație ale unei corzi fixate la capete. Fiecare armonică corespunde unui tipar de vibrație cu un număr crescător de noduri (puncte fixe) distribuite uniform: un segment pentru fundamentală, două pentru armonica a doua, trei pentru a treia ș.a.m.d. Raporturile dintre fiecare armonică și cea precedentă (2:1, 3:2, 4:3, 5:4), definesc intervale muzicale specifice, precum octava (2:1), cvinta perfectă (3:2), cvarta perfectă (4:3) și terța mare (5:4).
Un interval muzical nu este altceva decât raportul dintre două frecvențe, asemenea unui diferențial de voltaj în electronică. Așa cum în procesarea de semnal compari două unde sinusoidale prin raportul frecvențelor lor, în muzică acest raport determină cum percepem distanța de înălțime dintre două sunete. Dublarea frecvenței (2:1) produce o octavă, multiplicarea cu 3/2 produce o cvintă perfectă ș.a.m.d. Deoarece percepția înălțimii este logaritmică, rapoarte egale, nu diferențe egale, dau naștere unor trepte percepute ca echidistante.
În Max/MSP putem recrea acest fenomen folosind [cycle\~] și puțină logică de programare. Astfel înțelegem mai bine fenomenul natural și îl putem reconstrui invers pentru a crea sunete noi. De exemplu, modificarea intensității fiecărei armonice schimbă timbrul unui sintetizator, la fel cum construcția fizică a unui instrument acustic amplifică sau estompează anumite armonice, oferindu-i spectrul său particular. Această preocupare a atras compozitorii încă din secolul XX, mai întâi prin explorarea unor instrumente exotice, apoi prin inventarea unor instrumente complet noi.
Sistemele vechi de acordaj, precum cel atribuit lui Pitagora, se bazau mai mult pe acustica naturală, folosind intervalul de cvintă (3:2), obținut între armonica a treia și a doua, primul interval care nu repetă fundamentală (1:1 pentru unison și 2:1 pentru octavă). Acest sistem folosea raportul de 3:2 pentru acordaj și pentru a construi game, fiind mai apropiat de fiziologia umană. Aceste cvinte erau percepute ca "pure", deoarece suprapunerea notelor produce mai puține disonanțe între supratonuri armonice.
Muzica occidentală contemporană utilizează sistemul de temperare egală, care împarte octava (raport 2:1) în 12 trepte egale, numite semitonuri. Acest sistem a fost adoptat pentru a obține simetrie și pentru a permite modularea enarmonică. Intervalele reprezintă elementele fundamentale de organizare în muzică; ele provin din seria armonică naturală, iar, în funcție de percepția noastră, le clasificăm ca intervale consonante (plăcute, stabile) sau disonante (tensionate, instabile).
În cadrul unei octave, cele 12 semitonuri și notele corespunzătoare (în temperarea egală, intervalele enarmonice coincid, de exemplu, Do diez este echivalent (enarmonic) cu Re bemol) pot fi indexate într-un array:
Index | Interval | Notă |
---|---|---|
0 | unison | Do |
1 | semiton (sec.mică) | Do# |
2 | ton(sec.mare) | Re |
3 | terță mică | Re# |
4 | terță mare | Mi |
5 | cvartă perfectă | Fa |
6 | cvartă mărită | Fa# |
7 | cvintă perfectă | Sol |
8 | sextă mică | Sol# |
9 | sextă mare | La |
10 | septimă mică | La# |
11 | septimă mare | Si |
Exact această metodă de indexare a fost folosită de compozitorul român Anatol Vieru în anii '80, aplicând aritmetică modulară și folosind clase de resturi pentru a reprezenta note și intervale. El a utilizat această tehnică pentru a efectua operații algebrice cu note și pentru a analiza muzica, creând o echivalență între modurile muzicale și mulțimi matematice. Recomand Cartea Modurilor de Anatol Vieru, Ed. Muzicală, 1980.
Pe baza unei abordări similare, am creat un mic patch Max/MSP care generează valori aleatorii și produce o secvență de note; așadar, în loc de a analiza muzica, această tehnică poate fi folosită și ca algoritm de compoziție muzicală.
Patchul folosește obiectul [uzi] pentru a produce 12 impulsuri succesive, care declanșează obiectul [random]. Logica de programare subiacentă utilizează resturi modulo, apoi indexează și mapează cele 12 numere generate pe înălțimi, făcându-le mai ușor de citit. Secvența obținută este apoi stocată într-un obiect [coll], ceea ce o face perfect compatibilă cu [zl].
Obiectul [zl] este folosit pentru procesarea listelor și permite operații identice cu transformările din arsenalul unui compozitor. Transformări precum inversiunea, retrogradul sau transpoziția sunt echivalentele algebrei liniare pentru invert, reverse și shift. Deși acest subiect ar merita un capitol separat, merită menționat că astfel de transformări (și multe altele) sunt folosite constant de către compozitori pentru a obține material nou care păstrează totuși un grad de familiaritate pentru ascultător. Aceasta este o practică prevalentă, dar nu limitată, la muzica barocă și la serialism.
Revenind la patch, mi-am imaginat un flux de date în timp real în locul obiectului [random], de la grafuri de rețea până la date de la senzori, aproape orice ar putea funcționa. Butonul [bang] ar declanșa capturarea unui "snapshot" al datelor, care ar fi transformat apoi în clase de înălțimi și indexat consecutiv, în timp ce este stocat într-un [coll]. Cu câteva modificări, patchul ar putea fi adaptat la orice mod sau gama muzicală; la fel de bine, eliminarea ideii de snapshot și stocare, în favoarea unui flux continuu de înălțimi, ar produce rezultate interesante.
Această introducere a arătat că, deși sistemul de înălțimi creat pentru formele de expresie din muzica occidentală ține cont atât de acustică, cât și de fiziologia umană, el este în esență doar un standard, dezvoltat de-a lungul secolelor, dar, în cele din urmă, imperfect în încercarea sa de a prezerva fundamentul acustic și de a permite simetria și uniformitatea. Tocmai această simetrie matematică, în detrimentul perfecțiunii acustice, a înlesnit apariția compoziției algoritmice asistate de computer încă din anii '60.
Deși în muzică există numeroase stiluri legate de diferite epoci și spații geografice, ne vom concentra pe muzica occidentală, deoarece practicile ei au fost aproape universal adoptate din punct de vedere cultural.
Înainte de a privi structurile mai ample, orizontale, care apar în muzică, abordarea verticală ține de un cadru bazat pe reguli, pe care muzicienii îl numesc contrapunct. Etimologic, termenul provine din punctus contra punctum, iar așa cum sugerează numele, se concentrează pe aspectul vertical al suprapunerii melodiilor.
O altă modalitate de a privi contrapunctul ar fi asemănarea cu multi-threading sau semnale concurente. Totuși, există și reguli de dezvoltare melodică ,,orizontală", care au fost perfecționate de-a lungul timpului, pentru a se asigura că o melodie este ușor de cântat. Putem privi aceste reguli drept un algoritm de optimizare a traiectoriei cu un set de constrângeri.
Algoritmul nostru de contrapunct ar trebui să urmeze câteva reguli de bază pentru dezvoltarea melodică (orizontală):
În practică, mișcarea treptată a fost folosită pentru a face melodiile cantabile, întrucât salturile sunt mai greu de interpretat, mai ales pentru non-muzicieni, lucru care, la vremea respectivă, era o considerație importantă. Prin urmare, intervalele de secundă mică și secundă mare (semiton și ton) sunt considerate consonante din punct de vedere melodic.
Putem privi mișcarea treptată ca pe un algoritm de netezire puternică **(**hard smoothing algorithm), conceput pentru a preveni "zgomotul", menținând sistemul stabil prin variații mici de amplitudine și frecvență.
Revenind la programarea în Max/MSP, dacă intervalele sunt reprezentate prin numere de la 0 la 11 și lucrăm cu o secvență numerică, putem crea o logică de tip "gate" care forțează un anumit număr de pași treptați înainte de a permite apariția unui salt.
Dacă o melodie ar avansa doar prin mișcare treptată, ar deveni plictisitoare foarte repede; prin urmare anumite salturi sunt necesare. Totuși, prea multe salturi ar disrupe fluxul melodic. Salturile succesive sunt permise doar în anumite cazuri, de exemplu dacă formează un acord consonant sau dacă se deplasează în direcții opuse.
Acestea pot fi considerate exploziile ocazionale de frecvență mai înaltă care sunt tolerate ușor și care orientează sistemul, doar temporar, pe o pantă mai abruptă.
Pentru a obține un raport acceptabil între mișcarea treptată, salturile mici și salturile mari în Max, putem crea filtre cu obiectul [zl] care separă aceste categorii în trei fluxuri diferite. Soluția anterioară pentru mișcare treptată poate fi combinată cu un tabel ponderat care stabilește proporția între salturile mici și cele mari.
Salturile mai mari decât o sextă mare nu sunt permise, cu excepția ocazională a octavei perfecte. În plus, orice salt mare trebuie urmat de mișcare contrară treptată.
Salturile, și mai ales cele mari, pot fi privite ca depășiri de traiectorie pe un drum sau o grilă, necesitând atât pregătire (mișcare treptată înainte de salt), cât și corectură (mișcare treptată contrară după salt). O altă analogie, în ton cu cele anterioare, ar fi aceea că salturile sunt tranziții bruște de amplitudine mare, care solicită sistemul și pot duce la instabilitate sau distorsiune.
Septimele mari și mici nu sunt permise, la fel ca orice interval mai mare de o octavă. De asemenea, toate intervalele mărite și micșorate sunt interzise din cauza efectului lor disonant.
Din cauza enarmoniei, nu vom considera toate intervalele mărite ca fiind interzise, aceasta ține mai degrabă de notația muzicală și de modul/gama în care ne aflăm. Totuși, tritonul (așa cum sugerează numele: 3 tonuri sau 6 semitonuri) rămâne exclus. Îl putem privi ca pe un punct de referință cu raport semnal-zgomot scăzut, unde ținta e greu de rezolvat, fiind poziționată între două puncte de rezonanță puternice (cvarta perfectă și cvinta perfectă).
Aceasta nu este o listă exhaustivă de reguli melodice ale contrapunctului, dar este suficientă pentru a înțelege ce presupune compunerea unei melodii. Există nenumărate excepții, care adesea adaugă acea "atingere subtilă" a compozitorului, însă ar fi prea complicat pentru exercițiul de față.
Dacă privim melodia ca pe un flux de date:
intervalele treptate sunt pachete cu latență și bandă redusă, care asigură o transmisie lină,
salturile mari sunt pachete de date masive, care necesită verificare de erori (precum compensarea prin mișcare contrară treptată),
În practică, folosind aceeași abordare din patchul Max precedent, dacă avem un flux continuu de date din care generăm înălțimi, putem crea un filtru pentru a clasifica intervalele și un sistem de ponderi care să decidă ce trece printr-un "gate" la un moment dat, privind mereu la pasul anterior pentru a lua o decizie. Într-un fel, aceasta este o analogie bună pentru felul în care lucrează un compozitor: un flux nesfârșit de inspirație care trebuie filtrat și rafinat înainte de a ajunge pe partitura muzicală.
Cu câteva modificări aduse generatorului din patch-ul precedent, obținem un sistem simplu, dar versatil, care ia valori aleatorii și, folosind aritmetică modulară, produce înălțimi aleatorii. Aceste înălțimi sunt apoi comparate în serie pentru a determina intervalele, deoarece ne interesează relațiile dintre ele.
O primă încercare, folosind doar filtrarea pentru a separa intervalele în mișcări treptate, salturi mici și salturi mari, combinată cu un tabel ponderat care controlează un comutator, a transformat secvența total aleatorie de sunete într-una care pare mai structurată, dar încă nu coerentă din punct de vedere muzical. Aceasta corespunde regulilor 2, 3 și 4, având grijă să eliminăm intervalele interzise și să evităm prea multe salturi.
Următorul pas a fost adăugarea unui fel de logică de tip "state machine", care favorizează puternic mișcarea treptată în defavoarea salturilor, lăsând sistemul ponderat să decidă raportul dintre salturile mici și cele mari. Acest pas reflectă regula 1, asigurându-se că mișcarea treptată are prioritate.
În acest punct, melodia infinită generată aleatoriu începe să sune aproape coerent, ceea ce este remarcabil dacă ținem cont că aplicăm doar câteva reguli de Contrapunct asupra unei serii de 12 sunete, și nu asupra unui material modal.
Deși reprezintă o mică incursiune într-un vast teritoriu, scopul acestui articol a fost să arate că jargonul muzical nu ar trebui să împiedice curiozitatea sau înțelegerea. Mulți dintre termenii care înconjoară compoziția pot părea intimidanți la început, dar, în esență, descriu principii profund intuitive.
Contrapunctul nu este altceva decât gestionarea vocilor simultane, nu foarte diferit de modul în care mai multe semnale interacționează în electronică. Armonia poate fi privită ca un automat cu stări: fiecare acord sau sonoritate este o "stare", iar regulile progresiei definesc tranzițiile valide, preferate sau interzise. Ritmul seamănă cu logica de programare, cu structuri imbricate și cicluri care se repetă pe diferite scări temporale.
Privite prin astfel de analogii inspirate din fizică și inginerie, așa-numitele "mistere" ale muzicii se dezvăluie ca tipare naturale pe care oricine le poate înțelege, chiar și fără o pregătire muzicală formală.
de Radu Lazin
de Denisa Lupu
de Ovidiu Mățan
de Bogdan Marcu