Paso 2: Audio cumple con procesamiento (entonces OSC)
Ahora que tienes una fuente de audio, tenemos que bucear en el código:
/*
Mapeo de proyección en 3D con VPT vía OSC
Grillo de NIC
Cataratas bajo internacional 4.0 Reconocimiento-NoComercial-CompartirIgual (CC BY-NC-SA 4.0)
Abril de 2014
*/
Import oscP5.*;
Import netP5.*;
Import controlP5.*;
ControlP5 cp5;
Perilla de ganancia;
int gainVal;
OscP5 de OscP5;
MyRemoteLocation NetAddress;
Import ddf.minim.analysis.*;
Import ddf.minim.*;
Mínima mínima;
Jingle AudioInput;
FFT fft;
void setup()
{
tamaño (450, 300);
frameRate(60);
frame.setResizable(true);
CP5 = nuevo ControlP5(this);
placeButtons();
oscP5 = new OscP5(this,6666);
myRemoteLocation = new NetAddress("127.0.0.1",6666);
mínima = nuevo Minim(this);
Jingle = minim.getLineIn();
FFT = FFT nuevos (jingle.bufferSize(), jingle.sampleRate());
fft.logAverages (86, 1);
}
int escala = 2; cambio de la sensibilidad general
Boolean FFTon = false;
String viewOSC; para mostrar el flujo de OSC. utilizado en la ficha OSC.
void draw()
{
Background(0);
Fill(0,40);
noStroke();
Rect(0,0,width,height);
Fill(50);
Rect(0,0,width,47);
textSize(30);
Fill(200);
textAlign(LEFT);
Text("OSC_panel",10,35);
textSize(10);
texto ("Nic grilletes", 170, 35);
realizar una FFT hacia adelante en las muestras en el buffer
FFT.Forward (jingle.mix);
if(FFTon)analyseAndSend(); Si activa, difusión de valores a FFT través de OSC
}
void placeButtons() {}
ganancia = cp5.addKnob("gainVal")
.setRange(0,50)
.setValue(1)
.setPosition(300,70)
.setRadius(50)
.setDragDirection(Knob.VERTICAL)
;
CP5.addButton("Toggle_FFT_broadcast")
.setValue(0)
.setPosition(50,70)
.setSize(200,19)
;
}
anular la perilla (int gainVal) {}
gainVal = gainVal;
}
público vacío controlEvent (ControlEvent evento) {}
println(theEvent.getController().getName());
}
público void Toggle_FFT_broadcast (int theValue) {
FFTon =! FFTon;
}
void enviar (String ruta, flotador val) {}
OscMessage myMessage = nuevo OscMessage(path);
myMessage.add(val);
/ * enviar el mensaje * /
oscP5.send (myMessage, myRemoteLocation);
println (myMessage + "Enviados");
viewOSC = "flujo de OSC:" + myMessage;
}
void analyseAndSend() {}
el siguiente "envía" son si usas objetos de lados múltiples que requieren tres caras para mostrar lo mismo
//Three caras de la caja "banda 1"
enviar ("/" + str(1) + "layer/fade",fft.getAvg(1)/100*gainVal);
enviar ("/" + str(2) + "layer/fade",fft.getAvg(1)/100*gainVal);
enviar ("/" + str(3) + "layer/fade",fft.getAvg(1)/100*gainVal);
//
//Three caras de la caja de la banda 2
enviar ("/" + str(4) + "layer/fade",fft.getAvg(2)*2/100*gainVal);
enviar ("/" + str(5) + "layer/fade",fft.getAvg(2)*2/100*gainVal);
enviar ("/" + str(6) + "layer/fade",fft.getAvg(2)*2/100*gainVal);
//
//Three caras de la caja de la banda 3
enviar ("/" + str(7) + "layer/fade",fft.getAvg(3)*3/100*gainVal);
enviar ("/" + str(8) + "layer/fade",fft.getAvg(3)*3/100*gainVal);
enviar ("/" + str(9) + "layer/fade",fft.getAvg(3)*3/100*gainVal);
//
//Three caras de la caja de la banda 4
enviar ("/" + str(10) + "layer/fade",fft.getAvg(4)*4/100*gainVal);
enviar ("/" + str(11) + "layer/fade",fft.getAvg(4)*4/100*gainVal);
enviar ("/" + str(12) + "layer/fade",fft.getAvg(4)*4/100*gainVal);
//
//Three caras de la caja de la banda 5
enviar ("/" + str(13) + "layer/fade",fft.getAvg(5)*5/100*gainVal);
enviar ("/" + str(14) + "layer/fade",fft.getAvg(5)*5/100*gainVal);
enviar ("/" + str(15) + "layer/fade",fft.getAvg(5)*5/100*gainVal);
//
//Three caras de la caja de la banda 6 de
enviar ("/" + str(16) + "layer/fade",fft.getAvg(6)*6/100*gainVal);
enviar ("/" + str(17) + "layer/fade",fft.getAvg(6)*6/100*gainVal);
enviar ("/" + str(18) + "layer/fade",fft.getAvg(6)*6/100*gainVal);
//
//Three caras de la caja de la banda 7
enviar ("/" + str(19) + "layer/fade",fft.getAvg(7)*8/100*gainVal);
enviar ("/" + str(20) + "layer/fade",fft.getAvg(7)*8/100*gainVal);
enviar ("/" + str(21) + "layer/fade",fft.getAvg(7)*8/100*gainVal);
el siguiente "envía" son si usas los objetos de un solo lado que requieren solamente un valor enviado
para (int i = 0; i < 9; i ++) //iterate a través de las bandas
{
Si (i == 8 || i == 9) {enviar ("/" + str(i) + "layer/fade",(fft.getAvg(i)*i/100)*gainVal*2);} //trebles necesitan un poco de un empuje para demostrar para arriba muy bien
Else {enviar ("/" + str(i) + "layer/fade",(fft.getAvg(i)*i/100)*gainVal);}
Stroke(25*i,50,50);
strokeWeight(5);
line(120,100+i*10,120+FFT.getAvg(i)*i*gainVal,100+i*10);
textSize(10);
Fill(150);
texto ("banda/capa" + str(i),50,104+i*10);
}
Fill(150);
textSize(12);
Text(viewOSC,50,60);
}
¿Sacaste todo eso?
Un rápido pase por:
Audio se carga en un búfer. Eso almacenador intermediario es FFTed y un promedio de 9 bandas. Esas bandas son iteración para obtener su valor con un rango de aproximadamente 0 a 1 (por lo tanto un punto flotante de valor). Ese valor se concatena con un string que corresponde a un comando OSC que destinado para VPT. Esa cadena es entonces transmitida sobre OSC en dirección IP 127.0.0.1 (número de Puerto 6666). También hay una interfaz gráfica que muestra las frecuencias para cada banda y una perilla de ganancia, que puede aumentar la señal si su fuente es un poco suave.
Nota: Nunca trabajé con análisis de audio antes de esto, así que admito mi algoritmo para obtener un espectro exacto es probablemente un poco apagado. Si alguien clued para arriba más en esto, me encantaría escuchar de una mejor manera de hacerlo (tengo la sensación con algunos matemáticas sabroso!)