Stap 2: Audio voldoet aan Processing (toen OSC)
Nu hebt u een audio-bron, moeten we om te duiken in de code:
/*
3D projectie mapping met VPT via OSC
NIC Shackle
Valt onder de Naamsvermelding-NietCommercieel-GelijkDelen 4.0 internationaal (CC BY-NC-SA 4.0)
April 2014
*/
importeren van oscP5.*;
importeren van netP5.*;
importeren van controlP5.*;
ControlP5 cp5;
Knop winst;
int gainVal;
OscP5 oscP5;
NetAddress myRemoteLocation;
importeren van ddf.minim.analysis.*;
importeren van ddf.minim.*;
Minim minim;
AudioInput jingle;
FFT fft;
VOID Setup
{
grootte (450, 300);
frameRate(60);
frame.setResizable(true);
cp5 = nieuwe ControlP5(this);
placeButtons();
oscP5 = nieuwe OscP5(this,6666);
myRemoteLocation = nieuwe NetAddress("127.0.0.1",6666);
Minim = nieuwe Minim(this);
Jingle = minim.getLineIn();
FFT = nieuwe FFT (jingle.bufferSize(), jingle.sampleRate());
fft.logAverages (86, 1);
}
int schaal = 2; voor algemene gevoeligheid wijzigen
Boole FFTon = false;
String viewOSC; voor het tonen van OSC stream. gebruikt in OSC tabblad.
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);
tekst ("Nic Shackle", 170, 35);
uitvoeren van een voorwaartse FFT op de monsters in de buffer
FFT.forward (jingle.mix);
if(FFTon)analyseAndSend(); Als het van een knevel gevoorzid, uitgezonden FFT waarden via OSC
}
ongeldig placeButtons() {}
krijgen = 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)
;
}
VOID knop (int gainVal) {}
gainVal = gainVal;
}
openbare nietige controlEvent (ControlEvent theEvent) {}
println(theEvent.getController().getName());
}
public void Toggle_FFT_broadcast (int theValue) {}
FFTon =! FFTon;
}
VOID send (String pad, zweven val) {}
OscMessage myMessage = nieuwe OscMessage(path);
myMessage.add(val);
/ * signaal * /
oscP5.send (myMessage, myRemoteLocation);
println (myMessage + "Verzonden");
viewOSC = "OSC stream:" + myMessage;
}
ongeldig analyseAndSend() {}
de volgende "verzendt" zijn als u van meerdere zijden objecten waarvoor drie gezichten gebruikmaakt te tonen van het zelfde ding
//Three vlakken van het vak "band 1"
verzenden ("/" + str(1) + "layer/fade",fft.getAvg(1)/100*gainVal);
verzenden ("/" + str(2) + "layer/fade",fft.getAvg(1)/100*gainVal);
verzenden ("/" + str(3) + "layer/fade",fft.getAvg(1)/100*gainVal);
//
//Three vlakken van band 2 vak
verzenden ("/" + str(4) + "layer/fade",fft.getAvg(2)*2/100*gainVal);
verzenden ("/" + str(5) + "layer/fade",fft.getAvg(2)*2/100*gainVal);
verzenden ("/" + str(6) + "layer/fade",fft.getAvg(2)*2/100*gainVal);
//
//Three vlakken van band 3 vak
verzenden ("/" + str(7) + "layer/fade",fft.getAvg(3)*3/100*gainVal);
verzenden ("/" + str(8) + "layer/fade",fft.getAvg(3)*3/100*gainVal);
verzenden ("/" + str(9) + "layer/fade",fft.getAvg(3)*3/100*gainVal);
//
//Three vlakken van band 4 vak
verzenden ("/" + str(10) + "layer/fade",fft.getAvg(4)*4/100*gainVal);
verzenden ("/" + str(11) + "layer/fade",fft.getAvg(4)*4/100*gainVal);
verzenden ("/" + str(12) + "layer/fade",fft.getAvg(4)*4/100*gainVal);
//
//Three gezichten van band 5 box
verzenden ("/" + str(13) + "layer/fade",fft.getAvg(5)*5/100*gainVal);
verzenden ("/" + str(14) + "layer/fade",fft.getAvg(5)*5/100*gainVal);
verzenden ("/" + str(15) + "layer/fade",fft.getAvg(5)*5/100*gainVal);
//
//Three vlakken van band 6 vak
verzenden ("/" + str(16) + "layer/fade",fft.getAvg(6)*6/100*gainVal);
verzenden ("/" + str(17) + "layer/fade",fft.getAvg(6)*6/100*gainVal);
verzenden ("/" + str(18) + "layer/fade",fft.getAvg(6)*6/100*gainVal);
//
//Three vlakken van band 7 vak
verzenden ("/" + str(19) + "layer/fade",fft.getAvg(7)*8/100*gainVal);
verzenden ("/" + str(20) + "layer/fade",fft.getAvg(7)*8/100*gainVal);
verzenden ("/" + str(21) + "layer/fade",fft.getAvg(7)*8/100*gainVal);
de volgende "verzendt" zijn als u enkelzijdig objecten waarvoor maar één waarde die wordt verzonden
voor (int i = 0; ik < 9; i ++) //iterate door de bands
{
Als (ik 8 == || ik == 9) {verzenden ("/" + str(i) + "layer/fade",(fft.getAvg(i)*i/100)*gainVal*2);} //trebles moet een beetje van een oomph mooi opdagen
else {verzenden ("/" + 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);
tekst ("Band/laag" + str(i),50,104+i*10);
}
Fill(150);
textSize(12);
Text(viewOSC,50,60);
}
Heb je al dat?
Een snelle doorlopen:
Audio wordt geladen in een buffer. Die buffer is FFTed en gemiddeld in 9 bands. Deze banden zijn herhaald door om hun waarde met een bereik van ongeveer 0 tot 1 (vandaar een drijvende punt waarde). Die waarde wordt samengevoegd met een tekenreeks die overeenkomt met een opdracht van de OSC bestemd voor VPT. Deze tekenreeks wordt het dan uitgezonden via OSC op IP-adres 127.0.0.1 (poortnummer 6666). Er is ook een GUI die de frequenties voor elke band en een Gain knop, die het signaal kan opvoeren toont, als uw bron een beetje zacht is.
Opmerking: Ik heb nooit gewerkt met audio analyse voordat dit, dus ik geef mijn algoritme toe om een nauwkeurige spectrum is waarschijnlijk een beetje af. Als iemand is meer clued up op dit, zou ik graag horen van een betere manier om te gaan doen (ik heb een gevoel dat het met enkele smakelijke wiskunde!)