En Mosaic, la señal de entrada del teclado puede utilizarse para interactuar con las instrucciones programadas en el código, o mediante los objetos key pressed o key released, es decir, puede hacerse por scripting lua, por programación visual, o por una mezcla de ambos simultáneamente.
Interactividad por eventos de teclado
Interactividad por eventos de teclado con programación visual
En el menú objetos, dentro de la tipología Communications están los objetos key pressed y key released que transmiten un bang cuando la tecla presionada o soltada se corresponde con la indicada en su interface. Para saber el número que se corresponde con cada tecla, ambos objetos indican en su interface cuál es la última tecla presionada o soltada, por lo que si presionamos/soltamos la tecla buscada solo tenemos que escribir el número que nos indica.

Con el bang que transmiten se pueden activar otros objetos, como se puede ver en el siguiente ejemplo; el patch plantea una estructura simple para una estación de live cinema utilizando solo las teclas 1 (49), 2 (50), y 3 (51).
La tecla 1 está vinculada a los objetos key pressed y key released, de manera que al presionarla se detendrá el primer video y al soltarla retomará su reproducción. Para eso los bang que transmiten ambos objetos se envían a un bang multiplexer, cuya salida va simultáneamente a un objeto counter y a un objeto player controls. Cada vez que se presiona la tecla 1 el bang activa el objeto counter (el valor de su outlet pasará de 3 a 4 o viceversa), y envía un bang al objeto player controls para que lea el valor que el objeto counter le envía por su inlet select, estos valores le indican pausa/no-pausa.
La tecla 2 actúa de forma similar pero solo a través del objeto key released (solo cada vez que se suelte la tecla), activando otro objeto counter para que envíe el valor para pausar o no pausar al segundo objeto player controls.
La tecla 3 también envía el bang a un objeto counter cuyos valores van de 1 a 3, y en este caso regulan el selector de salida de un objeto video gate. Al soltar la tecla 3 por primera vez, el objeto video gate dará paso al video 1, la segunda vez al video 2, luego al 3 y la siguiente de nuevo al 1, y así sucesivamente.
Interactividad por eventos de teclado con scripting Lua
Para que Mosaic reconozca los eventos del teclado enviados desde el objeto lua script hay que conectar sus outlets azul (la textura) y rojo (live coding) al objeto output window.
En el código, la variable que reconoce las acciones del teclado para enviar al sistema los datos es key, y viene predefinida en el template del script Lua en Mosaic, vinculada a los bloques:
function keyPressed(key) end function keyReleased(key) end
Para que el sistema sepa cuál es la tecla presionada o soltada, se puede utilizar una estructura condicional, dentro de estos bloques:
if key == string.byte("g") then -- si la tecla presionada/soltada es g minúscula, entonces -- haz tal cosa -- end
La función de Lua string.byte()
devuelve los códigos numéricos ASCII de los caracteres.
Otra opción es saber el código ASCII de las teclas, pero hay que tener en cuenta que no son siempre iguales en las distintas plataformas. Para conocerlo se puede hacer un Log (monitorizar en la consola de salida el valor de la variable solicitada) con la función of.log()
situada en los bloques function keyPressed(key)
o function keyReleased(key)
function keyPressed(key) of.log(of.LOG_NOTICE,key) end
En openFrameworks, la función of.log()
tiene diferentes niveles de respuesta que se regulan según la variable de sistema que se ponga como primer parámetro: of.LOG_NOTICE
, of.LOG_WARNING
, of.LOG_ERROR
, para conocer el valor de una variable se utiliza of.LOG_NOTICE
.
En el caso de programación con eventos de teclado, suele usarse para las teclas especiales como las teclas de flecha en sus cuatro direcciones, Enter, Esc…, poniendo directamente:
if key == 57357 then
Al presionar una tecla sobre la ventana de proyector, saldrá en el Logger de Mosaic (u consola de salida) el código numérico que le corresponde.
Si un proyecto de arte interactivo contempla estados o eventos diferentes, generados como respuesta de algún dispositivo, es habitual simularlos primero con eventos de teclado para comprobar su funcionamiento.
En el siguiente ejemplo los eventos de teclado programados con lua actúan tanto dentro de los gráficos que genera el código en función de la tecla presionada, como a través de los datos que salen del objeto Lua script por el vector _mosaic_data_outlet. Hay que señalar que en lua la tabla de ese vector empieza por 1, no por 0, por lo que en el código su primera posición es _mosaic_data_outlet[1], pero en el objeto Vector at que lo recoge la primera posición es 0
----------------------------------- MOSAIC VARS (DO NOT TOUCH) -- variables for mouse interaction mouseX = 0 mouseY = 0 -- variable for storing _mosaic_data_inlet size mosaic_data_inlet_size = 0 ----------------------------------- MOSAIC VARS (DO NOT TOUCH) ----------------------------------- MY VARS evento = 1 ----------------------------------- MY VARS ---------------------------------------------------- -- main methods ---------------------------------------------------- function setup() ------------------------------------------------ MY CODE -- add here your setup code ------------------------------------------------ MY CODE end ---------------------------------------------------- function update() ------------------------------------------------ MOSAIC CODE mosaic_data_inlet_size = getMosaicDataInletSize() -- send data to _mosaic_data_outlet if needed -- we are using here just the first position of the table -- but you can expand it with numerical data as you need it -- _mosaic_data_outlet[1] = of.random(10) ------------------------------------------------ MOSAIC CODE ------------------------------------------------ MY CODE -- add here your update code ------------------------------------------------ MY CODE end ---------------------------------------------------- function draw() ------------------------------------------------ MOSAIC CODE checkMosaicDataInlet() ------------------------------------------------ MOSAIC CODE ------------------------------------------------ MY CODE -- draw background first mosaicBackground(0,0,0,255) if evento == 1 then for i = 0, OUTPUT_HEIGHT/2, 20 do of.setColor(78, 147, 158, 50) of.setCircleResolution(3) --triángulos of.drawCircle(OUTPUT_WIDTH/2, OUTPUT_HEIGHT/2, i+2) end elseif evento == 2 then for i = 0, OUTPUT_HEIGHT/2, 20 do of.setColor(0, 110, 156, 50) of.setCircleResolution(6) --hexágonos of.drawCircle(OUTPUT_WIDTH/2, OUTPUT_HEIGHT/2, i+3) end elseif evento == 3 then for i = 0, OUTPUT_HEIGHT/2, 20 do of.setColor(0, 31, 64, 50) of.setCircleResolution(12) --dodecágonos of.drawCircle(OUTPUT_WIDTH/2, OUTPUT_HEIGHT/2, i+1) end end ------------------------------------------------ MY CODE end ---------------------------------------------------- function exit() end ---------------------------------------------------- -- input callbacks ---------------------------------------------------- function keyPressed(key) end ---------------------------------------------------- function keyReleased(key) if key == string.byte('1') then evento = 1 elseif key == string.byte('2') then evento = 2 elseif key == string.byte('3') then evento = 3 end -- datos de salida desde el objeto Lua script if key == string.byte('a') then _mosaic_data_outlet[1] = 1 elseif key == string.byte('s') then _mosaic_data_outlet[1] = 2 end end ----------------------------------------------------