Sunetul

2018 in Tehnologie

Istoria muzicii este, in multe privinte, istoria tehnlogiei. De la primele incercari de a scrie muzica (notatia muzicala) pana la designul spatiilor dedicate interpretarii muzicii (acustica) si inventarea instrumentelor muzicale, compozitorii si muzicienii s-au folosit de cele mai noi progrese ale cunoasterii umane pentru a avansa profesional. Prin urmare, nu este o surpriza ca astazi, in epoca computerelor, ei vor fi primii care se vor folosi de progresele tehnologice in electricitate, telecomunicatii sau, in ultimul secol, in informatica pentru a gasi forme noi de exprimare artistica.

Unda de sunet

Dezvoltarea fonografiei - posibilitatea de a reproduce sunetul, mecanic - a avut, in sine, un efect dramatic de transformare asupra culturii, incat pare de neconceput intoarcerea la vremurile in care sunetul provenea doar de la... sursa. Capacitatea de a crea, manipula si reproduce sunetele digital, fara pierderea informatiei, a avut un efect revolutionar asupra modului in care ascultam sunetele. Prin urmare, un artist al sunetelor are astazi la indemana nu doar o larga varietate de unelte de lucru, ci si un mediu propice experimentelor tehnologice.

Muzica si programarea sunetului in arta

Inventarea fonografului de catre Thomas Edison in 1857 si demonstratiile de radiotelegrafie ale lui Nikola Tesla din 1893 au deschis un secol de progrese si inovatii in transmisia electromecanica si reproducerea sunetului. Discul de gramofon al lui Emile Berliner (1887) si dezvoltarea transmisiunilor radio AM de catre Guglielmo Marconi (1922) au facut posibil accesul generalizat la ceea ce inseamna astazi muzica de consum - o industrie globala ce valoreaza zeci de miliarde de dolari. Noile instrumente electronice, de la giganticul (si nepracticul) telharmoniu la mult mai simplul si elegantul theremin, impreuna cu noi tehnologii de inregistrare si transmisiune au deschis calea catre sintetizatoarele, sequencerele si samplerele din ziua de azi.

Telharmoniu

Telharmoniul

Multi compozitori au fost fermecati de potentialul acestor noi medii de transcriere, transmisie si interpretare. Luigi Russolo, compozitorul futurist, scria in 1913 in manifestul "Arta Zgomotelor" despre o orchestra a viitorului ce utilizeaza puterea mecanicii pentru a produce zgomotul (impreuna cu reproducerea fonografica) pentru a "elibera" sunetul de tirania a ceea ce este exclusiv muzical. In monografia sa intitulata "Credo: Viitorul Muzicii" John Cage enunta in 1937 urmatoarea doctrina eliptica:

Folosirea zgomotului in muzica va continua sa se dezvolte pana cand vom ajunge ca muzica sa fie produsa cu ajutorul instrumentelor electrice, ce vor pune la dispozitie multe, daca nu toate sunetele ce pot fi auzite. Suportul fotoelectric, cel de film si cele mecanice vor fi exploatate. Daca, in trecut, divergentele de opinie erau legate de disonanta si consonanta, acestea se vor muta, in viitorul apropiat, intre zgomot si asa-numitele sunete muzicale.

Inventarea si adoptarea benzii magnetice ca suport pentru inregistrarile audio a reprezentat o descoperire importanta pentru compozitorii care doreau sa lucreze doar cu sunetul. In perioada de imediat dupa razboi s-au dezvoltat primele studiouri de muzica electronica in cadrul posturilor de radio din Paris (ORTF) sau Koln (WDM). Compozitorii studioului parizian, in primul rand Perre Henry si Pierre Schaeffer, au dezvoltat o noua tehnica a compozitiei numita muzica concreta, lucrand cu inregistrari directe ale sunetului redate de fonograf sau banda magnetica pentru a realiza compozitii pe care astazi le-am asocia cu samplingul. Lucrarea lui Schaeffer "Étude aux chemins de fer" (1948) sau "Symphonie pour un homme seul" de Pierre Schaeffer si Henry sunt clasice ale genului.

In acelasi timp, la Koln, compozitori ca Herbert Eimart si Karlheinz Stockhausen studiau folosirea oscilatoarelor electromecanice pentru a produce unde sonore pure ce puteau fi mixate si puse in secventa cu o precizie mare. Aceasta clasica elektronische music era in stransa legatura cu tehnicile seriale ale modernistilor avant-garde contemporani, care, estetic, vor reprezenta baza cuantificarii si automatizarii in muzica electronica, si, mai tarziu, muzica pe calculator. Columbia-Princeton Electronic Music Center, fondat de Vladimir Ussachevsky, Otto Luening, Milton Babbitt, si Roger Sessions la New York in 1957, si-a construit reputatia pe uriasul sintetizator RCA Mark II Sound Synthesizer, de marimea unei camere, capabil sa produca si sa puna in secventa tonuri generate electronic cu o precizie fara precedent.

RCA Mark II Sound Synthesizer

RCA Mark II Sound Synthesizer

Pe taramul muzicii comerciale se faceau primii pasi in domeniul ingineriei inregistrarilor, cum ar fi inventia multitrack-urilor (banda magnetica capabila sa inregistreze pe mai multe piste), de catre chitaristul american Les Paul, in 1954. Aceasta tehnologie, ce permitea unui singur interpret sa se inregistreze de mai multe ori pe sine insusi (overdub) pe piste ce puteau fi mai tarziu mixate intr-un compus final a umplut un gol important intehnologia inregistrarilor si a permis o explozie a experimentarilor in studiourile de inregistrare ce a cimentat rolul studioului muzical in productiile comerciale.

Les Paul si consola de mixaj ce ii poarta numele

Les Paul si consola de mixaj ce ii poarta numele

Compozitorii au adoptat mai greu computerul digital ca unealta creativa, datorita faptului ca, initial acesta nu raspundea in timp real si nu avea o interfata intuitiva. Desi prima atestare documentata a folosirii calculatorului pentru a crea muzica a fost in 1951 la Sydney, pe o masina numita CSIRAC, geneza a ceea ce, fundamental, numim astazi muzica pe calculator incepe cu Max Mathews, cercetator la Bell Labs in Statele Unite ce a dezvoltat un software numit MUSIC pentru mainframe-ul IBM 704. In 1957, programul MUSIC randeaza o compozitie de 17 secunde apartinand lui Newmann Guttman numita “In the Silver Scale”.


Chiar daca scopul sau initial era de a dezvolta vorbirea sintetizata la un nivel comprehensibil, Mathews a conceput un sistem de a coda si decoda sunetul digital, capabil sa produca si, in acelasi timp, sa implementeze procese audio digiatale la nivel computational. Simularile sale asupra acestor scheme de reprezentare sunt folosite pe scara larga pana in ziua de azi, si vor fi descrise aici mai tarziu. Dezvoltarea unor masini mai rapide, a limbajelor de programare si a sistemelor digitale capabile de interactiune in timp real au adus o tranzitie rapida de la domeniul analogic la tehnologia computerizata de creare si manipulare a sunetului, un proces care a devenit larg utilizat si comprehensibil abia in anii '90.

