Csound és el què anomenem un compilador acústic, o sintetitzador per software. Va ser creat al MIT i deriva directament de la família de programes tipus Music V (Max Mathews, 1968). És multiplataforma, gratuït i actualment el programa més potent i més constantment actualitzat de la seva classe.
Per compilar un so, un efecte, una obra sencera, el què sigui, necessites crear dos fitxers de text que Csound compilarà després. S'anomenen Orchestra (orquestra) i Score (partitura), amb extensions .orc i .sco respectivament. Fent una analogia amb el MIDI, la Orchestra conté descripcions d'instruments per software que supleixen els mòduls de so i sintetitzadors hardware, mentre que el Score és com el fitxer MIDI que enmagatzema notes i altres paràmetres necessaris per la interpretació.
La Orchestra comença amb una capcelera (header) seguida d'una llista d'instruments. La capcelera bàsicament defineix la freqüència de mostreig (sample rate) del fitxer de so que generarem, la freqüència de control (control rate) - usualment menor i útil per agilitzar els càlculs de determinats paràmetres), el nombre de canals (mono, stereo, quad...). Una capcelera típica seria:
sr=44100 ; Sample Rate kr=22050 ; Control Rate ksmps=2 ; equival a sr/kr sempre <--- aquest paràmetre és obvi però cal indicar-lo (!) nchnls=2 ; 1=mono, 2=stereo, 4=quad
Els comentaris van precedits per una semicoma.
Tenim tot seguit definicions d'instruments, mireu-ne l'exemple:
instr 1 ; Instrument 1 begins here aout oscil 10000, 440, 1 ; An oscillator outs aout, aout ; Output the results to a stereo sound file endin ; Instrument 1 ends here
Cada instrument comença per instr # i acaba per endin. Cada línia conté un únic comandament o opcode, que crida usualment a un generador unitari.. El principal operador en l'exemple anterior és oscil. Cada operador té variables (a la seva esquerra, generalment la variable en la què s'enmagatzema el procés definit per aquest operador) i paràmetres (a la dreta). oscil per exemple és un simple oscilador per taula d'ones (wavetable). El primer paràmetre per oscil indica el volum del senyal a generar, en aquest cas 10000. (Fixeu-vos que si genereu àudio a 16 bits teniu un marge de +/- 32000 aprox.). El segon paràmetre per oscil indica la freqüència de l'oscilador, en aquest cas 440 cicles/sec. Finalment el tercer paràmetre es refereix a la forma d'ona o taula emprada per l'oscilador. Aquesta taula es genera en el Score com ja comentaré. El resultat s'enmagatzema en la variable aout. L'altre operador d'aquest instrument, outs, agafa la variable aout i l'envia directament a la sortida, en aquest cas stereo (per això indica dos canals, separats per comes). Aquesta sortida és generalment un fitxer de so o, si el teu ordinador és prou ràpid, sortida al DAC en temps real.
Hi ha diversos tipus de variable emprades en Csound, però
sempre són floats. L'instrument anterior empra una variable
anomenada "aout". La primera lletra ens indica el tipus de variable de
què es tracta. Variables locals (només vàlides dins
d'un instrument) poden començar per "i", "k" o "a". Si comencen
per "i" s'inicialitzen a cada nota i romanen constants per a aquella
nota. La variables "a" s'actualitzen a cada mostra (són emprades
per senyals d'àudio ) i les "k" s'actualitzen a la freqüència
de control, i van bé per controlar paràmetres com la freqüència,
el volum, l'envolupant d'un filtre, etc. sense necessitat d'actualitzar-les
a cada mostra.
Hi ha també variables "p" o paràmetres.
Aquests paràmetres es donen al score i els primers són obligats
i tenen una significació especial:
p1 és el número d'instrument.
p2 indica quan comença l'instrument a executar-se.
p3 n'indica la durada.
p4, p5, p6 etc. poden indicar el què nosaltres desitgem.
Usualment un instrument només reconeix les variables
definides entre els separadors instr i endin . De vegades
pots necessitar envia un senyal d'un instrument a un altre. Aleshores
cal crear una variable glogal, i són equivalents a les variables
locals però amb un prefixe "g" al principi. Per tant tindrem variables
globlals gi, gk o ga. Aquestes variables són reconegudes per tots
els instruments.
Hi ha finalment variables reservades com les esmentades
sr, kr, ksmps, nchnls.
La sintaxi del score és distinta a la de la orchestra, i consisteix en un llistat d'events.
Típicament en trobarem dos tipus d'events, les taules i els events d'instrument. Aquí tenim un exemple que funciona amb l'anterior orchestra:
;Table# Start TableSize TableGenerator Parameter Comment f1 0 16384 10 1 ; Sine ;Instrument# Start Duration i1 0 1
Comencem fixant-nos en el segon event, que activa l'instrument. El primer camp (p1) indica que l'event crida a un instrument (i) i que aquest és l'instrument número 1 definit a la orchestra.El següent número (p2) és 0 i vol dir que l'event activa l'instrument al temps 0, mentre que el tercer paràmetre (p3) és la durada, en aquest cas 1 segon.. A la orchestra ens podem referir a aquests camps amb els paràmetres p1, p2 i p3 com ja he indicat.
Ara considerem el primer event, que és la taula d'una funció d'ona (f). Hi ha cinc números en aquesta línia: número de taula, temps en què es genera, tamany (en samples). El quart paràmetre indica la rutina de generació emprada per aquesta taula. Hi ha diverses rutines (GEN) disponibles en Csound i cal mirar el manual. La 10 com aquí és la més freqüent. Els paràmetres que següeixen al número de rutina ténen un significat que depen del tipus de rutina triat. En aquest cas l'1 indica generar un cicle d'ona sinusoidal.Amb d'altres rutines GEN podem generar diverses funcions d'ona, envolupants, o fins i tot enmagatzemar mostres d'àudio.
Molts operadors de la orchestra requereixen taules per funcionar. En el nostre exemple oscil requereix una funció d'ona que s'indica amb el número de taula que triem, en aquest cas 1 crida a f1 al score i per tant emprem una ona sinusoidal.
L'extensió més òbvia a aquest instrument seria afegir una envolupant per volum. Això es genera amb un altre operador, per exemple linseg, que genera envolupants per segments lineals.Consulta l'ajuda per entendre com funciona. És preferible que l'envolupant sigui una variable de control (k). Finalment, al primer paràmetre de l'operador oscil, on hi havia el 10000, hi posarem l'envolupant generada (la resta de l'instrument no canvia i per tant no la reescric):
; Attack Decay Sustain Release Envelope kamp linseg 0, .1, 1, .2, .8, p3-.5, .8, .2, 0 ; si un dels camps crida a p3 vol dir que l'envolupant depen ; de la duració de la nota, el què resulta convenient de vegades. aout oscil kamp, 440, 1 ; An oscillator
Aquest operador genera la segënt envolupant:
Per renderitzar el fitxer d'àudio cridem Csound i li donem els fitxers .orc, .sco i el nom del fitxer a generar, a més d'altres paràmetres si volem formats especials de sortida que no siguin 16 bis (podem generar fitxers fins a 32 bits o en coma flotant). En Winsound, un simple frontend per Windows, només cal omplir les caselles. Si ho fas en mode consola cal escriure una línia de comandaments.
Espero que aquest tutorial serveixi per introduir-te en el fascinant món de la síntesi per software. És molt recomanable iniciar-se en Csound amb els tutorials de Richard Boulanger, inclosos en el fitxer d'ajuda de Csound, molt ben explicats i de complexitat creixent, i seguidament analitzar algunes orchestras com les què he adjuntat en el CD.
També pots trobar tutorials online a: