scratch con max/msp y processing [VIDEO] and some source
Posted on 08.04.09 by i2off @ 9:52 PM

esa es una version que testeamos junto a la gente de Sudala.cl (pablo y nolo)
muchas gracias a ellos por la onda para probarlo

aca va un pic del main patch de maxmsp
main patch Scratch App on Max/MSP

y aca va el source de processing del control de la bandeja

import oscP5.*;
import netP5.*;

OscP5 oscP5;
NetAddress myRemoteLocation;

int ww=800;
int hh=600;
int discoX=400;
int discoY=400;
float rotaDisco=0;

float SDJlengthsample=0;
float SDJVUELTA=1818.18;
float SDJval=0;
float SDJval2 = 0;
float SDJval2rad=0;
float SDJval2radT=0;
float SDJlastval=0;
float SDJvalT=0;
float SDJvalFrame=0;
float SDJvalFrameT=0;
float SDJgradT=0;
float SDJrota=0;
float SDJrotaAnt=0;
int SDJmodostop=0;
float SDJinercia=0.0;
float SDJinercia2=0.0;

int SDJmouseDown=0;

void setup(){
size(ww,hh,P3D);
oscP5 = new OscP5(this,12000);
myRemoteLocation = new NetAddress("127.0.0.1",13000);
OscMessage myMessage = new OscMessage("/sDJ/requestData");
myMessage.add(1);
oscP5.send(myMessage, myRemoteLocation);
}
void draw(){
background(50);
if(mousePressed){
if(SDJmouseDown==0){
SDJval2radT = atan2(mouseX-discoX,mouseY-discoY);
SDJgradT=SDJval2radT;

SDJmouseDown=1;
if(SDJmodostop==0){
SDJrota=0;
SDJrotaAnt=0;
SDJinercia=0;
OscMessage myMessage = new OscMessage("/sDJ/mouseState");
myMessage.add(1);
oscP5.send(myMessage, myRemoteLocation);
}
}else{
float gg=atan2(mouseX-discoX,mouseY-discoY);
float grad1=(gg-SDJgradT)%(PI);
if(grad1>PI/2.0){
grad1-=PI;
}
if(grad1<-PI/2.0){
grad1+=PI;
}
SDJgradT=gg;
SDJrota+=grad1;
float vv=SDJrota;//(rota-val2radT);
SDJval2rad = SDJvalT-vv;
//if(grad1!=0){
SDJinercia=grad1;
//}
float ff=(((((-vv*180.0/PI)+180.0)/360.0)-0.5)*SDJVUELTA);
float SDJval2 = SDJvalFrameT+ff;
if(SDJval2<0){
SDJval2=SDJlengthsample-(abs(SDJval2)%SDJlengthsample);
}
//println(SDJlengthsample);
OscMessage myMessage = new OscMessage("/sDJ/newPos");
myMessage.add(SDJval2);
oscP5.send(myMessage, myRemoteLocation);
}
}else{
if(SDJmouseDown==1){
if(SDJmodostop==0){
OscMessage myMessage = new OscMessage("/sDJ/mouseState");
myMessage.add(0);
oscP5.send(myMessage, myRemoteLocation);
}
SDJmouseDown=0;
}

}
pushMatrix();
ellipseMode(CENTER);
translate(discoX,discoY,0);
if(SDJmouseDown==0 && SDJmodostop==0){
SDJval2=SDJvalFrame;
SDJvalFrameT=SDJvalFrame;
SDJval2rad=SDJval;
SDJvalT=SDJval;
SDJinercia*=0.9;
OscMessage myMessage = new OscMessage("/sDJ/inercia");
myMessage.add(SDJinercia);
oscP5.send(myMessage, myRemoteLocation);
rotateZ(SDJval);
}else{
if(SDJmouseDown==0){
makeInercia();
}
rotateZ(SDJval2rad);

}

fill(255);
ellipse(0,0,300,300);
translate(0,130,0);
fill(100);
ellipse(0,0,30,30);
popMatrix();
rotaDisco+=0.1;
}
void makeInercia(){
SDJrota+=SDJinercia;
float vv=SDJrota;
SDJval2rad = SDJvalT-vv;
float ff=(((((-vv*180.0/PI)+180.0)/360.0)-0.5)*SDJVUELTA);
SDJval2 = SDJvalFrameT+ff;
if(SDJval2<0){
SDJval2=SDJval2+SDJlengthsample;
}
SDJinercia*=0.95;
OscMessage myMessage = new OscMessage("/sDJ/newPos");
myMessage.add(SDJval2);
oscP5.send(myMessage, myRemoteLocation);
}
void oscEvent(OscMessage theOscMessage) {
/* print the address pattern and the typetag of the received OscMessage */
//print("### received an osc message.");
//print(" addrpattern: "+theOscMessage.addrPattern());
//println(" typetag: "+theOscMessage.typetag());
if(theOscMessage.checkAddrPattern("/sDJ/rotadisco")){
float v=theOscMessage.get(0).floatValue();
//println(v);
SDJval = (((v%SDJVUELTA)/SDJVUELTA)*360.0)*PI/180;
SDJvalFrame=v;
}
if(theOscMessage.checkAddrPattern("/sDJ/setlength")){
float v=theOscMessage.get(0).floatValue();
SDJlengthsample=v;
}
if(theOscMessage.checkAddrPattern("/sDJ/setstop")){
SDJmodostop=1;
SDJrota=0;
SDJrotaAnt=0;
SDJinercia=0;
OscMessage myMessage = new OscMessage("/sDJ/mouseState");
myMessage.add(1);
oscP5.send(myMessage, myRemoteLocation);
}
if(theOscMessage.checkAddrPattern("/sDJ/setplay")){
SDJmodostop=0;
OscMessage myMessage = new OscMessage("/sDJ/mouseState");
myMessage.add(0);
oscP5.send(myMessage, myRemoteLocation);
}
}