Programatorii de sunet (compozitori, sound-designeri) folosesc calculatorul in varii scopuri in cadrul procesului creativ. Multi artisti folosesc calculatorul ca unealta pentru algoritmi si compozitie asistata de calculator amuzicii ce, apoi, este redata off-line. In cazul lucrarii Illiac Suite pentru cvartet de corzi (1957) de Lejaren Hiller compozitorul a rulat un algoritm pe calculator pentru a genera notatii muzicale pentru a fi citite de interpreti "live", asemanator cu orice alta muzica ce foloseste notatii. Aceasta abordare computationala a compozitiei se potrivea cu tendintele estetice moderniste ale secolului XX, printre altele si atribuindu-si controversata titulatura de "cercetator" in loc de "compozitor", cel mai bine articulata de serialisti ca Milton Babbitt si Pierre Boulez, fondatorul IRCAM. Utilizarea calculatorului pentru a manipula limbajul simbolic al muzicii devine indispensabila pentru unii artisti, care vor adopta tehnici imprumutate din cercetarile facute in domeniul inteligentei artificiale in incercarea de a modela stiluri si forme muzicale deja existente. De exemplu, "5000 Works...", de Brian Cope sau "Rough Raga Riffs" a lui Brad Garton utilizeaza tehnici stocastice din teoria informatiei, cum ar fi lanturile Markov, pentru a simula muzica lui J. S. Bach, respectiv muzica indiana carnatica cantata la sitar.

Daca muzica poate fi imaginata ca un set de informatii ce descriu organizarea sunetelor, sinteza si manipularea sunetului reprezinta, in sine, o alta forma de exprimare, in care artistul exploateaza puterea sistemelor computationale. Utilizarea calculatorului ca sursa de sunete sintetizate elibereaza artistul de notiuni preconcepute si de limitarile capacitatii de exprimare la un instrument si ii permite sa se concentreze direct pe artefactul sonor - calculatoarul ii permite sa produca orice sunet imaginabil.


Compozitori ca Jean-Claude Risset (The Bell Labs Catalogue), Iannis Xenakis (GENDYN3) si Barry Truax (Riverrun) au privit computerul ca pe o unealta esentiala in explorarea sunetului in sine in scop compozitional, fie ca este vorba de imitarea instrumentelor reale (Risset) sau despre studii stocastice de aranjamente ale sunetelor sintetizate (Xenakis), fie tehnici ce au culminat cu stabilirea principiilor sintezei granulare (Truax). Calculatorul ofera, deasemenea, posibilitati extinse pentru asamblarea si manipularea sunetelor pe modelul muzicii concrete, oferind, totodata, multitudinea de alternative a lumii digitale. Procesul de compozitie al sampling-ului digital, fie el folosit in productii pop (Brian Eno si David Byrne’s - My Life in the Bush of Ghosts, Public Enemy - Fear of a Black Planet) sau in compozitii conceptuale (John Oswald - Plunderphonics, Chris Bailey - Ow, My Head) este cu mult mai usor datorita formei digitale pe care o ia sunetul. Calculatorul permite transcodarea (conversia) sunetului in reprezentari ce permit reinvestigari radicale, cum ar fi lucrarile de time-stretching ale lui Leif Inge (9 Beet Stretch - o "alungire" de 24 de ore a Simfoniei a IX-a a lui Beethoven).

Artistii ce lucreaza cu sunete combina, de multe ori, aceste doua abordari, ce permit crearea de lucrari de arta sonora generate, la care structura interna, dar si generarea sunetelor si redarea lor este determinata computational. Artsti cum ar fi Michael Schumacher, Stephen Vittelio, Carl Stone, sau Richard James (Aphex Twin) folosesc astfel de abordari in lucrarile lor.


Calculatorul ofera posibilitati nelimitate unui "performer" si devine agent interactiv in interpretarea sonora, permitand artistului integrarea acompaniamentului algoritmic (George Lewis), designul de hyperinstrument (Laetitia Sonami, Interface) si procesarea de digitala de efecte (Pauline Oliveros, Mari Kimura) in repertoriile lor.

Sa trecem in revista cateva din tehnologiile specifice care ne permit lucrul cu sunete in domeniul digital.

Informatica sunetului si a muzicii

Sunetul este o vibratie ce se deplaseaza intr-un mediu (de obicei, aerul) pe care o percepem cu ajutorul simtului auzului. Sunetul se propaga ca o unda longitudinala care, alternativ, comprima si decomprima moleculele de materie (aer) prin care trece. Prin urmare, de obicei vom reprezenta sunetul ca un grafic al presiunii in timp:

Aceasta reprezentare in timp a sunetului ne da o descriere fidela a modului in care se comporta sunetul in lumea reala, si, asa cum vom vedea imediat, este cea mai folosita reprezentare in lucrul cu sunetele digitizate. Daca incercam sa facem o descriere tehnica a undei acustice, putem identifica cu usurinta cateva valori care ne ajuta sa intelegem ce se intampla. La prima vedere, daca ne uitam la cantitatea dislocata de unda sonora putem masura amplitudinea sunetului. Aceasta poate fi masurata pe o scala stiintifica in pascali presiune, dar in mod curent, este cuantificata pe o scala logaritmica, in decibeli. Daca unda de presiune se repeta intr-un mod regulat sau periodic, ne putem uita la lungimea de unda a unei singure iteratii a sablonului si sa determinam frecventa undei. De exemplu, daca sunetul ce se deplaseaza printr-un mediu cu viteza de 343 m/s (viteza sunetului prin aer la temperatura camerei) contine o unda ce se repeta la fiecare jumatate de metru, acest sunet va avea frecventa de 686 hertzi, sau cicluri pe secunda. In figura de mai jos avem reprezentarea unei note cantate pe violocel avand 440 Hz; sablonul periodic al undei (demarcat de liniile verticale) se repeta la fiecare 2,27 milisecunde:

In mod normal, sunetele pe care le intalnim in lumea reala au in componenta mai multe frecvente discrete. In sunetele zgomotoase, aceste frecvente pot fi fara nicio legatura unele cu altele, sau pot fi grupate dupa o anumita tipologie a limitelor (de ex. un sunet de toba mica poate produce frecvente aleatorii intre 200 si 800 Hz). In sunetele armonice, insa, aceste frecvente sunt, cel mai adesea, raspandite in rapoarte (fractii) de numere intregi, astfel ca un violoncel ce canta o nota la 200 Hz va produce frecvente nu doar la fundamentala de 200, ci si la multiple de 200 in serie armonica, adica la 400, 800, 1200, 1600, 2000 si asa mai departe. Un cantaret ce produce aceeasi nota va avea aceleasi componente de frecventa in voce, dar in proportii diferite fata de violoncel. Prezenta, absenta si taria relativa a acestor armonice (numite si partiale sau supratonuri - eng. partials, overtones) vor avea ca rezultat ceea ce percepem ca timbrul sunetului.

Cand un sunet ne ajunge la ureche are loc o importanta translatie senzoriala, a carei intelegere este esentiala in lucrul cu materialul audio. La fel cum lumina de diferite lungimi de unda si intensitati excita diferiti receptori aflati in retina pentru a produce o imagine in culori, cochlea din urechea interna contine o suprafata de celule capilare specializate, pe membrana bazilara, ce raspund diferitelor frecvente ale sunetului. Urechea interna contine celule auditive ce raspund frecventelor situate, mai mult sau mai putin, intre 20 si 20 000 Hz, insa multe dintre acestea se vor desensibiliza in timp, odata cu varsta, sau datorita expunerii la sunete puternice. Aceste celule transmit semnale electrice prin nervul auditiv catre cortexul auditiv, unde sunt procesate pentru a crea o imagine a domeniului de frecvente a sunetului perceput de ureche:

Aceasta reprezentare a sunetului ca plaja de frecvente si amplitudini independenta de timp este mult mai apropiata de felul in care percepem realitatea sonora din jur, fata de reprezentarea in presiune pe timp. Jean-Baptiste-Joseph Fourier, un matematician francez din secolul al XIX-lea, a dezvoltat ecuatiile ce permit translatarea unei unde de presiune sonora (indiferent cat de complexa ar fi ea) in frecventele si amplitudinile sale constituente. Transformarile Fourier sunt o unealta importanta in lucrul cu sunetele pe calculator.

Sistemul nostru auditiv preia fluxul informational de frecvente si amplitudini ce ajunge la cele doua urechi si construieste o imagine audio, o "scena", la fel cum se intampla cu imaginea lumii data de lumina ce ajunge la retina ochilor. Creierul analizeaza informatia acustica in baza unor parametri cum ar fi timpul de atac, corelatia stereofonica, rata armonica sau complexitatea pentru a analiza si identifica sursele acustice, care sunt apoi amplasate intr-o imagine tridimensionala a ceea ce auzim. Multi dintre parametri despre care psihoacusticienii cred ca ii folosim pentru a intelege mediul incojurator sonor se comporta aidoma principiilor grupurilor definite de psihologia Gestalt.

Daca definim muzica, cu larghete, ca fiind organizarea si reproducerea sunetelor, un nou set de valori folositoare apar. Fara a incerca sa realizam un tablou comprehensiv al teoriei muzicii, trebuie sa notam ca exista un vocabular destinat descrierii muzicii, a sunetului in general. Percepem taria si inaltimea sunetului (echivalenti folositori ai amplitudinii si frecventei) functionand pe o scala logaritmica, astfel, un ton de 100 Hz, respectiv 200 Hz se vor afla la aceeasi distanta unul de celalalt ca si un sunet de 2000 si unul de 4000 Hz. Distanta dintre un sunet si dublul frecventei sale poarta numele de octava si reprezinta un principiu fundamental pentru mai toate teoriile muzicale evoluate cultural. Majoritatea culturilor muzicale impart octava in subdiviziuni de note (12 intervale pe scala cromatica occidentala, 7 in scala Indoneziana pelog) ce sunt grupate, apoi, in mai multe colectii (de moduri sau game). Acestea reflecta un sistem de acordaj, ce permite muzicienilor sa cante impreuna; de exemplu, nota A4 (nota La de deasupra Do-ului de mijloc) in Scala Occidentala este, de obicei, calibrata la 440 Hz in muzica contemporana.

Reprezentarea digitala a sunetului si a muzicii

In general, sunetul este introdus in calculator din lumea externa (si vice versa) conform reprezentarii in timp prezentata anterior. Inainte de a fi digitizat, unda de presiune acustica sonora este convertita intr-o unda electromagnetica care este analoaga directa celei acustice. Acest semnal electric este apoi introdus intr-un echipament electronic numit convertor analog-digital (ADC sau A/D), care va digitiza sunetul sampland amplitudinile undei de presiune la intervale regulate si cuantificand numeric presiunea. Aceste citiri sunt apoi transmise in mici pachete, sau vectori, catre procesor, unde pot fi stocate si procesate. Similar, vectorii de sample-uri digitale pot fi transmise din computer catre un convertor digital-analog (DAC sau D/A), ce preia datele numerice si le foloseste pentru a construi o unda electromagnetica de presiune "netezita" ce poate fi trimisa catre un difuzor sau un alt echipament pentru redare.

Majoritatea sistemelor digitale audio contemporane (placi de sunet, etc) contin ambele convertoare, atat A/D cat si D/A, de multe ori mai mult de unul de fiecare, pentru inregistrare stereo sau multi-canal si pot fi folosite simultan (asa-numitul full duplex audio). Sistemul specific de codare si decodare folosit in aceasta metodologie poarta numele de PCM (sau pulse code modulation) si a fost dezvoltat in 1937 de catre Alec Reeves; PCM ramane pana astazi sistemul utilizat pe scara larga in industria audio.

Viteza la care semnalele audio sunt digitizate parta numele de rata de esantionare (eng. sampling rate); reprezinta rezolutia ce determina cea mai inalta frecventa de sunet ce poate fi masurata (egala cu jumatate din rata de esantionare, conform teoremei lui Nyquist). Rezolutia numerica a fiecarui sample in ceea ce priveste stocarea pe calculator se numeste bit depth; valoarea ei determina cate niveluri discrete de amplitudine pot fi descrise de semnalul digitizat. Semnalul digital audio pe un Compact Disc este digitizat la 44 100 Hz cu o rezolutie de 16 biti, ce permite frecvente de pana la 22 050 Hz (putin peste intervalul de auz al omului), cu 65 536 (216) niveluri diferite de amplitudine posibile pentru fiecare sample. Sistemele audio profesionale merg si mai sus (96 sau 192 kHz la 24 sau 32-biti rezolutie), in vreme ce sistemele din industria telefoniei vor merge in jos (8 192 kHz la 8 biti). Sunetul digitalizat reprezentand mai multe surse acustice (instrumente) sau destinatii (difuzoare) poarta denumirea de audio multi-canal (eng. multitrack audio). Sistemele monaurale constau, natural, dintr-un singur stream; cele stereo (dual stream) reprezinta standardul la toate sistemele audio de calculator contemporane, in vreme ce mai multe variante de sunet surround (5 sau 7 stream-uri audio, cu unul sau mai multe canale speciale pentru frecvente joase) devin din ce in ce mai populare.

Odata ajuns in calculator, sunetul este stocat intr-o varietate de formate, atat ca secvente de sample-uri PCM, cat si in alte reprezentari. Doua din cele mai comune formate de fisier PCM sunt AIFF (Audio Interchange File Format) dezvoltat de Apple Computer and Electronic Arts si WAV (Microsoft si IBM) si sunt echivalente ca interoperabilitate si calitate. Ambele sunt formate "lossless" - fara pierderi de date - contin date PCM necomprimate din sursa digitizata. In ultimii ani, formatele de fisiere audio compresate au intrat in atentie, notabil MP3 (MPEG-1 Audio Layer 3), codecul Vorbis si codecul AAC (Advanced Audio Coding). Aceste formate "cu pierderi" transpun sunetul in domeniul frecventelor (folosind transformari Fourier sau o tehnica inrudita numita Linear Predictive Coding) pentru a impacheta sunetul intr-un mod ce permite ca anumite alegeri de a comprima sunetul sa fie facute in functie de modelul auzului uman, ignorand frecventele irelevante. Spre diferenta de formatele PCM ante-descrise, fisierele MP3 sunt mai greu de codat, manipulat si procesat in timp real, datorita faptului ca necesita pasi suplimentari de compresie si decompresie in timp.

