Primero trabajaremos lo básico del “control level” del Pd. Antes mencionamos que el Pd trabaja solo con data, con números (y la ayuda de las letras). (cuanto antes trabajaremos procesando sonido.)
Ya mencionamos que las computadoras solo trabajan con numeros. El Pd trabaja con números y “symbols”, letras en otras palabras. Pero los números son de mayor importancia; en el primer ejemplo vimos cuan importantes parámetros de un sonido como altura y volumen, en Pd no son determinados usando notacion musical tradicional como “do, re, mi” para altura o “pianissimo” para la dinámica, sino que exclusivamente usando números. Por esta razón vamos a pasar un tiempo aprendiendo lo básico de como Pd procesa los números en el “control level”:
Se pueden ingresar números en los “números” y en los “mensajes”. Algunos objetos permiten efectuar operaciones matemáticas usando estos números. Cree el objeto “+” y conecte números en sus inlets derecho e izquierdo y también en su outlet:
Ingrese un 4 en el objeto number box superior derecho (en Execute mode: clikee una vez sobre el number box, tipee el numero, y presione ENTER) y 5 en el superior izquierdo. El numero 9 -la suma de 4 y 5 – aparece en el number box mas abajo. El objeto “+” tiene dos inlets en los cuales podemos ingresar números y un outlet donde aparece el resultado procesado por el objeto (en este caso el resultado de una suma).
Este ejemplo ilustra una regla importante del Pd: en los objetos de control que tengan varios inlets, los datos deben ingresar de derecha a izquierda. En otras palabras, el objeto recibe entrada pero solo procesara salida cuando reciba algo en el primer inlet comenzando desde la izquierda. (esto distingue los inlets en “cold”, que no causan cambio inmediato, y “hot” inlets, que causan un cambio inmediato y visible cuando ingresa data en ellos. Esta regla la encontraremos constantemente.
Otras operaciones matemáticas básicas – resta, multiplicación, división y potencia – mantienen este principio:
Si desea efectuar varias operaciones usando un numero, por ej. 3*3 y 3*4 simplemente conecte un number box o un message box a múltiples inlets (para simplificar usaremos argumentos (“*3” y “*4”) en lugar de number boxes para los multiplicadores. En el ejemplo previo usamos number boxes en los inlets en lugar de argumentos. Si creamos un objeto sin argumentos, el Pd asume un 0 como valor en el argumento):
Si desea efectuar dos calculos diferentes al mismo tiempo, debe
transformar un click en varios usando un “bang” (Put
Bang
o con Shift-Ctrl-B).
Puede clickear sobre el bang en Execute mode.
(nota del traductor: recuerde que en Edit mode puede clickearlo junto
con la tecla Ctrl)
Si luego quiere sumar estos dos resultados (del ejemplo anterior) debe asegurarse de que ingresen al objeto “+” en el orden correcto. Es decir de derecha a izquierda.
Para lograr esto, existe un objeto llamado “trigger”:
“trigger” recibe como entrada un bang, un numero, un symbol(=letras), un pointer o un list(= una lista) (luego veremos mas sobre pointer y list). Iniciado o creado de esta forma, “trigger” emite un bang en cada outlet de derecha a izquierda. Los outlets del objeto “trigger” son determinados por sus arguments (bang, float, symbol, pointer, list). En este caso sus arguments fueron dos bangs y dos outlets son creados. (un outlet es creado por cada argument que ingresemos).
Para optimizar espacio, puede omitir los number boxes en los resultados previos a la suma, conecte directamente los outlets a los inlets. Si desea conocer algun valor que se este emitiendo, conecte un objeto “print” a su outlet.
Lo que ingrese por el inlet de “print” aparecerá en la ventana principal de Pd. También cualquier error aparecerá en esta ventana. Por ej. si creamos un objeto que no existe como “zzzgghhh”, no sera creado y un mensaje de error ("zzzgghhh ... couldn’t create") aparecerá en la ventana principal de Pd.
Puede usar esta ventana para clarificar la forma en que trabaja “trigger” creando varios objetos “print” y dandoles diferentes arguments (“print left”, “print Right”). Los resultados aparecerán cronológicamente uno después del otro (mas sobre el orden de operaciones en 2.2.1.4):
Expresiones matemáticas mas largas pueden ser programadas con el objeto “expr”. El argument en este caso es la expresión misma. (usando parentesis, como en las clases de matemática en el colegio):
Para generar el resultado dele un bang.
También puede usar “variables”; se nombran $f1, $f2, $f3 etc. (la cuenta comienza en 1). Esto crea inlets de izquierda a derecha donde se ingresan los valores de las variables. (como siempre, el resultado se genera cuando el primer inlet de la izquierda reciba un valor). Asegúrese de ingresar primero los otros valores antes que el mas a la izquierda.
Si desea que “expr” (sin entradas) resuelva una operación con valor decimal (no numero entero), entonces debe incluir un punto decimal en alguno de los valores de la operación (mas sobre “floats” en 2.2.1.4).
Las funciones exponenciales siguen esta sintaxis: “expr pow ([base], [exponente])”, Por ej. para elevar 2 al cubo: “expr pow (2, 3)”.
“moses”: su input es un numero; “moses” decide, evaluando si su input es menor que / mayor que/ igual a su argument, por cual outlet sale su input. Si en los arguments de “moses” ud. pone 10 e ingresa en su inlet un valor menor que 10, este sale por el outlet de la izquierda. Si ingresa un valor de 10 o mayor, este sale por el outlet derecho.
“select” (también abreviado “sel”): Su entrada es un numero, dispara un bang en su primer outlet cuando su inlet es del mismo valor que su argument. Cualquier otro numero recibido en su inlet sale un el ultimo outlet.
Operadores relacionales
“= =”: si el input es igual al argument o al input derecho, el output es 1, si no 0:
“>=”: Si el input izquierdo es
mayor o igual al argument o a el input derecho, output es 1, sino 0.
“>”: Si el input izquierdo es
mayor al argument o el input derecho, output es 1, sino 0.
“!=”: Si el input izquierdo no es
igual al argument o a el input derecho, output es 1, sino 0.
“<”: Si el input izquierdo es
menor que el argument o el input derecho, output es 1, sino 0.
“<=”: Si el input izquierdo es
menor o igual al argument o a el input derecho, output es 1, sino 0.
Dos módulos matemáticos mas:
El resultado de una division (el cociente) puede expresarse de forma decimal (17 / 7 = 2.428) o como el “resto”: 17 / 7 = 2 resto 3. El cociente con resto se consigue en Pd con “div” y “mod”:
También hay otras importantes operaciones matemáticas (para una información especifica de estas funciones consulte textos de matemáticas del nivel secundario de la escuela):
"sin" = Sine
"cos" = Cosine
"tan" = Tangent
"log" = (natural) Logarithm
"abs" = Absolute value
"sqrt" = Square root
Finalmente, hay un algoritmo (operaciones matemáticas que las computadoras calculan usando valores ingresados. (http://es.wikipedia.org/wiki/Algoritmo).
“Random” genera un numero dentro de un rango dado. El limite inferior siempre es 0, el superior es el valor ingresado en el argument (solamente numeros enteros). El limite superior es exclusivo por ej. si ingreso “random 4”, cada vez que reciba un bang en su inlet aleatoriamente elijara uno entre los numeros 0, 1, 2, o 3.
Otro objeto importante en el contexto de operaciones con números es el objeto “float” (abreviado “f”). Este objeto se utiliza para guardar números. Cuando un numero ingresa en su inlet derecho queda guardado en el objeto para usarlo luego. Si envia un bang a su inlet izquierdo, el numero guardado en el objeto sale por su outlet (mas sobre “float” en 2.2.1.4).
También puede ingresar un numero directamente en su inlet izquierdo. Esto envia el numero a su outlet inmediatamente. El numero también queda guardado en el objeto y puede reenviarse con un bang.
Amenudo en Pd, querrá usar un contador que cuente en números enteros empezando por un valor dado. Un ejemplo:
Explicación:
Primero le dio un valor de 0 al objeto “f”. La primera vez que clickeo en el bang superior izquierdo “f” enviá un 0 al objeto “+ 1”. Este objeto genera 0 + 1 = 1. Luego el 1 ingresa en el inlet derecho de “f”. La próxima vez que enviá un bang, este 1 se enviá al inlet de “+ 1”, lo que resulta en un 2.
Los objetos para operaciones matemáticas demuestran claramente una regla importante en Pd: los valores en los inlets de los objetos de control level deben siempre ingresar de derecha a izquierda. Para asegurar esto usamos el objeto “trigger”, que envia outlets de derecha a izquierda uno tras otro.
Un bang es como un click de mouse, puede ser emitido o recibido.
El objeto “print” muestra en la ventana principal de Pd lo que recibe en su inlet. Aparecen cronológicamente un tras otro. El ultimo en la lista es el mas reciente.
Veamos como aplicar estos conceptos (todo lo relacionado con sonido sera explicado mas adelante):
Si desea alternar entre dos frecuencias, un tono suave y otro fuerte, puede usar el siguiente patch. Alterne entre tonos clickeando en sus respectivos bangs:
Para producir un bicorde necesitara dos objetos “osc~”. En el siguiente patch, al mover los valores en el number box hacia arriba y hacia abajo, producirá un intervalo (aquí una quinta justa) en varias afinaciones.
Al haber objetos “print”, las frecuencias de estos dos tonos se mostraran en la ventana principal del Pd.
Indeterminación!
Cada bang que ud. emita generara un tono entre 200 y 1000 Hertz, una melodía aleatoria.
Algunos ejemplos mas de operaciones matemáticas:
Un valor que los compositores necesitan calcular constantemente: Ud. escribió una obra de 324 negras en un tempo de negras = 72. Cuantos segundos dura esta obra?
Resultado: 270 segundos = 4 minutos 30 segundos.
Este contador solo cuenta desde 0 hasta 6; luego del 6, comienza nuevamente en 0.
Si entendió todo hasta aquí, debe ser capaz de manejar este desafió, pero le advierto que no es sencillo:
Haga un patch que genere una secuencia al azar donde nunca se sucedan dos números iguales (esto puede ocurrir con el objeto “random”). Cuando termine compare su patch con la solución. Buena suerte!
a) Cree dos melodías aleatorias que corran simultáneamente.
b) Cree un patch donde dos bangs seleccionen dos intervalos diferentes que ud. elija. (como el ejemplo dos bangs/dos frecuencias).
c) Use "expr" para calcular funciones exponenciales, por ej. y = x2, y = x (2+x); or y = 1 - (2x).
Un bang es como un click de mouse. Puede clickearlo y este click pasara; El input puede no ser un click. El objeto “bang” convierte en un bang cualquier input que recibe (control level). Por ej. puede usar un number box:
Los números con muchos lugares decimales no se visualizan correctamente en un number box normal. Puede agrandar el number box haciendo click derecho sobre el, seleccionando “Properties” e ingresar un numero mayor en “with”, luego clickee “Ok”.
Otro aspecto importante relacionado con números mayores que 999999 es que son representados de una forma simplificada, como el producto (con un máximo de dos lugares decimales) de 1000000. El numero 1000000 es representado como "e+006".
Lo mismo se aplica a números menores que -999999 y para aquellos entre 1 y -1 con mas de cuatro lugares decimales.
Predeterminadamente (by default), los objetos y sus conexiones son ejecutados siguiendo la secuencia en que fueron creados:
Si conecto primero el bang a “symbol erwin”, este (junto con todo lo que esta conectado después de el) se ejecuta primero.
Por supuesto, esto no es visible y debe evitarse por esa razon!
“f” es por “floating point”. Esto indica que es un numero con decimales y no un numero entero. Si desea trabajar solamente con números enteros, puede usar “int” (abreviado “i”) en lugar de “float”. Contrariamente al Max/MSP, el Pd usa predeterminadamente números con decimal.
Un “bang”, como un mouse click, es la combinación de las letras b- a- n- g. Las combinaciones de letras (symbols) son la segunda forma de data (ademas de los números) que usa el Pd. Algunos objetos reconocen ciertas palabras y trabajan con su input. Muchos objetos reaccionan al symbol “bang”. Como esto ocurre tan frecuentemente, hay una representacion grafica especial para “bang” que es un circulo que parpadea cuando esta activo (Put Bang). Esto se denomina un objeto “GUI” (GUI = graphical user interface, una representación gráfica de algo y/o un gráfico que se puede alterar para producir y enviar nuevos valores).
En este contexto miremos el objeto “writesf~” (un objeto de audio se presentara aquí por que symbols son usualmente usados en este contexto; el objeto sera explicado en profundidad en el capitulo de audio). Este objeto escribe sonido en formato WAV. Trabaja de la siguiente forma: primero en el message box asignamos un archivo donde el sonido se guardara: "open [nombre del archivo]". Si por ej. el archivo se llamara “test.wav” entonces debe escribir "open test.wav". Luego usamos los mensajes “start” y “stop” para iniciar y detener la grabacion.
Normalmente se selecciona el nombre del archivo y luego se comienza a grabar. El orden es importante, por supuesto – antes de que el objeto comience la grabación, es necesario que sepa donde guardar la información. Esto se soluciona usando “trigger”:
Pero los mensajes también se pueden enviar uno después de otro escribiéndolos en un message box separados por una coma:
El mensaje “open test.wav” es la conexión de dos symbols (por que consiste de dos palabras separadas por un espacio (test.wav cuenta como una palabra)). Esta clase de sucesión de dos o mas symbols (o números) se denomina “list”. El objeto “pack” puede crear un list de varios “elementos”. Para los arguments, ingrese indicaciones que especifiquen que clase de elementos contendrá el “list”. Un numero, como “trigger”, se expresa “float” (o “f”), un symbol con “symbol” (o “s”). Si desea crear un list que contenga el mensaje “hello” y “43”, use “pack” como se muestra abajo:
Una vez mas: solo cuando el primer inlet de la izquierda reciba input, output sera generado. (si clickeo primero en “hello” sin haberlo hecho en el input dercho de “pack”, solo “list hello 0” sera el resultado. El output de “pack”, en este punto, solo puede ser visto con el objeto “Print”. Este muestra “list hello 43”. Los elementos de esta lista también pueden ser revelados usando el objeto inverso “unpack” (Pd tiene varios objetos inversos), que trabaja bajo el mismo principio que “pack”, excepto que lo que aparece aquí como output es el input para el objeto “pack”.
Ahora “print” muestra “43” y “symbol hello”. Todo lo que no sea un numero es precedido por una indicación (llamada “selector”) de su tipo de data.
También notese: si usa un symbol en cualquier inlet menos en el primero desde la izquierda, debe usarse así:
Un problema con “pack s s”: el primer inlet es el único que no es necesario marcar como symbol. El segundo symbol debe estar precedido por la palabra “symbol” en un message box o el mensaje debe ser convertido usando el objeto “symbol”:
Un punto final sobre lists: un list que comienza con un numero no necesita explícitamente estar marcado como list; pero si comienza con un symbol, la palabra list debe usarse.
Profundicemos sobre los mensajes:
Se pueden integrar variables al contenido de los mensajes. Se hace similarmente que con “expr” pero no igual: primero las variables se nombran “$1, $2, etc. Si ingresa un numero al mensaje “number $1”, el output del mensaje sera la expresión completa con ese numero.
El uso de varias variables, ej. “number $1 $2” no creara correspondientes inlets (como lo hace “expr”), sino que mantiene un inlet. Ud. debe ingresar un list.
Los symbols deben ser identificados como tales:
Se puede redefinir completamente el contenido de un message box anteponiendo el symbol “set”:
Esto cambia completamente el contenido de un message box en execute mode (primer y ultimo punto en 2.1.3).
Usando una variable se puede, por ej. convertir el output de un number box en un mensaje:
Ordinariamente no es posible incluir una variable sin que un espacio la separe. Aunque el objeto “makefilename” lo hace posible. Las variables en sus arguments son “%d” para dígitos y “%s” para symbols:
El objeto “readsf~” reproduce un archivo de sonido, uno que esta guardado en el disco rigido. Necesita el mensaje “open [nombre del archivo de sonido]”. “nombre de archivo de sonido” se refiere al lugar donde el archivo esta guardado en el disco rígido. Si quiere usar “readsf~” en un patch que esta guardado en el directorio c:/Pd/Pd-patches/ para reproducir un archivo “hallo.wav” que esta en el mismo directorio, solo debe ingresar “open hallo.wav”. Si “hallo.wav” esta en el directorio c:/Pd/ debe ingresar “open ../hallo.wav” o si esta en c:/Pd/Pd-patches/soundfiles/ entonces “open /soundfiles/hallo.wav”. Si esta en c:/soundfiles/ : "open ../../soundfiles/hallo.wav". Si esta en otra unidad, por ej. d:/soundfiles, entonces ingrese "open d:/soundfiles/hallo.wav".
Estos, a veces, complicados nombres de directorios pueden ser mas fácilmente expresados con “openpanel”. Cuando recibe un bang, abre una ventana con el contenido disponible en todas las unidades de la computadora. Cuando hace doble click en un archivo, “openpanel” ingresa la ruta completa del archivo (como un symbol) al Pd:
Si el patch no fue guardado, el Pd (en windows) asume la ruta pd/bin/ .
Como ya previamente
explicamos con el objeto “float” (2.2.1.1.5),
se puede guardar data dentro del patch
con los objetos “float”, “symbol” y “lister” (pero esta
se pierde cuando cierra el patch). “float” y “lister”
usualmente se abrevian “f” y “l”.
El inlet derecho recibe un numero, un simbolo o una lista para ser guardado en el objeto. Esta data guardada es enviada al outlet cuando el objeto recibe un bang en el inlet izquierdo.
Un numero, un simbolo o una lista tambien pueden ser enviadas directamente al inlet izquierdo; estas son enviadas inmediatamente afuera por el outlet (y tambien queda guardada en el objeto).
Un objeto que puede usarse para ordenar varios tipos de data es “route”. También puede ubicar tipos de data (number, symbol, list, bang)...
(todo lo que no se puede ordenar/ubicar sale por el outlet mas a la derecha.)
… también ordena/rutea lists acorde a nombres que ud. defina:
Números y symbols no de pueden combinar en los arguments. Por ej. “route 22 dieter” no funcionara.
“route” distribuye su inlet a uno de sus múltiples outlets acorde a su prefijo. “demultiplex” (tambien “demux” ambos en la versión pd-extended) distribuye su inlet a distintos outlets acorde con su otro inlet. Primero “demux” recive el numero de outlets mediante sus arguments, comenzando por 0:”demux 0 1 2 3”.
En este ejemplo, hay dos inlets (“demux” solo tiene dos inlets) y cuatro outlets (uno por cada uno de sus arguments). Ingrese un numero en el inlet derecho que corresponda al numero de outlet. Ahora cualquier cosa que ingrese en su inlet izquierdo (number, symbol, list) saldrá por ese outlet:
Note que amenudo Pd comienza a contar desde 0 y no desde 1.
Otro objeto importante es “spigot”. Dependiendo de si su inlet derecho es un 0 o un 1, inpide o permite que su inlet izquierdo pase a su outlet. Como una compuerta, abierta o cerrada.
Como vimos en “spigot”, “= =”, y otros operadores relacionales , frecuentemente ocurren 0 y 1 en Pd. Debido a esta frecuencia, similar a “bang” para el click de mouse, hay un objeto grafico para alternar entre 0 y 1 llamado “toggle” (Put Toggle o con Shift-Ctrl-T).
Toggle parece un switch on/off y a menudo podemos pensarlo como tal. Pero siempre debe recordar que la computadora simplemente lo interpreta como un cambio entre 0 y 1.
Al conectar un toggle a “spigot” puede ver mas claramente si la compuerta esta abierta o cerrada. O ver si un operador relacional resulto positivo o negativo.
Veamos como estos conceptos trabajan en la practica:
Usando un list que asigna frecuencias a un oscilador acoplado a un volumen.
En el primer ejemplo vimos como un tono se encendía y se apagaba con 0 y 1. Puede usar un toggle para esto:
Para asignar alturas con nombres (elegidos libremente) a un oscilador:
Aquí hay un contador que enviá una altura particular al oscilador cada vez que recibe un bang:
Cuando, en lugar de un list, “route” recibe un valor que es equivalente a uno de sus arguments, enviá un bang al correspondiente outlet. En este ej., “route” funciona como una combinacion de varios selectors (otra posibilidad seria conectar varios objetos “sel” al contador: “sel 1”, “sel 2”,etc.).
El outlet mas a la derecha del objeto “route” no necesita estar conectado siempre que su entrada corresponda a un argument del objeto “route”.
Aquí hay un contador que cuenta de forma asendente empezando en 10 y se detiene en 17:
Esto puede ser útil para, digamos, rápidamente calcular valores de una función matemática dentro de determinado rango. Este ejemplo muestra la simple función cuadrática y = 2x dentro del rango 1 a 10
Para cálculos recursivos (donde el resultado es retroalimentado como entrada) como este, debe tener mucho cuidado de evitar un bucle infinito (infinite loop). Si reiniciamos este patch luego de que corrió una vez sin reingresar el valor inicial sino simplemente abriendo la compuerta y empezar los cálculos, comenzara mas arriba que 10 y contara por siempre (por que el “sel 10” que detiene el calculo nunca ocurrirá).
a) Cree una secuencia de lists con altura y dinámica.
b) Cree un patch que le permita usar un list con dos números, que representen el primer y el ultimo valor de un rango para x, para calcular valores de y en una ecuación por ej., valores para la funcion y = 3x desde x = -2 hasta x = 4.
Los symbol box funcionan como los number box (aunque son poco usados en Pd). Por ejemplo, “sel” también funciona con symbols:
Hay otros objetos GUI en el control level: El slider y el radio. El slider (Put HSlider o el VSlider). Es una representación gráfica de un number box. Sin embargo su rango esta restringido (por default es de 0 a 127):
El radio (Put Hradio o el Vradio) también es un representación gráfica de un number box, pero extremadamente limitado: solo unos pocos números (default 0 a 7) se pueden enviar, simplemente clickeando sobre el.
Sliders y radios pueden ser horizontales o verticales; solo difieren en su apariencia pero funcionan igualmente.
Una especificación “float” puede (por ej. con “triger”) ser expresada con un numero en lugar de “f” en Pd (cuyo valor algunas veces puede tener un rol, pero no siempre, por ej. puede ser valido en “f” o “pack” pero no en “t”):
Aunque, como esto es poco claro, no se recomienda usar numeros.
Algunas observaciones generales acerca de los boxes= cajitas: 1. Estrictamente hablando, todos los boxes son objetos que envían y reciben mensajes así como también reaccionan a estos mensajes según sus características. 2. Las conexiones muestran que objetos envían mensajes a cuales otros objetos. Si el outlet de un objeto esta conectado a varios inlets de varios otros objetos, entonces todos estos objetos reciben el mensaje. El orden (intencionalmente) no esta definido. 3. Hay objetos GUI que crean y envían mensajes basados en la interacción con el usuario. Ejemplos de objetos GUI son: bang, toggle, slider y canvas.
La música, como comúnmente se sabe, ocurre en el tiempo. Por eso, es esencial que un lenguaje de programación de audio sea capaz de controlar una secuencia cronológica (por ej. que duraciones/ritmos y secuencias de eventos puedan ser creadas).
El primer objeto básico para controlar la secuencia cronológica se llama “metro”. Como su nombre lo implica, es un metrónomo. Cuando se enciende o apaga (usando 1/0 en el inlet izquierdo o con un toggle), dispara bangs a intervalos regulares determinados por su argument o su inlet derecho.
El tempo esta expresado en milisegundos (ms), Que son milésimas de un segundo. Si quiere disparar un bang una vez por segundo, ingrese “metro 1000”, “metro 2000” para un bang cada dos segundos, “metro 500” para un bang cada medio segundo (igual a negras en 120).
"delay" ("del") retrasa un bang recibido por el numero de milisegundos en el argument o el inlet derecho:
"pipe" hace lo mismo con números y symbols que “delay” hace con bangs. La duración del retraso is ingresada en su argument. Por default “pipe” espera un numero en su inlet.
Si desea enviar un symbol, esto debe estar previamente ingresado en su argument (con una “s”, como “route”). Luego (o en su inlet derecho), determina la duración:
También “pipe” - como “pack”/”unpack” - puede tener varios inlets y outlets:
“pipe” maneja lists como “route”:
Si un valor esta `esperando` en un objeto “del” o “pipe”, puede ser cancelado antes de ser enviado con el mensaje “clear” (pipe) o “stop” (delay):
Con “line” puede crear una serie de números en el tiempo. En otras palabras puede comandar al programa para que comience a contar dentro de un determinado rango, ud. determina los valores de inicio y fin. “line” normalmente no tiene argumentos. El inlet derecho es la duración de la serie de números (default 0). El inlet izquierdo es el valor de destino (default 0; esto se puede cambiar en el argument).
Si ingresa un nuevo valor de destino en la izquierda, Pd pasa directo a ese numero. Esto es por que el valor de la derecha fue automáticamente reseteado a 0 y debe ser reingresado (esto es una excepción en Pd; normalmente los objetos de Pd guardan su “cold” inlet hasta que son reseteados). Alternativamente puede ingresar los dos valores (destino y duración) en un list:
Si clikea en el message box (nota del traductor: siempre y cuando ya lo hubiese hecho por lo menos una vez), nada sucede por que “line” ya llego a 4000 y se quedo allí. Si ingresa un nuevo valor de destino – por ej. 50 - “line” cuenta desde 4000 hasta 50 (en 1000 milisegundos)
Si desea comenzar con un numero particular y contar hasta otro numero en un determinado periodo de tiempo, primero debe ingresar un valor en el inlet izquierdo (sin haber ingresado nada por el inlet derecho). Esto causara que “line” valla directo a ese numero inicial (con un único message box); luego puede ingresar un list. Como mencionamos previamente en 2.2.2.1.2, Puede incluir varios mensajes en un message box, separados por comas, como se muestra aquí:
En este ejemplo, cada ves que el message box es clickeado, “line” cuenta desde 1500 a 4000 en 1000 milisegundos.
“timer” es como un cronometro. Conecte bangs a sus inlets. El tiempo medido es siempre el tiempo entre el bang izquierdo (el cual, por supuesto, debe ingresar primero) y el derecho (en milisegundos):
Aquí se puede ver que las operaciones de “trigger” no insumen tiempo en la computadora aunque ocurren uno después de otro:
(cf. 2.2.2.2.5)
“timer” es (de algun modo innecesario) una excepción a la regla de Pd que el ingreso de valores es de derecha a izquierda.
Ahora podemos realizar configuraciones musicales algo complicadas. Por ejemplo, una veloz melodía aleatoria automática:
Pruebe distintas velocidades para el metrónomo en el ejemplo de arriba (un number box al inlet derecho de “metro”)!
También puede crear ritmos irregulares basándose en la selección aleatoria:
En este ejemplo, los bangs del “metro” se envían a un intervalo entre 0 y 999 milisegundos (seleccionado al azar). Si desea, digamos, duraciones entre 500 y 1500 milisegundos use una simple suma:
La suma a una operación matemática como esta (aquí “+ 500”) se denomina un “offset”
Estos ritmos pueden luego ser conectados a un generador aleatorio y transferido a otro oscilador para lograr un canon rítmico:
(El “*~ 0.4” sera explicado luego.)
O puede hacer un canon verdadero:
O como crescendi y decrescendi ("sig~" Sera explicado mas adelante):
Nuevamente aquí se ve que, hasta ahora, el Pd solo usa números para los cálculos. Un crescendo es tan solo una serie de números como también lo es un glissando. También se puede decir que: un crescendo es un glissando de dinamica.
Puede construir un metrónomo así:
Primero hagamos un modelo visual que funcione, algo que haga que la señal bang del metrónomo se pueda ver. Las marcas para metrónomos se dan en pulsos por minuto, como en una partitura: negras = 60, negras = 100, etc.
Entonces debe convertir bpm (beats per minute) en milisegundos:
Ahora use este resultado como input para el metronomo.
No queríamos solo mirar estos impulsos en la pantalla, asi que escuchemoslo. Usemos el patch con sonido que teníamos anteriormente y preparemoslo como para que emita un tono corto por cada bang. Puede crear un tono corto asi:
Todo junto:
Una vez que las conexiones estén hechas, el metrónomo estará terminado. Luego veremos como incorporar una señal de sonido alternativa.
a) Cree una melodía aleatoria que cambie al próximo tono dos veces por segundo (alternativamente: con glissando).
b) Cree un metronomo con ritmos aleatorios irregulares (con un promedio de tempo ajustable).
c) Cree un metronomo que marque cinco veces en un tempo de negras = 60 y cinco veces en en un tempo de negras = 100.
d) Cree una melodía aleatoria que cambie cada dos segundos desde un registro bastante alto hasta un registro bastante bajo
Como vio con “line”, en Pd se puede ingresar un list en el inlet mas a la izquierda de un objeto que tiene varios inlets en lugar de conectar algo a cada inlet del objeto (aunque en algunos objetos no funcionara). Los elementos en el list son luego distribuidos en inlets de derecha a izquierda:
La resolución del tiempo para tareas en control level es en milisegundos.
Aunque a menudo no es preseteado. Puede imaginar que cálculos en milisegundos requieren un montón de poder de procesamiento (también llamado CPU*). Para “line” por ej., el preseteo es que cada paso ocurre en intervalos de 20 milisegundos:
Si desea contar desde 0 a 10 en 100 milisegundos, la computadora ejecuta un paso cada 20 milisegundos; por eso los sucesión de números esta incompleta.
Este intervalo (en milisegundos) puede ser ajustado en el objeto “line”, como un segundo argument (el primero es el valor de destino primario para el proceso de cuenta que eventualmente es reemplazado por su entrada):
Debe estar al tanto de que el resultado solo sera “limpio” mientras el poder de proceso de la computadora sea suficientemente alto. De otra forma habrá errores.
*CPU = unidad central de procesamiento. También hay otros procesadores, por ej. la placa de video, donde se calculan operaciones gráficas.
Para mejorar el “manejo” de Pd, hay varias opciones adicionales.
Para evitar conectar todos los objetos con `cables`, es posible usar los objetos “send” y “receive” para enviar y recibir cosas.
El argument para un objeto “send” puede ser un nombre. Un objeto “receive” que tenga como argument el mismo nombre recibe el input del objeto “send” y aparece en su outlet
"send"/"receive" ("s" y "r") son prácticos cuando necesita que data en forma de números sea enviada a diferentes lugares (aunque esto haga el patch mas difícil de comprender).
Estos nombres elegidos libremente (regresaremos a esto mas adelante) siempre deben ser ingresados sin espacios entre letras; números individuales no se permiten:
Si tiene diferentes receptores (con nombres diferentes), puede usar “remote” para ubicar mensajes desde un “punto de distribución” central (similar a “route”). Ud. le da a este objeto un list cuyo primer elemento es el nombre del receptor y cuyo segundo elemento es el mensaje mismo. “remote” es parte de Pd-extended.
Otra posibilidad es preceder el mensaje con un punto y coma en el message box. En este caso solo debe hacer click en el message box para enviar el mensaje.
Puede también enviar muchos mensajes en un message box (con un click):
En los message boxes, dos marcas de puntuación tienen especial importancia: `comas` (varios mensajes secuenciados) y `punto y coma` (representa el nombre del destinatario del envío)
Nota: en los message boxes, Pd deja un renglon despues de un punto y coma automaticamente. Si escribe lo siguiente:
y luego lo duplica (Ctrl-D) o cierra y reabre el patch, vera esto:
Esto también ocurre con los comments (2.1.4.5.).
Puede que quiera mantener varios valores para la próxima vez que abra un patch o puede que haya un “Value” particular que desea que reciba un bang al principio. Para lograr cualquiera de los dos, puede usar el objeto “loadbang” (emite un bang cuando un patch es abierto) o “init” (“ii”) que emite un numero o symbol (o un list de numeros, de symbols, o numeros y symbols)(este ultimo objeto en pd-extended).
GUI es por “graphical user interface” y se refiere a todos los objetos gráficos especiales en Pd. Objetos GUI son number y symbol boxes, bang, toggle, slider, radio, canvas, como también array y VU, ambos últimos serán explicados mas adelante. Todos los objetos GUI tienen funciones extendidas. Para acceder a ellas, click-derecho sobre el objeto y elegir “properties” con el botón izquierdo del mouse.
Los siguientes seteos se pueden hacer aquí:
width se refiere al ancho de la caja. Esto es de ayuda para visualizar números grandes o con muchos lugares decimales.
Use el lower y upper limit para ajustar el rango de valores que el objeto aceptara (por ejemplo puede usar el rango 0 a 1000).
Con label puede asignar un nombre al box para que se muestre en la pantalla (incluyendo la posición en que el nombre aparcera).
Con receive/send, puede asignar funciones send/receive al box. Por ejemplo, si ingresa “post1” en `send` y tiene un receptor llamado “post1”, este receptor recibirá los valores del number box. Lo mismo para la función “receive”.
Como puede observar en el gráfico, el inlet y el outlet desaparecen cuando una función send o receive interna esta activada.
Los cambios tienen efecto cuando clickea en “apply” o en “ok”.
size se refiere al tamaño que puede ser modificado (en pixels).
intrrpt/hold indica cuanto tiempo estara encendida la luz de actividad del bang (en milisegundos) .
init significa que el valor (en este caso un bang) sera enviado cuando el patch es abierto por primera vez (como “loadbang”).
El send symbol / receive symbol es como las funciones internas “send” / “receive” que describimos en number box.
Con name puede crear una “etiqueta” como en los number box. La posición es determinada con valores x e y. Ademas puede definir una fuente y su tamaño, y también elegir colores para el objeto. Primero elija el elemento que desea modificar...
... luego seleccione un color de las opciones dadas:
En “compose color” puede crear el color que desee.
"backgd" se refiere al fondo; el área entera del bang.
"front" se refiere al circulo central que parpadea cuando el bang esta
activo. (por un input o un mouse click)
Los cambios tienen efecto cuando clickea en “apply” o en “ok”.
Funciona igual que para bang, excepto en value: por default, `toggle` alterna entre 0 y 1. aquí puede ingresar otro valor para el 0 (el 1 siempre sera 1)
width: ancho en pixels
height: altura en pixels
bottom: valor mínimo del slider
top: valor máximo del slider
lin: Selecciona entre suma/resta lineal o logaritmica. Si clickea sobre el, aparecerá “log”. El modo que esta usando es el que se puede leer.
Nota: Con “log”, el 0 no puede usarse como punto de referencia.
init: El valor minimo del rango se enviá cuando el patch se abre.
steady on click: El slider es movido moviendo el mouse con el botón apretado. Si clickea en “steady on click”, aparecerá “jump on click”, esto causa que el slider valla inmediatamente al punto que ud. clickeo (dentro del slider).
El resto funciona como `bang`.
Con “radio” todo funciona igual que los otros objetos a excepción de number: La cantidad de botones.
Al final de 2.1.2. aprendimos que la superficie blanca donde se ubican los objetos se denomina “canvas”. También podemos agregar otras superficies coloreadas (Put Canvas). No tienen ninguna funcion ademas de ser superficies coloreadas.
La superficie contiene un cuadrado azul arriba a la izquierda – ese es el objeto. La superficie entera es el producto de este objeto. Cubre todos los elementos que fueron creados antes que el y queda abajo de los objetos creados despues.
Las `properties` son iguales a los otros objetos GUI.
Se puede modificar el tamaño para las fuentes de todos los objetos en Edit Font.
A medida que programa, puede que en algún punto se quede sin espacio. Por esta razón, puede guardar partes de su patch en lo que se denomina “Subpatches”. Si crea un objeto “pd” e ingresa un nombre (sin espacios) como argumento, por ej. “pd my_subpatch”, una nueva ventana se abre.(si cierra esta ventana puede volver a abrirla en execute mode clickeando en el objeto “pd my_subpatch” una vez). Ahora tiene mas espacio para partes de su patch.
Capitulo
Hay dos formas de conectar este subpatch a la primer ventana de su patch: “send” y “receive” funcionan en la misma ventana y también en las otras:
Aquí también puede verse que se puede alternar entre execute mode y edit mode en ventanas independientes.
La otra forma de crear una conexión es usando los objetos “inlet” y “outlet”. Si crea un objeto “inlet” en el subpatch, el objeto en la otra ventana llamado “pd my_subpatch” hace un inlet visible.
Si ingresa un valor en la ventana principal, este aparecerá en el subpatch.
El objeto “outlet” funciona igual:
Varios objetos “inlets” o “outlets” se ubican uno seguido de otro en el subpatch siguiendo el mismo orden que el objeto en la ventana principal:
Cuando se cierra la ventana del subpatch, este continua activo (permanece ejecutando tareas de proceso) mientras el patch principal este abierto.
Los subpatches no solo solucionan limitaciones espaciales, también ayudan a estructurar el patch mas claramente. Partes de un patch que cumplan determinadas tareas merecen un subpatch, de modo que esa pequeña `maquina` siempre esta disponible. Una parte como esta se denomina “modulo”. Aquí un simple modulo: un metrónomo que le permite ingresar bpm en lugar de milisegundos:
Los nombres que elija no deben tener espacios. En su lugar puede usar un guion o un guion bajo como en este ejemplo.