Filed under: audio and maxmsp and processing and sourcecode
Comments: None

SamsungDJ (scratch con maxmsp/processing en un touchscreen)[pruebas y codigo en max/msp]
Posted on 07.29.09 by i2off @ 9:14 PM

->versiones files
v0.1:
en este primer paso la idea era tener andando la pista y poder modificar la velocidad de reproduccion rapidamente con interpolacion, para lograr un sonido tipo scratch
maxmsp samsung dj v0.1
source maxmsp scratch v0.1

v0.2:
puse un objeto JSUI el cual puedo programar por javascript y una mascara de opengl para poder hacerme mi propio elemento. La idea es pasarle a este la posicion del cabezal para que rote el disco. Y hacerlo activo al mouse, para que pueda rotar el disco yo y que pase el cambio de velocidad al control del groove~.
con esto tengo 2 problemas que uno deriva en el otro:
cuando muevo lento el disco, la interpolacion es mas rapida que el refresco de movimiento (dado que el JSUI solo actualiza cuando el mouse se mueve), entonces hace microcortes. La solucion para esto fue usar 2 tipos de interpolaciones dependiendo de la amplitud del movimiento, si el movimiento es corto, la interpolacion es mas larga.
esto trae un gran inconveniente de esto, a pesar de que suena bien, es que si muevo el cabezal, no queda acomodado a la posicion correcta. Entonces no puedo tener referencia visual, de la posicion del disco en relacion al audio.

source maxmsp scratch v0.2

v0.3:
costo pero entendi un monton de cosas, despues de no dormir 2 dias pensando en como solucionar el problema de tener una referencia real de la posicion del cabezal en mi elemento JSUI, y poder controlar realmente en el scratch a donde quiero moverme, me di cuenta que la solucion estaba en lugar de manejar con el componente la velocidad de movimiento, debia indicar directamente a que parte queria moverme.
el motivo por el que no lo hice antes, era que el objeto groove~ no tiene manejo por puntero, sin por velocidad de reproduccion. La solucion fue hacer que calcule la distancia entre donde estaba y a donde quiero ir, y usar eso con un gran easyng (0.01).
tuve que cambiar varias cosas, por ejemplo que si no estaba clickeando, debia enviar por otro lado la senial de velocidad continua, asi que aproveche para ponerle un pitch.
Encontre tambien grandes dificultades en el jsui para manejar el control de los eventos del mouse, realmente deja mucho que desear en ese sentido.
en esta version muchos calculos que realizaba con patches los hago adentro del componente ya.
con esta version hice la primera demo, y ya empeze a acomodar todo para que quede en una version en modo presentation

maxmsp scratch v0.3
maxmsp scratch app v0.3 presentation
source maxmsp scratch app v0.3

v0.4:
aca ya empiezan los refinamientos, el principal era poder usar el scratch cuando estaba estopado el disco, y que el movimiento tenga inercia. descubri algo terrible del jsui, que es que en mouseRealese (que no tiene ese metodo) dispara un mouseDrag con la misma ubicacion del anterior mouseDrag, lo que me hacia perder todo calculo de inercia. Pero bueno, hardcodeando un poco lo solucione.
tambien le agregue el primer control para poder tener loops. Lo que tengo que ver ahora es de hacer el calculo de beats, y sobre eso segmentar los loops.
maxmsp scratch app v0.4
maxmsp scratch app v0.4 presentation
source maxmsp scratch app v0.4


Filed under: audio and maxmsp and processing and sourcecode
Comments: None

SamsungDJ (scratch con maxmsp/processing en un touchscreen)
Posted on 07.29.09 by i2off @ 8:23 PM

Origen de la idea:
La gente de Leo Burnet en conjunto con 2 productores amigos Agustina Panigazzi y Nacho Amato (de la productora Buena) nos vinieron a buscar hace un par de dias con un proyecto particular.
Con motivo del lanzamiento del nuevo celular de Samsung M7600 Beat DJ nos pidieron una pieza interactiva.
El celular tiene como feature principal la posibilida de experimentar la musica desde una vision de DJ, ya que montado sobre el reproductor de audio tiene un motor que permite desde la visualicacion hasta la experiencia acercarnos a la idea de tocar con una bandeja. Desde la seleccion del albun a un modo scratch donde uno tiene (dado que el celular es touchscreen) la posibilidad de hacer scratch sobre la pista. Incluso tiene la posibilidad de aplicar efectos como reverb, lowpass, highpass, marcar loops o ejecutar samples sobre la pista. Otro detalle interesante es que el hardware de audio del celular es propiedad de Bang and Olufsen.
http://uk.samsungmobile.com/mobile-phones/samsung-beat-dj
Tomando esas caracteristicas nos pidieron que repliquemos ese funcionamiento a gran escala (en un monitor touchscreen SAMSUNG 460TSn. de 46 pulgadas) y lo mas realista posible comparado con la experiencia de un DJ e incluso agregando la posibilidad de que la gente grabe su vos y pueda por ejemplo hacer scratch sobre ella.

Objetivos:
Primario:

Poder transladar la experiencia a una escala mayor, y amplificar la calidad de esta. Para que la experiencia sea una fantasia exponencial de lo que sucede con el celular en el aspecto DJ.

Secundarios:

Desarrollar el proyecto de forma modular para que sea posible el desarrollo de un entorno para DJ real.
Desarrollar las faces modularmente para que puedan incorporarse distintos tipos de interfaces al software profesional, no solo grafica sino tecnologicamente para hacer ports a distintos entornous touch y multitouch (lemur, iPhone, reaktable, surface, etc)

Tester:
vamos a invitar a DJ Rol3x a participar del proyecto como tester, para que el no solo chequee la utilidad, sino que incluso nos guien en el desarrollo hacia una buena herramienta

Pasos:
Hay varios pasos en este desarrollo
pero en este caso vamos a enfocarnos en el desarrollo de la aplicacion madre para el audio

Necesidad:
Necesito un entorno que me permita controlar archivos de audio en alta calidad en tiempo real, permitiendome resamplearlos a distintas velocidades y con diversos efectos.

Investigacion Previa:
Candidateamos 3 entornos posibles para este desarrollo:
Processing, dado que ya tenemos mucha experiencia e incluso trabajos previos con audio en tiempo real, processing fue la primera opcion que se nos ocurrio. Pero tiene una gran contra, que es el bajo rendimiento.

OpenFrameworks, fue la opcion pensada para suplir el problema que encontrabamos con processing. Pero nos encontramos con otro problema aqui, que es la falta de buenas librerias, estables y documentadas, para la manipulacion de audio en tiempo real.

Max/Msp, es un entorno en donde se testaca por sobre todo el rendimiento, es un lenguaje estrictamente usado para el desarrollo de aplicaciones de audio y nos garantizaba confiabilidad y vastos recursos para aplicar filtros etc.

asi es que la investigacion inicial dio como conclusion que el mejor entorno era Max/Msp

Observacion del terreno:
El siguiente paso, es determinar en el entorno seleccionado cual sera el enfoque para dimensionar la complejidad y formas de abordaje.
Por lo tanto habia que examinar que objetos, modulos, etc tiene el Max/Msp para poder emular lo mas real posible la actividad de una bandeja de DJ. Esto implica recorrer el manual, ejemplos, foros… por suerte hace un tiempo haciendo el soft para el simil Monome que habiamos fabricado ya habia trabajado con situaciones parecidas de manipulacion de audio y resampleo. Busque el source y recorde que usaba el objeto:
groove~
que parece ser el objeto perfecto y resumido para lo que estamos buscando. E incluso nos soluciona aparentemente el seteo de loops. Incluso tiene una devolucion con valores normalizados (0 a 1) del progreso del sonido en su ejecucion lo cual es escencial para el display grafico.
Otro de los elementos a chequear, era la complejidad del trabajo con OSC, dado que esta aplicacion seria un modulo controlable desde distintas posibles GUI necesitamos elaborar un protocolo dentro de OSC para una comunicacion fluida.
Para esta situaciones encontramos el objeto:
udpreceive y udpsend
que resuelven el trabajo aparentemente de forma sencilla
El ultimo punto importante para evaluar en el terrano, es determinar la forma de abordaje de los efectos tanto para convulaciones como para filtros por dft
En ese sentido encontre, dedicandole un poco de tiempo a buscar en la web, una serie de patchs ya armados para distintos efectos como reverb, de todas formas creo que el camino mas rapido va a ser el de usar Reaktor como VST para el Max/Msp y de esta forma aplicar todo tipo de efectos desde reaktor en tiempo real.