Sinteza

Sistemele audio digitale indeplinesc in mod obisnuit o varietate de sarcini, ruland procesele in retele de procesare a semnalului (eng. signal processing networks). Fiecare nod al retelei indeplineste o sarcina simpla, fie de generare, fie de procesare a semnalului audio. Majoritatea aplicatiilor software pentru generarea si manipularea sunetului pe calculator urmeaza aceasta paradigma, descrisa pentru prima oara de Max Mathews ca modelul de unitate de generare a muzicii pe calculator, unde o harta sau functie grafica a unui lant de procesare de semnal este executata pentru fiecare sample (sau vectori de sample-uri) ce trece prin sistem. Un algoritm simplu pentru sinteza sunetului cu ajutorul calculatorului poate fi implementat cu ajutorul acestei paradigme folosind doar trei unitati generatoare, descrise dupa cum urmeaza.

In primul rand, sa presupunem ca avem o unitate generatoare ce produce o unda de sunet repetitiva si are un parametru de control al frecventei la care se repeta.

Vom numi aceasta bucata de cod un oscilator. Majoritatea oscilatoarelor digitale functioneaza prin a reda tabele sau array-uri (multimi ordonate) de date audio PCM ce descriu o anumita forma de unda. Aceste wavetables pot contine sabloane extrem de simple din lumea reala (de exemplu o singura nota, cantata la pian, inregistrata profesional).

Daca cantam direct la oscilator (setam frecventa sa la o valoare audibila si o transmitem direct catre DAC), vom auzi un ton constant, wavetable-ul se repeta iar si iar. Pentru a obtine un sunet mai nuantat si mai articulat, am putea sa variem volumul oscilatorului in timp, astfel incat sa ramana mut pana cand nu dorim ca sunetul sa se auda. Atunci, oscilatorul va creste in volum pana cand apare sunetul. Cand dorim ca sunetul sa dispara, scadem volumul. In loc sa rescriem oscilatorul pentru a interpreta informatiile legate de volum, introducem o unitate generator noua, ce preia o lista de informatii legate de timp si amplitudine si le foloseste pentru a genera o envelope (anvelopa de sunet) - o panta, variabila in timp. Acest envelope generator va genera un semnal audio cu valori intre 0 si 1, desi sunetul pe care il produce nu este perceput direct. O a treia unitate generator va avea rolul de a inmulti, sample cu sample, iesirea oscilatorului cu iesirea unitatii envelope generator. Acest cod amplificator ne permite sa folosim panta anvelopei pentru a schimba dinamic volumul oscilatorului, pentru ca sunetul sa apara (fade-in) si dispara (fade-out) dupa cum dorim.

In sinteza comerciala, multi alti algoritmi pot fi introdusi in reteaua semnalului - de exemplu, un filtru ce modifica forma continutului frecventei inainte de a ajunge la amplificator. Multi algoritmi de sinteza se bazeaza pe mai mult de un oscilator, fie dispusi paralel (additive synthesis, cand pot fi create sunete complexe prin adaugarea de noi, simple waveforms), fie prin modulatie (de ex. modularea frecventei, cand un oscilator moduleaza pitch-ul unui alt oscilator).

Sampling-ul

In loc sa folosim un wave scurt din calculator pe post de oscilator, putem folosi o bucata mai lunga de inregistrare stocata ca AIFF sau WAV pe hard-disk. Acest sample poate fi apoi redat la diferite rate, alterand-ui pitch-ul. De exemplu, daca redam sunetul la dublul vitezei la care a fost inregistrat va rezulta o crestere a pitch-ului (inaltimii) cu o octava. La fel, daca injumatatim viteza de redare, vom obtine o octava mai jos.

Cele mai multe samplere (instrumente muzicale ce redau sunetele inregistrate ca sursa de sunet) functioneaza pe presupunerea ca o inregistrare are o anumita frecventa de baza care, desi este de multe ori legata de inaltimea reala la care a fost inregistrat instrumentul, este, in fapt, arbitrara si reprezinta, de fapt, doar frecventa la care samplerul va reda sunetul la viteza normala. Daca, de exemplu, inregistram un violoncelist ce canta o nota la 220 Hz (nota La de sub Do-ul de mijloc in scala Occidentala), ne dorim ca inregistrarea sa fie redata normal cand cerem samplerului sa ne cante o nota la 220 Hz. Daca cerem samplerului o alta frecventa, el va imparti frecventa ceruta la frecventa de baza si va folosi raportul pentru a determina viteza de redare (playback). Daca vrem sa auzim un sunet de 440 Hz din sample-ul nostru de violoncel, il vom reda la o viteza dubla. Daca vrem sa auzim un Do-ul de mijloc (261.62558 Hz), vom face playback-ul la 1.189207136 din viteza originala.

Multe samplere folosesc inregistrari ce au asociate meta-date ce ajuta algoritmul samplerului sa cante corect sunetul. Frecventa de baza este, adesea, una din informatiile de acest fel, la fel asa-numitele loop-points in inregistrare, pe care samplerul le poate folosi cu succes pentru a prelungi inregistrarea originala. Un sample de coarde de orchestra, de exemplu, incarcat intr-un sampler comercial, poate fi doar de cateva secunde lungime, dar un producator sau un keyboard player poate avea nevoie ca sunetul sa dureze mult mai mult; in acest caz, inregistrarea este in asa fel facuta incat, undeva la mijloc, sa aiba o regiune ce poate fi repetata la infinit, daca e nevoie, creand senzatia unei inregistrari lungi.

Efecte de procesare

Pe langa rolul de generator de sunet, calculatorul este folosit pe post de masina de procesat sunetul. Domeniul DAP (digital audio processing) este unul dintre cele mai importante in cercetarea academica sau comerciala in comunitatile de muzicieni pe calculator si industria muzicala comerciala. Vitezele din ce in ce mai mari de procesare, dar si standardizarea sistemelor de procesare digitala permit ca tehnicile de procesare sa poata fi realizate in timp real, fie cu ajutorul algoritmilor software, fie cu ajutorul coprocesoarelor DSP, cum ar fi Digidesign TDM sau TC Powercore.

