Tutorial 4

Tablas-f y osciladores

En este tutorial empezaremos a mover los objetos creados en la ventana openGL. Haremos esto usando un oscilador. Un oscilador es un 'aparato' que repite un patrón cíclicamente. En sintetizadores los osciladores repiten algún tipo de 'onda' por ejemplo sinusoidal, cuadrada de sierra, etc. En Csound un oscilador puede usar cualquier tipo de forma, que puede ser una función matemática, un archivo de sonido, o una forma hecha de líneas conectando puntos. La forma de onda que usa un oscilador se guarda en csound dentro de una tabla-f (tabla de función). Como se verá, un oscilador usa el contenido de esta tabla para 'oscilar' a cierta frecuencia, pero iniciemos para que quede claro:

<CsoundSynthesizer>
<CsOptions>
-+Y
</CsOptions>
<CsInstruments>

#include "OpenGL.h"
sr=100
kr =100
ksmps=1
nchnls=1

GLfps 30
GLpanel "OpenGL panel", 512, 512
GLpanel_end
FLrun

glMatrixMode $GL_PROJECTION
glLoadIdentity
gluPerspective 60,0.1,100
glMatrixMode $GL_MODELVIEW
GLinsert_i $GL_NOT_VALID
glClear $GL_COLOR_BUFFER_BIT + $GL_DEPTH_BUFFER_BIT
GLinsert_i 1.1

;Los encabezados de siempre. Ningún cambio.

gisine ftgen 1,0,1024,10,1
;La instrucción ftgen crea una tabla-f. gisine es una variable global, que es compartida y puede ser
;modificada por todos los instrumentos. Una variable global siempre comienza con la letra 'g', seguida
;del tipo de la variable, en este caso 'i' que como vimos en el tutorial anterior define una variable de tipo
;'i' que se puede considerar constante. Todas las tablas-f se utilizan haciendo referencia al número que
;queda guardado en la variable de la izquierda, o sea gisine en este caso. Los valores a la derecha de
;ftgen significan:
;Primero el numero de la tabla. En este caso 1, que además queda guardado en gisine. Segundo, el tiempo
;al que se crea la tabla, aquí creamos la tabla desde el inicio, tiempo 0. Tercero viene el tamaño de la tabla.
;Este es el número de puntos en la tabla, que se puede pensar como la resolución de la tabla. La mayoría de
;las tablas deben tener un tamaño que sea una potencia de dos, en este caso 1024. El siguiente valor 10 determina
;la función generadora (función GEN), que define el proceso que se seguirá para crear la tabla. Los procesos pueden ser
;matemáticos, pueden ser una lista de valores, lectura de un archivo de audio, entre otros. La función GEN 10
;genera una suma de armónicos parciales, o una suma de ondas sinusoidales de frecuencias f, 2f, 3f, 4f, etc.
;Los valores que siguen al 10 dan el valor relativo de cada parcial. En este caso le damos un valor de 1 al primer
;parcial lo que genera una onda sinusoidal pura. Es decir, hemos creado una onda sinusoidal representada
;por 1024 puntos en la tabla-f número 1.

instr 1
iframes = p4
irotate = p5
;Usaremos campo-p de nuevo, pero esta vez para controlar otros parámetros del instrumento
;Asignamos los campos-p a las variables locales de tipo 'i' iframes e irotate.
glLoadIdentity
;Borra todas las transformaciones anteriores
trot GLoscil 1,iframes,1
;Aquí montamos nuestro oscilador. La instrucción para un oscilador dentro del motor gráfico es GLoscil
;El valor del oscilador se guarda en la variable trot. Esta variable como inicia con 't' se llama de tipo 't',
;y se actualiza sólo en cada cuadro de video, según se define en GLfps Todas las instrucciones openGL
;en CsoundAV que pueden usar variables deben usar variables de tipo 'i' o tipo 't'. GLoscil debe tener por
;lo menos tres parámetros, que son amplitud, numero de cuadros que dura cada oscilación, y la tabla-f que
;se usa para oscilar. El resultado, guardado en la variable trot, es una oscilación sinucoidal (por la tabla-f 1)
;con un periodo de iframes cuadros y una amplitud de 1. Vale la pena anotar que la amplitud en este caso
;se refiere al valor máximo positivo y que trot tendrá valores entre 1 y -1.
glRotate irotate,0,0,1
;Ahora rotamos nuestro eje de referencia alrededor del eje z: irotate grados, dados por el campo-p 5.
;Recuerde que la rotación en el eje z es como gira una helice de avión o un timón de carro.
glTranslate 0,trot+1,-5
;Esta instrucción de traslación hace un desplazamiento variable moviendo simultáneamente 5 unidades
;hacia el interior de la pantalla para que sean visibles los objetosy un desplazamiento en el eje y dictado por
;el oscilador usado arriba, usando la variable trot. Agregamos 1 a trot para que todos los valores sean
;positivos. Los valores oscilarán entre 0 y 2. Ahora que la posición ya está dada, crearemos nuestro
;objeto que será un cuadrado, con diferentes colores en las puntas, como hicimos antes.

glBegin $GL_QUADS
glColor 0,0,1,1
glVertex3 0,0,0
glVertex3 0,1,0
glColor 1,0,1,1
glVertex3 1,1,0
glColor 0,1,1,1
glVertex3 1,0,0
glEnd
GLinsert 1.5
endin
;Termina el instrumento que será usado en el score.

</CsInstruments>
<CsScore>
i 1 2 14 60 0
i 1 4 12 90 90
i 1 6 10 120 180
i 1 8 8 150 270
;Primero llamamos el intrumento cuatro veces iniciando en momentos diferentes, pero
;terminando al mismo tiempo. La frecuencia de oscilación es de fps/p4 o para las cuatro instancias:
;0.5, 0.333, 0.25, 0.2. O sea que la primera se moverá más rápido que las otras. Cada una además
;está rotada 90 grados con respecto a la anterior.
i 1 18 12 60 45
i 1 18 12 90 135
i 1 18 12 120 225
i 1 18 12 150 315
;Aquí llamamos otras cuatro instancias del instrumento 1, esta vez comenzando y terminando al tiempo,
;y torcidas 45 grados.
</CsScore>
</CsoundSynthesizer>

Este fue el tutorial 4. Puede experimentar con distintos colores, formas y valores do rotacón. Puede consultar más acerca de las tablas-f y las funciones GEN en los manuales de csound.

Notas:
Aparte de la instrucción ftgen, se puede crear tablas-f ysando el comando 'f' en el score. Esta segunda forma es la más 'tradicional', pero he escogido ftgen, porque me parece más fácil de entender que las tablas se creen antes de usar el oscilador, y no después en el score.
Como en GLoscil y ftgen, la mayoría de los comandos de csound toman sus parámetros en la derecha y dan el resultado en la izquierda.

Regreso al menú de tutoriales de Video