Ya abordadas las observaciones mas conflictivas (supuestamente) del terreno el siguiente paso es hacer la primer prueba de campo.

Pruebas de campo:
La primer prueba consistira en hacer un sistema muy rudimentario que envie una senial por OSC y que mueva el cabezal del audio player en esa direccion y velocidad.

Tecnologias a usar:

Max/Msp para el control del audio

OSC para el envio de la senial

Processing para la rustica GUI

Elementos necesarios

.una interface que controle cuando clickeo en un area, la posicion del mouse y envia via OSC un valor que refleje la diferencia en relacion a la posicion anterior

.un breve desarrollo del protocolo

.una aplicacion que ejecute el audio determinado por la info que recibe

Observaciones

tengo que observar y probar si conviene mas controlar por velocidad de avance y retroceso, o controlar por envio del cabezal a una posicion determinada y calcular eso.

Pronto videos, imagenes y codigo.


Filed under: audio and maxmsp and processing and sourcecode
Comments: None

Tracking FX en Realtime con FaceRecognition
Posted on 07.20.09 by i2off @ 6:47 PM

y el codigo para Processing

import processing.opengl.*;
import hypermedia.video.*;
OpenCV opencv;

int ancho_sketch = 800; //
int alto_sketch = 600; //
//-----------------------//
int ancho_captura = 320;
int alto_captura = 240;

PImage cara;

void setup() {
size(ancho_sketch,alto_sketch,OPENGL);
opencv = new OpenCV(this);
opencv.capture( ancho_captura , alto_captura );
opencv.cascade(OpenCV.CASCADE_FRONTALFACE_ALT);
cara = createImage(80, 60, RGB);
}
void draw() {
background(0);
Rectangle[] faces = opencv.detect();
opencv.read();
//image( opencv.image(),0,0);
//saveFrame(”cam####.png”);
//background(0);
for( int i=0; i int x = faces[i].x;
int y = faces[i].y;
int w = faces[i].width;
int h = faces[i].height;
//cara.copy(opencv.image(),x,y,w,h,0,0,cara.width,cara.height);
x = (x*100)/ancho_captura;
x = (width*x)/100;
y = (y*100)/alto_captura;
y = (height*y)/100;
w = (w*100)/ancho_captura;
w = (width*w)/100;
h = (h*100)/alto_captura;
h = (height*h)/100;

float dw=120.0/w;
float cx=(x+w/2.0);
float cy=(y+h/2.0);
translate(width/2,height/2,0);
scale(dw,dw,dw);
translate(-cx,-cy,0);

image( opencv.image(), 0, 0,width,height );
//saveFrame("fx####.png");
}

}


Filed under: opencv and processing and sourcecode
Comments: 1 Comment

Stream.i2offPlusR3nder

Main Menu
Home
audio
maxmsp
opencv
processing
quartzcomposer
sourcecode
Uncategorized
videomapping

Search

  • Sites

  • Social


  • Syndication
    RSS 2.0
    Comments RSS 2.0
    WordPress

    Credits and Copyright
    Proudly powered by WordPress. All content © 2004-2005 Author
    Wordpress Firewall (*)

    Archives
    August 2009
    July 2009
    April 2009
    March 2009
    December 2008
    September 2008
    August 2008

    Recent Entries
    scratch con max/msp y processing [VIDEO] and some source
    SamsungDJ (scratch con maxmsp/processing en un touchscreen)[pruebas y codigo en max/msp]
    SamsungDJ (scratch con maxmsp/processing en un touchscreen)
    Guia de Setup de OpenCV con XCode
    Tracking FX en Realtime con FaceRecognition
    Video Mapping sobre superficie Curva, solucion 1
    Nueva Version de OpenFrameworks [permite exportar para iPhone]
    Entorno Para programacion tipo Max/Msp en Processing
    About
    Multitouch para el gobierno de la ciudad de buenos aires
    Automapeo para proyeccion
    Proximas Fechas [Paris y Emiratos Arabes Unidos]
    Proxima fecha, BOGOTA!
    LightPixelApp+ RegnumLuminis [que hay tras LightPixelJockey] [arduino+processing]
    CLANDESTINA WEEKEND NERD NUMBER 3