Asa cum s-a vazut anterior la reprezentarile audio, procesarea digitala a efectelor se face folosind algoritmi de timp sau de frecventa, ce proceseaza un stream de vectori audio. Un efect de ecou, de exemplu, poate fi implementat cu usurinta prin crearea unui buffer de memorie pentru sample, pentru a intarzia sunetul si a-l reda ulterior, mixat cu originalul. Delay-urile foarte scurte (de unul sau mai multe sample-uri) pot fi folosite pentru a implementa filtre digitale, ce atenueaza sau accentueaza diferite plaje de frecventa a sunetului. Delay-urile putin mai lungi creeaza puncte de rezonanta, numite comb filters (filtre pieptene), ce reprezinta un pas important in recrearea de ecouri scurte de reverberatie. Un filtru pieptene de delay variabil creaza efectul numit flanger. Delay-urile mai lungi sunt folosite pentru a crea varietati de ecouri, reverberatii si sisteme de looping ce sunt utilizate la efectele de pitch-shifting (variind viteza de redare a unui sunet usor intarziat).

Analiza audio

Un alt important domeniu de studiu, in special in cazul spatiilor audio interactive, este extragerea informatiei din analiza audio. Recunoasterea vorbirii (speech recognition) este, poate, cea mai evidenta aplicatie, si o varietate de paradigme exista astazi in aceast domeniu de cercetare, impartite intre sisteme "antrenate" (ce accepta un vocabular extins din partea unui unic utilizator) si cele "neantrenate" (ce recunosc un numar redus de cuvinte din partea unui numar mare de utilizatori). Multe din uneltele implementate in recunoasterea discursului pot fi abstractizate pentru a obtine o multitudine de informatii din varii surse de sunet.

Sistemele interactive ce "asculta" un flux de intrare audio folosesc, de regula, cateva tehnici simple de pentru a rezuma o sursa complexa de sunet intr-o sursa de control ce poate fi mapata in designul interactiv. De exemplu, un grafic al amplitudinii medii al unui semnal audio in timp poate fi folosit pentru a modula continuu o variabila printr-o tehnica numita envelope following. In mod similar, un un prag de amplitudine poate fi setat pentru a declansa un eveniment cand sunetul ajunge la un anumit nivel; aceasta tehnica de detectare a timpilor de atac ("atac" este un termen comun pentru a desemna debutul unui sunet) poate fi folosita, de exemplu, pentru a crea o imagine vizuala sincronizata cu sunetele percusive care intra in computer.

Tehnica de urmarire a pitch-urilor, ce utilizeaza o varietate de metode de analiza pentru a detecta frecventa fundamentala a unui sunet de intrare, rezonabil din punct de vedere armonic, este adesea folosita in muzica interactiva pentru a urmari un muzician in timp real, comparand notele sale cu o partitura din memoria calculatorului. Aceasta tehnica de urmarire a notelor poate fi utilizata pentru a crea secvente de evenimente interactive intr-un program de calculator fara a mai avea nevoie de informatii absolute de sincronizare si permite muzicienilor sa se abata de la un ritm strict, sa improvizeze sau sa ofere o interpretare mai fluida in prestatiile lor.

Exista, de asemenea, o mare varietate de instrumente de analiza timbrala pentru a transforma un semnal audio in date care pot fi mapate catre evenimente interactive. Algoritmi simpli, cum ar fi contoarele de trecere prin zero (zero-crossing counters), ce marcheaza numarul de ori in care un semnal audio trece de la o polaritate negativa la una pozitiva in timp, pot fi folosite pentru a determina cantitatea de zgomot dintr-un semnal audio. Analiza Fourier poate fi de asemenea utilizata pentru a gasi, de exemplu, cele 5 componente de frecventa cele mai puternice intr-un sunet, permitand ca sunetul sa fie analizat pentru armonicitate sau deschidere timbrala (brightness). Filtrele de banci si anvelopele de urmarire pot fi combinate pentru a imparti un sunet in intervale de frecventa care se suprapun si care pot fi apoi folosite pentru a declansa un alt proces. Aceasta tehnica este folosita intr-o unitate de efecte des folosita numita vocoder, in care un semnal armonic (cum ar fi un sintetizator) va avea diferite intervale de frecventa amplificate sau atenuate de un alt semnal zgomotos (de obicei cuvantul vorbit). Efectul este acela al unui sunet "vorbind" printr-un alt sunet si poarta numele de sinteza incrucisata (eng. cross-synthesis).

Muzica sub forma de informatie

Reprezentarile digitale ale muzicii, spre deosebire de cele ale sunetului, variaza foarte mult in ceea ce priveste amploarea si caracterul. Cel mai comun sistem pentru reprezentarea datelor privind performantele muzicale in timp real este specificatia MIDI (Musical Instrument Digital Interface), lansata in 1983 de un consortiu de producatori de sintetizatoare, pentru a incuraja interoperabilitatea intre diferitele branduri de echipamente muzicale digitale. Pe baza unei specificatii seriale unidirectionale, de viteza redusa, MIDI reprezinta diferite categorii de evenimente muzicale (note, schimbari de continuitate, tempo si informatii de sincronizare) ca valori numerice abstracte, aproape intotdeauna cu o rezolutie numerica de 7 biti (0-127).

De-a lungul anilor, complexitatea din ce in ce mai mare a sintetizatoarelor si a sistemelor de muzica pe calculator a atras atentia asupra dezavantajelor simplitatii specificatiei MIDI. In special lipsa suportului pentru transmiterea rapida a specificatiilor digitale de sunet digital si de precizie, a sintaxei specificatiilor de control pentru sintetizatoare de-a lungul unui singur cablu a condus la o serie de sisteme alternative. Open Sound Control, dezvoltat de o echipa de cercetare de la Universitatea din California, Berkeley, face o presupunere interesanta, si anume ca ca studioul de inregistrare (sau studioul de muzica de calculator) al viitorului va utiliza interfetele standard de retea (Ethernet sau comunicatii TCP / IP fara fir) ca mediu pentru comunicare. OSC permite un model client-server de comunicare intre controale (tastaturi, ecrane tactile) si dispozitive audio digitale (sintetizatoare, procesoare de efecte sau computere cu scop general), toate prin pachetele UDP transmise in retea.

Unelte pentru programarea sunetului

O gama larga de instrumente sunt la indemana artistulului digital care lucreaza cu sunete. Inregistrarea, editarea, mixarea si redarea sunetului sunt de obicei realizate prin intermediul editoarelor de sunet digital si al asa-numitelor DAW-uri (Digital Workstation). Editoarele de sunet variaza de la software open source si gratuit (Ardor, Audacity) pana la soft-uri de studio sau programe live (Ableton Live, Logic Pro, Digital Performer, Nuendo, Pro Tools). De obicei, aceste programe va permit sa importati si sa inregistrati sunete, sa le editati cu functii de copiere (copiere, lipire etc.) si sa efectuati diverse activitati simple de procesare a sunetului digital (DSP) nedistructiv asupra fisierului de sunet, cum ar fi normalizarea semnalului, editari fade-in si fade-out sau conversia ratei de esantionare. Adesea aceste programe vor actiona ca program gazda (host) pentru plug-in-uri software concepute din start pentru a lucra in interiorul DAW-ului.

