Seccion previa: Construyendo un simple instrumento de Cmix

Un instrumento mas complejo de Cmix


*funpan* sera mucho mas interesante si la ubicacion entre los parlantes pudieran seguir cierta funcion de control. Cmix tiene una herramienta para construir funciones bastante potente en el interior del lenguaje Minc: *makegen*. *makegen* puede ser usada en la partitura para crear funciones arbitrarias para envolventes y para formas de onda llamando la libreria de rutinas *gen* de Cmix (ver el articulo en el previo Array para una mas completa descripcion de esta utilidad). Por ejemplo, el siguiente comando *makegen* en una partitura:

construira una simple onda sinusoidal en la tabla funcion 1, una envolvente segmento-de-lineas desde 0.0 a 1.0 a 0.3 en la tabla funcion 2, y una forma de onda con una cantidadmoderada de segundo y tercer armonico (0.2 y 0.3 respectivamente) en la tabla funcion 3. Notese que el primer argumento del *makegen* es la especificacion del numero de la tabla funcion. Es este numero que sera usado en un instrumento para acceder la funcion integrada apropiada *makegen*.

*snazzypan* es un instrumento que usa una tabla funcion arbitraria como controlador de envolvente para cambiar la ubicacion de la señal de entrada en el archivo estereo de salida a travez del tiempo. Tambien tiene un p-field para controlar la amplitud de salida de la señal por simple multiplicacion proporcionada de la entrada:

La amplitud es especificada en p[3], y el numero de la tabla funcion de acompañar para la ubicacion en p[4].

para poder usar una tabla funcion *makegen*, tres partes de informacion se necesitan: el numero de la tabla funcion, la longitud de la tabla, y la locacion en memoria de la tabla. Como notado, el numero de la tabla para *snazzypan* se da en p[4]. Este valor es almacenado en la variable entera "pfunc":

Las funciones de Cmix que retornan la longitud y la locacion de la tabla requieren un valor entero como argumento. Estas dos funciones, *fsize* y *floc*, son usadas en *snazzypan* para almacenar la longitud de la tabla en la variable 'plength" y la locacion de la tabla en la variable "pfunc_loc":

"plength" es una variable entera, y "pfunc_loc" es un puntero a una locacion decimal (floating point); el comienzo de los datos de la funcion. Estos datos estan en verdad en un vector con valores del tipo floating point.

El mismo mecanismo debe existir para acceder la funcion a los tiempos apropiados durante el calculo de las muestras de salida. Cmix provee un numero de funciones para ejecutar esta operacion. Una de las mas populares de ellas es la funcion *table*. *table* devuelve valores desde la funcion basada en una duracion dada, 'estirando' o 'comprimiendo' los valores de la tabla cuando es necesario. *table* debe ser inicializada en la funcion *tableset*:

*tableset* toma tres argumentos, el primero es la duracion sobre la cual la tabla debera ser activa (otra vez, p[2] es el p-field que especifica la duracion en este cas). El segundo argumento es la longitud de la tabla. el tercer argumento es un vector de dos-elementos que es usado internamente por *table* para mantener los datos de los apuntadores, etc. En un instrumento escrito por el usuario, todo lo que es necesario es declarar este vector como un vector decimal (floating point):

el nombre de este vector es arbitrario.

Una vez que la tabla funcion ha sido inicializada con *tableset*, los valores pueden ser encontrados usando la funcion *tabla*:

El primer argumento de *table* es el numero corriente de muestra. Este es usado para que *table* pueda encontrar el valor en la tabla funcioin correspondiente a la cantidad de procesado hecho. Con otras palabras, no es necesario llamar a la funcion *table* para cada muestra -- el numero de muestra puede ser usado para ver cuan lejos ir en la tabla a buscar un valor. El segundo argumento es la locacion de la tabla, y el tercero es el vector 'tabs" usado en *tableset*. *table* llamara valores desde la tabla redondeandolos a la locacion mas cercana del vector tabla funcion. Una funcion relacionada, *tablei*, interpolara entre los puntos en la tabla funcion, dando resultados mas suaves en el esquema de busqueda de la tabla. En este caso, la suavidad no es necesaria probablemente. *table* sera suficiente para ejecutar una relativa suave panoramica con el instrumento *snazzypan*.

Una tipica partitura de cmix para este instrumento ejecutara una panoramica desde el canal 0 al canal 1 y hacia atraz otra vez durante la duracion de algun evento (en este ejemplo, el evento dura 7.9 segundos en el archivo de entrada, comenzando al segundo 3.4). A typical CMIX scorefile for this instrument might do a pan from channel 0 to channel 1 and back again for the duration of some sound event (in this example, the event is 7.9 seconds long in the input file, starting at time 3.4):


Proxima seccion: Extensiones y variaciones
Que es Cmix? -Index-