Curso de Introducción a la Informática Musical
Introducció a Csound

Autor: Josep Maria Comajuncosas

El programa CSound, utilitzat per sintesi digital de sons, funciona editant uns fitxers de text que despres compilem. Els fitxers 'orquestra' contenen la definicio dels instruments, i, els fitxers 'score', quina es la seqüencia de notes que toquem amb ells. Aquest text introdueix les primeres pases amb aquest programa.

Introducció

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"

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.

Variables

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.

El "Score"

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.


Figura 1: Sine wave

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:


Figura 2: Sine waveform sound with envelope applied.

Compilació

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.

On trobar més

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:

Josep M Comajuncosas
mailto:gelida@intercom.es