DAW-urile audio digitale ofera o gama completa de instrumente de inregistrare, redare, prelucrare si mixaj pe mai multe piste, permitand producerea de proiecte de mari dimensiuni, stratificate. Software-ul DAW este acum considerat standard in industria muzicii de inregistrare si productie. Software-ul Avid / Digidesign Pro Tools, considerat standard industrial, permite inregistrarea si mixajul mai multor piste audio (track-uri) in timp real, de-a lungul unei cronologii aproape asemanatoare cu cea dintr-un mediu video NLE (editare neliniara). Curbele de automatizare pot fi desenate pentru a specifica diferiti parametri (volum, panoramare) ai acestor track-uri, care contin clipuri audio ("regiuni" sau "soundbites") care pot fi asamblate si editate nedistructiv. Alte aplicatii software DAW de pe piata sunt Logic Audio de la Apple, Digital Performer al Mark of the Unicorn sau Cubase de la Steinberg. Toate aceste platforme accepta si plug-in-uri audio de la terte parti scrise intr-o varietate de formate, cum ar fi AudioUnits (AU) Apple, Virtual Studio Technology (VST) al Steinberg sau formatul DirectX al Microsoft. Cele mai multe programe DAW includ, de asemenea, suport extins pentru MIDI, permitand pachetului software sa controleze si sa creeze sintetizatoare externe, samplere si masini de tobe (drum machines); de asemenea si "instrumente" plug-in software ce ruleaza in interiorul DAW-ului in sine ca generatoare de sunet. In 2001, Ableton a introdus un software revolutionar DAW numit LIVE. Acest software nu este dedicat doar muncii de studio, ce imita iregistrarea pe banda, ci este indreptata si spre live performance si revitalizeaza idiomul cue-urilor. Utilizatorii pot trece la vizualizarea LIVE, care este o vizualizare neliniara a materialului muzical, bazata pe module si organizat in liste.

Limbajele muzicale clasice de computere, din care majoritatea provin din programul MUSIC al lui Max Mathews, sunt utilizate pana in prezent. Unele dintre acestea, cum ar fi CSound (dezvoltat de Barry Vercoe la MIT), au numerosi adepti si sunt predate in studiourile de muzica pe calculator ca instrumente standard pentru compozitia electroacustica. Majoritatea acestor programe MUSIC-N utilizeaza fisiere text pentru intrare, desi, mai nou, sunt accesibile cu ajutorul editoarelor grafice pentru a indeplini mai multe sarcini. De obicei se folosesc doua fisiere tip text; primul contine o descriere a sunetului care urmeaza sa fie generat utilizand un limbaj de specificatii care defineste unul sau mai multe "instrumente" realizate prin combinarea generatoarelor simple de unitati. Un al doilea fisier contine "score-ul" (partitura), o lista de instructiuni care specifica ce instrument din primul fisier va canta care anume eveniment, cand, pentru cat timp si cu ce parametri variabili. Majoritatea acestor programe merg mai departe decat simpla sinteza si procesare audio, pentru a facilita compozitia algoritmica, adesea construita pe un limbaj de programare standard. De exemplu, pachetul CLM al lui F. Richard Moore se bazeaza pe Common LISP. In ultimii ani, unele dintre aceste limbaje au fost modificate pentru a lucra in timp real (diferit de randarea unui fisier de sunet pe disc); Real-Time Cmix, de exemplu, contine un C-style parser, precum si suport pentru conectivitate de la utilizatori prin LAN si MIDI.

Au fost dezvoltate o serie de medii de muzica computerizata cu premisa interactiunii in timp real ca principiu fundamental al sistemului. Mediul de dezvoltare Max pentru mass-media in timp real, dezvoltat pentru prima data la IRCAM in anii 1980 si dezvoltat in prezent de Cycling'74, este un sistem de programare vizuala bazat pe un grafic de control al "obiectelor" care executa si isi transmit reciproc mesaje in timp real. Extensiile MSP pentru Max permit proiectarea unor sisteme de sinteza si procesare a semnalului personalizabile, care ruleaza toate in timp real. Un alt program open-source, considerat fratele mai mare al lui Max, se numeste Pure Data si a fost dezvoltat de tot de autorul lui Max, Miller Puckette. Programul SuperCollider al lui James McCartney, care este open source, si software-ul ChucK al lui Ge Wang si Perry Cook sunt ambele limbaje textuale concepute pentru a executa algoritmi de sunet interactiv in timp real.

La final, trebuie pomenite si limbajele standard de calculator, ce au la randul lor o varietate de API-uri din care putem alege atunci cand lucram cu sunetul. JSyn (Java Synthesis) al lui Phil Burke ofera un API pe baza de generatoare de unitati pentru realizarea sintezei si procesarii sunetului in timp real in Java. CCRMA Synthesis ToolKit (STK) este o biblioteca C++ de rutine care are ca scop programarea si designul low-level al sintetizatoarelor si este axat pe tehnologia modelarii fizice de sinteza.

Sound, o biblioteca pentru procesare de sunet ce are multe caracteristici comune cu limbajele mai sus mentionate, este utilizata in exemplele folosite in acest text.


Exemplele 1, 2 - Sintetizatorul

Exemplele ce urmeaza prezinta doua metode de baza pentru sinteza sunetului. In primul, un cluster de sunet este creat prin insumarea a cinci unde sinusoidale (eng. sine waves). Pentru a calcula amplitudinea corecta a fiecarei sinusoide se completeaza o matrice de numere flotante corespunzatoare amplitudinii fiecarui oscilator. Pentru inceput, amplitudinea maxima de 1.0 este impartita la numarul de oscilatoare, pentru a evita depasirea amplitudinii maxime globale. Apoi, amplitudinea este redusa cu un factor de 1 / (i + 1), ceea ce face ca frecventele mai inalte sa fie mai silentioase decat frecventele mai joase. Frecventa fiecarui oscilator este calculata cu ajutorul functiei draw (). Bazandu-se pe o frecventa fundamentala variabila intre 150 si 1150 Hz, overtone-urile armonice sunt calculate prin inmultirea frecventei cu numere intregi de la 1 la 5. Un factor de detune cu valori intre -0.5 si 0.5 este aplicat apoi, pentru a devia dintr-un spectru armonic pur intr-un cluster dizarmonic de sunete.

In cel de-al doilea exemplu, functiile de envelope sunt folosite pentru a crea sunete-eveniment, aidoma notelor cantate pe un instrument. Sunetul este descris de o envelope ASR (attack / sustain / release) ce descrie amplitudinea in timp. Cu o ASR envelope se pot defini o faza a atacului, una de sustain si una de release in secunde. In acest caz, un array de note MIDI este transpus in frecvente de functia midiToFreq(). Pentru a realiza o secventa a succesiunii de note vom crea un trigger (declansator) descris de timp si de durata dintre note.

/**
 * Processing Sound Library, Example 1
 * 
 * Five sine waves are layered to construct a cluster of frequencies. 
 * This method is called additive synthesis. Use the mouse position 
 * inside the display window to detune the cluster.
 */

import processing.sound.*;

SinOsc[] sineWaves; // Array of sines
float[] sineFreq; // Array of frequencies
int numSines = 5; // Number of oscillators to use

