Étape 2: Audio répond aux traitement (puis OSC)
Maintenant que vous avez une source audio, il faut plonger dans le code :
/*
3D projection cartographique avec VPT via OSC
NIC Manille
Relève de l’International 4.0 Attribution-NonCommercial-ShareAlike (CC BY-NC-SA 4.0)
Avril 2014
*/
Import oscP5.* ;
Import netP5.* ;
Import controlP5.* ;
Cp5 ControlP5 ;
Bouton de gain ;
int gainVal ;
OscP5 oscP5 ;
MyRemoteLocation de la réalité ;
Import ddf.minim.analysis.* ;
Import ddf.minim.* ;
Minim minim ;
Jingle AudioInput ;
FFT fft ;
void setup()
{
Size (450, 300) ;
frameRate(60) ;
frame.setResizable(true) ;
CP5 = new ControlP5(this) ;
placeButtons() ;
oscP5 = new OscP5(this,6666) ;
myRemoteLocation = new NetAddress("127.0.0.1",6666) ;
minim = new Minim(this) ;
Jingle = minim.getLineIn() ;
FFT = nouvelle FFT (jingle.bufferSize(), jingle.sampleRate()) ;
fft.logAverages (86, 1) ;
}
échelle d’int = 2 ; changer pour la sensibilité globale
FFTon booléen = false ;
String viewOSC ; pour l’affichage des flux de la CVMO. utilisé dans l’onglet de la CVMO.
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) ;
texte ("Nic Manille", 170, 35) ;
effectuer une FFT vers l’avant sur les échantillons dans la mémoire tampon
FFT.Forward (jingle.mix) ;
if(FFTon)analyseAndSend() ; Si activé/désactivé, diffusion de valeurs FFT via OSC
}
void placeButtons() {}
gain = 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)
;
}
annuler bouton (int gainVal) {}
gainVal = gainVal ;
}
{} public void controlEvent (ControlEvent theEvent)
println(theEvent.getController().GetName()) ;
}
public void Toggle_FFT_broadcast (int valeur) {
FFTon = ! FFTon ;
}
Envoyer Sub (String path, float val) {}
OscMessage myMessage = new OscMessage(path) ;
myMessage.add(val) ;
/ * Envoyer le message * /
oscP5.send (myMessage, myRemoteLocation) ;
println (myMessage + « Envoyé ») ;
viewOSC = "flux d’OSC:" + myMessage ;
}
void analyseAndSend() {}
le suivant « envoie » est si vous utilisez des objets multi-faces nécessitant trois visages pour montrer la même chose
//Three faces de la boîte « groupe 1 »
Envoyer (« / » + str(1) + "layer/fade",fft.getAvg(1)/100*gainVal) ;
Envoyer (« / » + str(2) + "layer/fade",fft.getAvg(1)/100*gainVal) ;
Envoyer (« / » + str(3) + "layer/fade",fft.getAvg(1)/100*gainVal) ;
//
//Three faces de la boîte de bande 2
Envoyer (« / » + str(4) + "layer/fade",fft.getAvg(2)*2/100*gainVal) ;
Envoyer (« / » + str(5) + "layer/fade",fft.getAvg(2)*2/100*gainVal) ;
Envoyer (« / » + str(6) + "layer/fade",fft.getAvg(2)*2/100*gainVal) ;
//
//Three faces de la boîte de bande 3
Envoyer (« / » + str(7) + "layer/fade",fft.getAvg(3)*3/100*gainVal) ;
Envoyer (« / » + str(8) + "layer/fade",fft.getAvg(3)*3/100*gainVal) ;
Envoyer (« / » + str(9) + "layer/fade",fft.getAvg(3)*3/100*gainVal) ;
//
//Three faces de la boîte de bande 4
Envoyer (« / » + str(10) + "layer/fade",fft.getAvg(4)*4/100*gainVal) ;
Envoyer (« / » + str(11) + "layer/fade",fft.getAvg(4)*4/100*gainVal) ;
Envoyer (« / » + str(12) + "layer/fade",fft.getAvg(4)*4/100*gainVal) ;
//
//Three faces de la boîte de bande 5
Envoyer (« / » + str(13) + "layer/fade",fft.getAvg(5)*5/100*gainVal) ;
Envoyer (« / » + str(14) + "layer/fade",fft.getAvg(5)*5/100*gainVal) ;
Envoyer (« / » + str(15) + "layer/fade",fft.getAvg(5)*5/100*gainVal) ;
//
//Three faces de la boîte de bande 6
Envoyer (« / » + str(16) + "layer/fade",fft.getAvg(6)*6/100*gainVal) ;
Envoyer (« / » + str(17) + "layer/fade",fft.getAvg(6)*6/100*gainVal) ;
Envoyer (« / » + str(18) + "layer/fade",fft.getAvg(6)*6/100*gainVal) ;
//
//Three faces de la boîte de bande 7
Envoyer (« / » + str(19) + "layer/fade",fft.getAvg(7)*8/100*gainVal) ;
Envoyer (« / » + str(20) + "layer/fade",fft.getAvg(7)*8/100*gainVal) ;
Envoyer (« / » + str(21) + "layer/fade",fft.getAvg(7)*8/100*gainVal) ;
le suivant « envoie » est si vous utilisez des objets recto nécessitant qu’une seule valeur envoyée
pour (int i = 0; j’ai < 9; i ++) //iterate à travers les bandes
{
Si (j’ai == 8 || j’ai == 9) {envoyer (« / » + str(i) + "layer/fade",(fft.getAvg(i)*i/100)*gainVal*2);} //trebles besoin d’un peu d’un punch s’affiche bien
else {envoyer (« / » + 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) ;
texte ("bande/Layer" + str(i),50,104+i*10) ;
}
Fill(150) ;
textSize(12) ;
Text(viewOSC,50,60) ;
}
Avez-vous tous cette ?
Un rapide traversent :
Audio est chargé dans une mémoire tampon. Cette mémoire tampon est FFTed et la moyenne en 9 bandes. Ces bandes sont parcourus pour obtenir leur valeur avec une portée d’environ 0 à 1 (donc une valeur à virgule flottante). Cette valeur est concaténée avec la chaîne qui correspond à une commande d’OSC destinée à VPT. Cette chaîne est ensuite diffusée sur OSC sur l’adresse IP 127.0.0.1 (numéro de port 6666). Il y a également une interface graphique qui montre les fréquences pour chaque bande et un bouton de Gain, ce qui peut amplifier le signal, si votre source est un peu mou.
Remarque : je n’ai jamais travaillé avec analyse audio avant cela, donc je l’avoue mon algorithme pour obtenir un spectre précis est sans doute un peu éteint. Si quelqu'un est plus clued là-dessus, je serais ravi d’entendre une meilleure façon d’y arriver (j’ai le sentiment que c’est avec quelques fonctions mathématiques savoureux!)