Comenzando con Csound
Al fin terminé el primer capitulo del Csound Book y me he decidido a hacer un repaso de lo que he aprendido y ver que se me ha olvidado, algo asi como hacer un resumen para el primer parcial. Esto para nada se le compara al material que van a encontrar en el Csound Book que, sugiero que lo compren, o en el manual de Csound que viene en la página oficial. Algo que me llama la atencion es la falta de recursos que hay en la red sobre Csound y supongo que es de entenderse ya que el lenguaje tiene unos 20 años desde que salio aprox y supongo que muchos de los usuarios se han mudado a Supercollider, o Max/MSP, o Pure Data, o Chuck... en fin, debe de haber mas que no conozco pero esto no es clase de historia... Estoy usando QuteCsound 4.7.0 en Windows Vista, ya existe la version 6.0.1 pero he tenido problemas para convertir los archivos a audio con esta version asi que en lo que se resuelve este problema seguire usando esta version mas viejita.
Csound, es un lenguaje de programación gratuito enfocado 100% a sintesis de sonido digital que imita el funcionamiento de un sintetizador modular, lo cual me parece excelente y muy intuitivo a la hora de estar escribiendo ya que cada linea de código se puede conectar "como cables" a la "señal" de la siguiente linea de código. Esto abre la posibilidad a infinidad de locuras para modular todo tipo de parametros que no vas a encontrar en otros sintetizadores hard o soft comerciales o que si los encuentras estas limitado a solo modular unos cuantos parametros debido a que las compañias por lo general tratan de reducir los costos de los cacharros que vendan y esto limita un poco la creatividad y la capacidad para diseñar sonidos. En Csound el limite es el poder de procesamiento de tu computadora. (Es verdad, no es porque este enamorado del programa...)
Los primeros problemas con los que me encontre hace años cuando compre el Csound Book son realmente estúpidos y son cositas que me gustaría recalcar aqui y que el libro no menciona (que no tiene porque) pero me gustaría dejarlos aqui.
Si han seguido los posts sobre programación en Processing recuerdan que existen bloques donde se escriben los argumentos que sirven para decirle al programa que hacer, por ejemplo en el bloque void setup() sirve para decirle a Processing las especificaciones de la ventana de display, este bloque se encuentra encerrado en "curly brackets" { } en donde se abre un bloque con { y termina con }. En Csound ocurre lo mismo, solo que los bloques se inician con un menor que y un mayor que <asi> y los bloques se cierran </asi>
Los bloques son los siguientes:
<CsoundSynthesizer>
Este bloque contiene todos los demás bloques que veremos a continuacion, yo lo pienso como el bloque madre que conforma todo el comportamiento y diseño del sintetizador.
<CsOptions>
Este bloque contiene la linea de comandos "flags" que se le dan a Csound. Es una lista extensisima que recomiendo verla en el manual de Csound mas a detalle, aqui se le dice a Csound si quieres que use samples de audio a 24 bits, a 8 bits, que escriba un archivo de audio aiff, que no toque ningun sonido mientras estas procesando un archivo a audio, etc...
<CsInstruments>
En este bloque es donde se inicializa el sample rate, el control rate, el numero de samples de control, el número de canales que se utilizan (mono, stereo, etc...), y lo mas importante es que aqui es donde se diseñan los instrumentos que mas adelante serán tocados por el bloque de la orquesta, si quieres tener un sintetizador granular, un sintetizador FM, modal, un phaser, flanger, chorus y reverbs... aqui es donde se diseñan.
<CsScore>
En este bloque se escriben como su nombre lo indica, el score, aqui se dan las indicaciones de ejecucion de los instrumentos que diseñamos en el bloque <CsInstruments> tambien se indica la duracion de cada nota o sonido, el tiempo en el que comienzan, la intensidad, la frecuencia todo un sinfin de parametros que podemos ir añadiendo para que la ejecucion y comportamiento de nuestro instrumento se ponga cada vez mas interesante.
Esto, es algo que el libro no menciona y que siento que es parte crucial al menos para los descerebrados como su servidor, que venimos del mundo arcaico de los sintetizadores mecanicos con cuerdas (guitarras) y necesitamos de la energía corporal para hacer sonido. Pero bueno supongo que el libro no esta destinado para los absolutos principiantes como su servidor y me parece que esto es algo importante ya que tuve que aprender a programar en Processing para entender esto de los bloques en Csound 2 años despues de haber comprado el libro...
Ahora que ya lo mencioné y que espero haya quedado claro, podemos pasar a lo bueno y solo nos estaremos enfocando en la seccion de <CsInstruments> y <CsScore> para hacer ruido.
Nuestro primerisimo ejemplo se ve asi
<CsoundSynthesizer>
<CsOptions>
</CsOptions>
<CsInstruments>
sr = 44100
kr = 4410
ksmps = 10
nchnls = 1
instr 101
k1 linen 10000, 1, p3, 1
a1 oscil k1, 440, 1
out a1
endin
</CsInstruments>
<CsScore>
;Function 1 uses the GEN10 subroutine to compute a sine wave
f 1 0 2048 10 1 .5 .333 .25 .2 .166 .142 .125 .111 .1 .09 .083 .076 .071 .066 .062
; inst start duration
i 101 0 3
</CsScore>
</CsoundSynthesizer>
Lo que quiero recalcar aqui antes que nada es que se fijen en la sintaxis, como estan divididos los bloques y como se cierran. Podemos ver que el bloque <CsoundSynthesizer> es el bloque que encierra a los demas bloques como dije anteriormente. Despues le sigue el bloque <CsOptions> y como para este ejemplo no es necesario decirle nada a Csound se cierra inmediatamente </CsOptions>. Le sigue el bloque <CsInstruments> en donde se indica, el sample rate(sr), el control rate(kr), el número de samples de control rate en un periodo(ksmps) y el número de canales (nchnls).
En Csound vamos a manejar dos tipos de señales, las señales de control (k) que sirven para crear los lfo`s, las envolventes y todo tipo de artilegios que se encargan de "controlar" valga la redundancia a las señales de audio(a). Es por eso que dentro del instr 101 tenemos el opcode, (opcodes es el nombre que se les da a las funciones dentro de Csound) linen que lleva una pequeña k y un numero 1 que indica que es una señal de control, y el linen significa que vamos a construir una envolvente lineal. linen recibe los argumentos de amplitud, tiempo de subida en segundos, duracion total en segundos y tiempo de decaimiento en segundos.
En código esto se ve así:
k1 linen 10000, 1, p3, 1
Abajo del opcode linen, tenemos el opcode oscil que lleva una a que nos indica que es una señal de audio y un número uno, el numerito puede ser cualquier cosa en el caso de k1 y a1 podemos poner kpedo y apopochas, realmente no importa lo que pongamos despues de la k o de la a, que es realmente lo que le indica a Csound el tipo de señal con el que estamos trabajando, pero como siempre al estar bautizando variables es mejor ponerle un nombre que indique su función, en este ejemplo solo tenemos números ya que es un ejemplo muy simplón.
El opcode oscil recibe los argumentos de amplitud, ciclos por segundo y el número de la función (esto de la función lo explicare en otro post) en este ejemplo el código se ve asi
a1 oscil k1, 440, 1
Hay que notar que el argumento de amplitud del opcode oscil en este ejemplo es k1, aqui le estamos diciendo a la amplitud del oscilador que suene de acuerdo a la envolvente que construimos en la linea anterior, como si tuvieramos nuestro sintetizador modular que ocupa toda nuestra pared de nuestro home studio y hubieramos conectado con un cable la salida de la envolvente a la entrada de amplitud del oscilador.
Finalmente le decimos a Csound que el audio (opcode out) salga por a1 a las bocinas de nuestra computadora y finalizamos el diseño de nuestro primer instrumento en Csound con endin y cerramos el bloque </CsInstruments>
Despues le sigue el bloque <CsScore> que es donde vamos a escribir la ejecución de nuestro instrumento al cual le llamamos 101.
En el score usamos la declaración i para decirle al score que "prenda" un instrumento (en este caso el 101) en cierto tiempo, con cierta duración como vemos en el código, le estamos diciendo que prenda el instrumento 101, desde el segundo 0, con una duración de 3 segundos.
; inst start duration
i 101 0 3
Por cierto, los comentarios en Csound se hacen escribiendo al principio un punto y coma (;) como sabemos, todos los comentarios en un lenguaje de programación sirven para hacer nuestro código mas legible y para que cualquier otra persona que lo este leyendo lo pueda entender mas facilmente, asi si tenemos algun bug sera mas facil de identificar el problema mas adelante.
Regresando al ejemplo, podemos ver una linea dentro del mismo bloque <CsScore>
f 1 0 2048 10 1 .5 .333 .25 .2 .166 .142 .125 .111 .1 .09 .083 .076 .071 .066 .062
Esto es una funcion la cual calcula una onda senoidal usando la subrutina GEN10, esto de las funciones y los GENS ocupan todo el capitulo dos del Csound book asi que no puedo adentrarme a explicarlo, por el momento hay que copiar y pegar pero basta con decir que en este caso se utiliza para "dibujar" una onda senoidal algo asi como, dibujar en pure data un array todos los puntos que conforman la onda senoidal para que el opcode oscil lo lea y suene.
FINALMENTE!! cerramos el bloque </CsScore> y como hemos terminado de diseñar nuestro instrumento y de darle tooooodas las indicaciones de ejecución, también cerramos el bloque madre </CsoundSynthesizer> de la siguiente manera.
Nos vemos en el siguiente post
EXPERIMENTEN!!!