void setup() {  
  size(640, 360);
  background(255);

  sineWaves = new SinOsc[numSines]; // Initialize the oscillators
  sineFreq = new float[numSines]; // Initialize array for Frequencies

  for (int i = 0; i < numSines; i++) {
    // Calculate the amplitude for each oscillator
    float sineVolume = (1.0 / numSines) / (i + 1);
    // Create the oscillators
    sineWaves[i] = new SinOsc(this);
    // Start Oscillators
    sineWaves[i].play();
    // Set the amplitudes for all oscillators
    sineWaves[i].amp(sineVolume);
  }
}

void draw() {
  //Map mouseY from 0 to 1
  float yoffset = map(mouseY, 0, height, 0, 1);
  //Map mouseY logarithmically to 150 - 1150 to create a base frequency range
  float frequency = pow(1000, yoffset) + 150;
  //Use mouseX mapped from -0.5 to 0.5 as a detune argument
  float detune = map(mouseX, 0, width, -0.5, 0.5);

  for (int i = 0; i < numSines; i++) { 
    sineFreq[i] = frequency * (i + 1 * detune);
    // Set the frequencies for all oscillators
    sineWaves[i].freq(sineFreq[i]);
  }
}
	

/**
 * Processing Sound Library, Example 2
 * 
 * This sketch shows how to use envelopes and oscillators. 
 * Envelopes describe to course of amplitude over time. 
 * The Sound library provides an ASR envelope which stands for 
 * attack, sustain, release. 
 * 
 *       .________
 *      .          ---
 *     .              --- 
 *    .                  ---
 *    A       S        R 
 */

import processing.sound.*;

// Oscillator and envelope 
TriOsc triOsc;
Env env; 

// Times and levels for the ASR envelope
float attackTime = 0.001;
float sustainTime = 0.004;
float sustainLevel = 0.2;
float releaseTime = 0.2;

// This is an octave in MIDI notes.
int[] midiSequence = { 
  60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72
}; 

// Set the duration between the notes
int duration = 200;
// Set the note trigger
int trigger = 0; 

// An index to count up the notes
int note = 0; 

void setup() {
  size(640, 360);
  background(255);

  // Create triangle wave and envelope 
  triOsc = new TriOsc(this);
  env  = new Env(this);
}

void draw() { 

  // If value of trigger is equal to the computer clock and if not all 
  // notes have been played yet, the next note gets triggered.
  if ((millis() > trigger) && (note<midiSequence.length)) {

    // midiToFreq transforms the MIDI value into a frequency in Hz which we use 
    //to control the triangle oscillator with an amplitute of 0.8
    triOsc.play(midiToFreq(midiSequence[note]), 0.8);

    // The envelope gets triggered with the oscillator as input and the times and 
    // levels we defined earlier
    env.play(triOsc, attackTime, sustainTime, sustainLevel, releaseTime);

    // Create the new trigger according to predefined durations and speed
    trigger = millis() + duration;

    // Advance by one note in the midiSequence;
    note++; 

    // Loop the sequence
    if (note == 12) {
      note = 0;
    }
  }
} 

// This function calculates the respective frequency of a MIDI note
float midiToFreq(int note) {
  return (pow(2, ((note-69)/12.0)))*440;
}


Exemplele 3, 4 - Redarea unui sample

Redarea fisierelor audio cu ajutorul bibliotecii Sound este destul de simpla. Clasa Soundfile trebuie doar sa fie instantiata cu o cale catre fisier. Exemplul 3 foloseste o matrice de fisiere de sunet ca baza pentru un sampler. Fisierele sunt numite prin numere intregi, ceea ce face usoara citirea lor intr-o matrice bucla (loop). Clasa Soundfile are o metoda numita rate() care ne permite sa schimbam rata de esantionare a redarii, pe scurt, viteza si, prin urmare, pitch-ul. Valoarea implicita este egala cu 1. Daca ii atribuim valoarea 0.5, viteza de redare va fi la jumatate, iar pitch-ul va fi o octava sub original. Pentru 2.0, pitch-ul va fi o octava deasupra originalului si viteza va fi dubla. Aceasta este metoda cea mai simpla pentru modificarea pitch-ului si o putem folosi pentru a genera o compozitie algoritmica simpla. In acest exemplu este creat un trigger ce reprezinta timpul curent in milisecunde plus un intreg aleator intre 200 si 1000 milisecunde. Dupa acest moment sunt desenate pana la 5 dreptunghiuri, fiecare colorat intr-o culoare oarecare. Deoarece aceasta declaratie se afla intr-o bucla, este usor sa fie redate pana la 5 note cu o singura linie de cod. Inainte de a face asta, fiecarui sunet ii este atribuita o octava aleatorie. Numarul de dreptunghiuri si sunete pe care le vom canta este determinat de array-ul playSound. Aceasta matrice este reasignata la fiecare noua iteratie a sequencer-ului, iar cand indexul ajunge la 1, este redat fisierul corespunzator din matricea Soundfile si un dretunghi va fi desenat.

/**
 * Processing Sound Library, Example 3
 * 
 * This example shows how to make a simple sampler and sequencer 
 * with the Sound library. In this sketch, five different samples are 
 * loaded and played back at different pitches, in this case five 
 * different octaves. The sequencer triggers an event every 200-1000 
 * milliseconds randomly. Each time a sound is played a colored 
 * rect with a random color is displayed.
 */

import processing.sound.*;

SoundFile[] files;

// Create an array of values which represent the octaves. 
// 1.0 is playback at normal speed, 0.5 is half and therefore 
// one octave down. 2.0 is double so one octave up.
float[] octave = { 
  0.25, 0.5, 1.0, 2.0, 4.0
};

// The playSound array is defining how many samples will be 
// played at each trigger event
int[] playSound = { 
  1, 1, 1, 1, 1
};

// The trigger is an integer number in milliseconds so we 
// can schedule new events in the draw loop
int trigger=0;

// This array holds the pixel positions of the rectangles 
// that are drawn each event
int[] posx = {
  0, 128, 256, 384, 512
};


void setup() {
  size(640, 360);
  background(255);

  // Create an array of 5 empty soundfiles
  files = new SoundFile[5];

  // Load 5 soundfiles from a folder in a for loop. By naming 
  // the files 1., 2., 3., [...], n.aif it is easy to iterate 
  // through the folder and load all files in one line of code.
  for (int i = 0; i < files.length; i++) {
    files[i] = new SoundFile(this, (i+1) + ".aif");
  }
}

void draw() {

  // If the determined trigger moment in time matches up with 
  // the computer clock events get triggered.
  if (millis() > trigger) {

    // Redraw the background every time to erase old rects
    background(255);

    // By iterating through the playSound array we check for 
    // 1 or 0, 1 plays a sound and draws a rect, for 0 nothing happens

    for (int i = 0; i < files.length; i++) {      
      // Check which indexes are 1 and 0.
      if (playSound[i] == 1) {
        float rate;
        // Choose a random color and get set to noStroke()
        fill(int(random(255)), int(random(255)), int(random(255)));
        noStroke();
        // Draw the rect in the positions we defined earlier in posx
        rect(posx[i], 50, 128, 260);
        // Choose a random index of the octave array
        rate = octave[int(random(0, 5))];
        // Play the soundfile from the array with the respective 
        // rate and loop set to false
        files[i].play(rate, 1.0);
      }

      // Renew the indexes of playSound so that at the next event 
      // the order is different and randomized.
      playSound[i] = int(random(0, 2));
    }

    // Create a new triggertime in the future, with a random offset 
    // between 200 and 1000 milliseconds
    trigger = millis() + int(random(200, 1000));
  }
}


