Projektion mappas ljudfönstret (2 / 5 steg)
Steg 2: Ljud möter bearbetning (sedan OSC)
Nu när du har en ljudkälla, behöver vi dyka in koden:
/*
3D projektion kartläggning med VPT via OSC
NIC boja
Faller under Erkännande-IckeKommersiell-DelaLika 4.0 International (CC BY-NC-SA 4.0)
April 2014
*/
import oscP5.*;
import netP5.*;
import controlP5.*;
ControlP5 cp5;
Knopp vinning.
int gainVal;
OscP5 oscP5;
NetAddress myRemoteLocation;
import ddf.minim.analysis.*;
import ddf.minim.*;
Minim minim;
AudioInput jingle;
FFT fft;
void setup()
{
storlek (450, 300);
frameRate(60);
frame.setResizable(true);
cp5 = nya ControlP5(this);
placeButtons();
oscP5 = ny OscP5(this,6666);
myRemoteLocation = ny NetAddress("127.0.0.1",6666);
Minim = nya Minim(this);
Jingle = minim.getLineIn();
FFT = nya FFT (jingle.bufferSize(), jingle.sampleRate());
fft.logAverages (86, 1);
}
int skala = 2; ändra för känslighet övergripande
booleska FFTon = false;
Sträng viewOSC; för att Visa OSC stream. används i OSC fliken.
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);
text ("Nic boja", 170, 35);
utföra en framåt FFT på prover i bufferten
FFT.Forward (jingle.mix);
IF(FFTon)analyseAndSend(); om växlas, broadcast FFT värden via OSC
}
void placeButtons() {
vinna = 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)
;
}
Annullera knopp (int gainVal) {
gainVal = gainVal;
}
public void controlEvent (ControlEvent theEvent) {
println(theEvent.getController().getName());
}
public void Toggle_FFT_broadcast (int theValue) {
FFTon =! FFTon;
}
void skicka (String väg, flyta val) {
OscMessage myMessage = ny OscMessage(path);
myMessage.add(val);
/ * Skicka meddelandet * /
oscP5.send (myMessage, myRemoteLocation);
println (myMessage + "Skickat");
viewOSC = "OSC ström:" + myMessage;
}
void analyseAndSend() {
de följande "skickar" är om du använder flersidiga objekt som kräver tre ansikten att visa samma sak
//Three ansikten om rutan "band 1"
Skicka ("/" + str(1) + "layer/fade",fft.getAvg(1)/100*gainVal);
Skicka ("/" + str(2) + "layer/fade",fft.getAvg(1)/100*gainVal);
Skicka ("/" + str(3) + "layer/fade",fft.getAvg(1)/100*gainVal);
//
//Three ansikten av band 2 box
Skicka ("/" + str(4) + "layer/fade",fft.getAvg(2)*2/100*gainVal);
Skicka ("/" + str(5) + "layer/fade",fft.getAvg(2)*2/100*gainVal);
Skicka ("/" + str(6) + "layer/fade",fft.getAvg(2)*2/100*gainVal);
//
//Three ansikten av bandet 3 box
Skicka ("/" + str(7) + "layer/fade",fft.getAvg(3)*3/100*gainVal);
Skicka ("/" + str(8) + "layer/fade",fft.getAvg(3)*3/100*gainVal);
Skicka ("/" + str(9) + "layer/fade",fft.getAvg(3)*3/100*gainVal);
//
//Three ansikten av bandet 4 box
Skicka ("/" + str(10) + "layer/fade",fft.getAvg(4)*4/100*gainVal);
Skicka ("/" + str(11) + "layer/fade",fft.getAvg(4)*4/100*gainVal);
Skicka ("/" + str(12) + "layer/fade",fft.getAvg(4)*4/100*gainVal);
//
//Three ansikten av bandet 5 box
Skicka ("/" + str(13) + "layer/fade",fft.getAvg(5)*5/100*gainVal);
Skicka ("/" + str(14) + "layer/fade",fft.getAvg(5)*5/100*gainVal);
Skicka ("/" + str(15) + "layer/fade",fft.getAvg(5)*5/100*gainVal);
//
//Three ansikten av bandet 6 låda
Skicka ("/" + str(16) + "layer/fade",fft.getAvg(6)*6/100*gainVal);
Skicka ("/" + str(17) + "layer/fade",fft.getAvg(6)*6/100*gainVal);
Skicka ("/" + str(18) + "layer/fade",fft.getAvg(6)*6/100*gainVal);
//
//Three ansikten av band 7 box
Skicka ("/" + str(19) + "layer/fade",fft.getAvg(7)*8/100*gainVal);
Skicka ("/" + str(20) + "layer/fade",fft.getAvg(7)*8/100*gainVal);
Skicka ("/" + str(21) + "layer/fade",fft.getAvg(7)*8/100*gainVal);
de följande "skickar" är om du använder enkelsidig objekt som kräver endast ett värde skickas
för (int jag = 0; jag < 9; i ++) //iterate genom band
{
om (jag == 8 || jag == 9) {skicka ("/" + str(i) + "layer/fade",(fft.getAvg(i)*i/100)*gainVal*2);} //trebles behöver lite av en glans att visa upp fint
annat {skicka ("/" + 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);
text ("Band/lager" + str(i),50,104+i*10);
}
Fill(150);
textSize(12);
text(viewOSC,50,60);
}
Fick du alla det?
En snabb springa igenom:
Ljud läses in i en buffert. Denna buffert är FFTed och i genomsnitt i 9 band. Dessa band är upprepade genom för att få sitt värde med en räckvidd på ca 0 till 1 (därav ett flyttal värde). Detta värde är sammanfogat med en sträng som motsvarar en OSC kommandot avsedda för VPT. Denna sträng sänds sedan över OSC på IP-adressen 127.0.0.1 (portnummer 6666). Det finns också ett GUI som visar frekvenser för varje band och en vinst knopp, som kan öka signalen om din källa är lite mjuk.
Obs: Jag har aldrig arbetat med ljud analys innan detta, så jag erkänna min algoritm för att få en exakt spektrum är förmodligen lite off. Om någon är mer clued upp på detta, skulle jag gärna höra en bättre väg att gå om det (jag har en känsla av det med några läckra matematik!)