/**
 * Processing Sound Library, Example 4
 * 
 * Five soundfiles are mapped to the numbers on the keyboard. 
 * Numbers 1-5 are played back an octave lower and numbers
 * 6-0 an octave higher.
 */

import processing.sound.*;

AudioDevice device;
SoundFile[] file;

int red, green, blue;

void setup() {
  size(640, 360);
  background(255);

  // Create an AudioDevice with low buffer size 
  // and create an array containing 5 empty soundfiles
  device = new AudioDevice(this, 48000, 32);
  file = new SoundFile[5];

  // Load 5 soundfiles from a folder in a for loop. 
  for (int i = 0; i < file.length; i++) {
    file[i] = new SoundFile(this, (i+1) + ".aif");
  }
}

void draw() {
  background(red, green, blue);
}

void keyPressed() {
  // Set a random background color each time you hit then number keys
  red=int(random(255));
  green=int(random(255));
  blue=int(random(255));

  // Assign a sound to each number on your keyboard. 1-5 play at
  // an octave below the original pitch of the file, 6-0 play at
  // an octave above.
  switch(key) {
  case '1':
    file[0].play(0.5, 1.0);
    break;
  case '2':
    file[1].play(0.5, 1.0);
    break;
  case '3':
    file[2].play(0.5, 1.0);
    break;
  case '4':
    file[3].play(0.5, 1.0);
    break;
  case '5':
    file[4].play(0.5, 1.0);
    break;
  case '6':
    file[0].play(2.0, 1.0);
    break;
  case '7':
    file[1].play(2.0, 1.0);
    break;
  case '8':
    file[2].play(2.0, 1.0);
    break;
  case '9':
    file[3].play(2.0, 1.0);
    break;
  case '0':
    file[4].play(2.0, 1.0);
    break;
  }
}


Exemplele 5, 6 - Analiza audio

In plus fata de clasele utilizate pentru generarea si manipularea fluxurilor audio, Sound ofera doua clase pentru analiza audio: o transformare Fourier rapida (FFT) si un cuantificator de amplitudine (eng. amplitude follower). Clasa FFT analizeaza un flux audio si populeaza o matrice cu containere (eng. bins - esantioane sau sample-uri de frecvente) ale partii pozitive a spectrului audio, pana la jumatate din rata de esantionare. Acest lucru ne permite sa folosim benzi de frecventa diferite ale unui anumit sunet pentru a declansa evenimente si vizualizarea lor in cadrul buclei draw(). Codul va desena o spectrograma normalizata a fisierului de sunet. Mai intai, sunt declarate cateva variabile, cum ar fi factorul de scala, numarul de benzi care trebuie obtinute si matricele de date de frecventa. Playerul de fisiere audio este trecut apoi la obiectul FFT cu ajutorul metodei input(). In reprezentarea vizuala, latimea fiecarei benzi de frecventa este calculata dinamic in functie de numarul de benzi analizate. Pentru fiecare cadru (frame), metoda analyze() trebuie apelata pentru a prelua cadrul curent de analiza al FFT. Dupa ce valorile de amplitudine sunt "netezite" (smoothed), fiecare bin va fi reprezentat de o linie verticala.

Exemplul 6 este asemanator cu 5, dar in loc de o matrice de valori este obtinuta o singura valoare. Aceasta va fi data de patratul mediu radacina al ultimelor frame-uri de sunet, adica amplitudinea medie. Netezirea (eng. smoothing), numarul de benzi de frecventa si factorii de scalare sunt factori importanti in analiza sunetului si in vizualizarea grafica a sunetului.

/**
 * Processing Sound Library, Example 5
 * 
 * This sketch shows how to use the FFT class to analyze a stream  
 * of sound. Change the variable bands to get more or less 
 * spectral bands to work with. The smooth_factor variable determines 
 * how much the signal will be smoothed on a scale form 0-1.
 */

import processing.sound.*;

// Declare the processing sound variables 
SoundFile sample;
FFT fft;
AudioDevice device;

// Declare a scaling factor
int scale = 5;

// Define how many FFT bands we want
int bands = 128;

// declare a drawing variable for calculating rect width
float r_width;

// Create a smoothing vector
float[] sum = new float[bands];

// Create a smoothing factor
float smooth_factor = 0.2;

void setup() {
  size(640, 360);
  background(255);

  // If the Buffersize is larger than the FFT Size, the FFT will fail
  // so we set Buffersize equal to bands
  device = new AudioDevice(this, 44000, bands);

  // Calculate the width of the rects depending on how many bands we have
  r_width = width/float(bands);

  // Load and play a soundfile and loop it. This has to be called 
  // before the FFT is created.
  sample = new SoundFile(this, "beat.aiff");
  sample.loop();

  // Create and patch the FFT analyzer
  fft = new FFT(this, bands);
  fft.input(sample);
}      

void draw() {
  // Set background color, noStroke and fill color
  background(204);
  fill(0, 0, 255);
  noStroke();

  fft.analyze();
  for (int i = 0; i < bands; i++) {
    // Smooth the FFT data by smoothing factor
    sum[i] += (fft.spectrum[i] - sum[i]) * smooth_factor;

    // Draw the rects with a scale factor
    rect( i*r_width, height, r_width, -sum[i]*height*scale );
  }
}


/**
 * Processing Sound Library, Example 6
 * 
 * This sketch shows how to use the Amplitude class to analyze a
 * stream of sound. In this case a sample is analyzed. The smoothFactor
 * variable determines how much the signal will be smoothed on a scale
 * from 0 - 1.
 */

import processing.sound.*;

// Declare the processing sound variables 
SoundFile sample;
Amplitude rms;

// Declare a scaling factor
float scale = 5.0;

// Declare a smooth factor
float smoothFactor = 0.25;

// Used for smoothing
float sum;

void setup() {
  size(640, 360);

  //Load and play a soundfile and loop it
  sample = new SoundFile(this, "beat.aiff");
  sample.loop();

  // Create and patch the rms tracker
  rms = new Amplitude(this);
  rms.input(sample);
}      

void draw() {
  // Set background color, noStroke and fill color
  background(0, 0, 255);
  noStroke();
  fill(255, 0, 150);

  // Smooth the rms data by smoothing factor
  sum += (rms.analyze() - sum) * smoothFactor;  

  // rms.analyze() return a value between 0 and 1. It's
  // scaled to height/2 and then multiplied by a scale factor
  float rmsScaled = sum * (height/2) * scale;

  // Draw an ellipse at a size based on the audio analysis
  ellipse(width/2, height/2, rmsScaled, rmsScaled);
}


dupa R. Luke DuBois si Wilm Thoben (MIT)

Note