tak po neviemakej dobe som sa dostal k processingu trochu - kedze bol dovod. nejako pomaham pri jednom projekte kde sa chcu hrat s interaktivnym 3d zvukom (neprogramatori)
tak som si robil volajaky vyskum kade tade a .. prisiel som k "zazraku" openAL - je to principialne nieco ako openGL len pre audio. problem je trochu akurat v tom ze to chce HW podporu karty (nuz, ano je to vymysel creativelabs, takze plnu HW podporu to ma len na ich kartach) alebo sa to da ej emulovat na sw urovni - existuje soft openAL (pre widly a lunexy)
taakze oprasil som z policky svoju staru audigy a napchal to do pocitadla a znovu ju rozbehal
do processingu existuje sice kniznica toxiclibs a ta podporu openAL (teda jej javovu implementaciu ma).
zopar hacikov to malo... mat openAL dllka v systemovom foldri nie je dobry napad. treba ich mat pri joal jarkach aby to islo z nejakeho divneho dovodu.
dalsia podla openAL SDK sa akykolvek efekt/pozicia identifikuju cez id sourcu, ktore generuje program. ked som kukal do zdrojakov joalu tak mi prislo az zle ako to robi.. pokial sa generuje samostatny source tak co... kazdemu to spravi rovnake id takze nejako rozdelit efektovanie a ulozenie v priestore n na niekolko nezavislych sourcov je celkom peklo, ale nakoniec som to vyriesil, so zakladnym prototypom OALUtil (od tvorcu toxiclibs) ktory som nasiel na forach processingu, a pozerani sa do zdrojakov joal som si bol schopny vyrobit funkcnu vec, s dvoma aux slotmi do ktorych zvuky mozem uplne nezavisle posielat, a cele sa to zvukovu hybe v 3d priestore..
takto vyzera samotny zvukovy particle system (skusal som to zatial len na sluchatkach, ale funguje to celkom dobre, som zvedavy na 5.1 sustave co to povie)
import net.java.games.sound3d.*;
import net.java.games.joal.*;
import net.java.games.joal.util.*;
OALUtil audioSys;
Source[] audioLoop;
Particle[] particles;
int numParticles = 32;
String[] fls;
Listener user;
boolean lines = false;
int w = 500;
int h = 500;
int prevposx=0;
int prevposy=0;
void setup() {
size(h,w);
background(0);
audioSys = new OALUtil();//inicializacia audiosystemu
println(audioSys.alcIsExtensionPresent());
particles = new Particle[numParticles];
audioLoop = new Source[numParticles];
fls=new String[numParticles];
for(int i=0;i {
fls[i]="c:/processing/ringfire/ringoffire/"+(i)+".wav";//pole s nazvami wavov, aby fungoval 3D zvuk je potrebne aby to boli mono vavy
particles[i] = new Particle();
particles[i].x = random(w);
particles[i].y = random(h);
particles[i].vx = random(-1, 1);
particles[i].vy = random(-1, 1);
}
try {
audioLoop=audioSys.loadSources(fls,numParticles);//natiahnem si zvukove sourcy
}
catch (Exception e)
{
e.printStackTrace();
}
int[] effects = new int[2];
audioSys.al.alGenEffects(2, effects, 0);//vyrobim dva efekty -
audioSys.al.alEffecti(effects[0], AL.AL_EFFECT_TYPE, AL.AL_EFFECT_ECHO);
audioSys.al.alEffecti(effects[1], AL.AL_EFFECT_TYPE, AL.AL_EFFECT_RING_MODULATOR);
int[] effectslots = new int[2];//vytvorim si dva send sloty - moja zvukovka aj tak viac nezvlada
audioSys.al.alGenAuxiliaryEffectSlots(2, effectslots, 0);
//priradim efekty do slotov
audioSys.al.alAuxiliaryEffectSloti(effectslots[0], AL.AL_EFFECTSLOT_EFFECT, effects[0]);
audioSys.al.alAuxiliaryEffectSloti(effectslots[1], AL.AL_EFFECTSLOT_EFFECT, effects[1]);
//nastavim sloty aby gain bol automaticky vzhladom na polohu zvuku v priestore
audioSys.al.alAuxiliaryEffectSloti(effectslots[0],AL.AL_EFFECTSLOT_AUXILIARY_SEND_AUTO, AL.AL_TRUE);
audioSys.al.alAuxiliaryEffectSloti(effectslots[1],AL.AL_EFFECTSLOT_AUXILIARY_SEND_AUTO, AL.AL_TRUE);
//ponastavujem si zvukove sourcy
for(int i=0;i {
audioLoop[i].setLooping(true);
audioLoop[i].setGain(0.2);
audioLoop[i].setReferenceDistance(width/200);//referencna velkost pre spocitanie v priestore
audioLoop[i].setVelocity((particles[i].vx),(particles[i].vy),0f);//inicialna rychlost sourcu
audioLoop[i].setPosition(particles[i].x,particles[i].y,0);//inicialna pozicia
audioSys.al.alSource3i(i+1, AL.AL_AUXILIARY_SEND_FILTER, effectslots[0], 0, AL.AL_FILTER_NULL);//poslanie sourcu do aux1
audioSys.al.alSource3i(i+1, AL.AL_AUXILIARY_SEND_FILTER, effectslots[1], 1, AL.AL_FILTER_NULL);//poslanie sourcu do aux2
//ako prvy parameter by malo byt id(poradie) sourcu, ale z nejakeho mne zatial zahadneho dovodu musi byt realne o jednu vyssie aby to ozaj fungovalo
}
user = audioSys.getListener();
fill(50,255,0);
ellipse(width/2,height/2,30,30);
user.setPosition(width/2,height/2,0);//umiestnim posluchaca do priestoru
user.setGain(1);
for(int i=0;i {
audioLoop[i].play();//postpustam zvuky
}
}
void draw()
{
for(int i=0;i {
//vykreslim graficku a zvukovu reprezentaciu "particlu"
particles[i].move();
audioLoop[i].setPosition(particles[i].x,particles[i].y,0);//pozicia zvuku - pre zmiesavanie
audioLoop[i].setVelocity(particles[i].vx,particles[i].vy,0f);//rychlost zvuku - pouziva ju zvukovka pre pocitanie doppleru ked zmiesava zvuk
particles[i].render();
}
//vykreslim si listenera
ellipseMode(CENTER);
fill(50,255,0);
ellipse(width/2,height/2,30,30);
}
public void stop() {
if (audioLoop[0] != null) {
audioLoop[0].delete();
audioLoop[0] = null;
}
if (audioSys != null) {
audioSys.cleanup();
audioSys = null;
}
}
mno a toto su potrebne kniznice (ako dalsie taby v processingu)
samotny ovladaci audioengine
import javax.sound.sampled.UnsupportedAudioFileException;
class OALUtil {
public AL al;
private ALC alc;
int[] uiFilter;
public OALUtil() {
uiFilter =new int[1];
uiFilter[0]=0;
try {
initOpenAL();
}
catch (ALException e) {
throw new RuntimeException("OpenAL could not be initialized: "
+ e.getMessage());
}
}
private void initOpenAL() throws ALException {
AudioSystem3D.init();
alc = ALFactory.getALC();
al = ALFactory.getAL();
ALCdevice device;
ALCcontext context;
String deviceID;
// Get handle to default device.
device = alc.alcOpenDevice(null);
if (device == null) {
throw new ALException("Error opening default OpenAL device");
}
deviceID = alc.alcGetString(device, ALC.ALC_DEVICE_SPECIFIER);
if (deviceID == null) {
throw new ALException(
"Error getting specifier for default OpenAL device");
}
System.out.println("Using device " + deviceID);
// Create audio context.
context = alc.alcCreateContext(device, null);
if (context == null) {
throw new ALException("Can't create OpenAL context");
}
alc.alcMakeContextCurrent(context);
if (alc.alcGetError(device) != ALC.ALC_NO_ERROR) {
throw new ALException("Unable to make context current");
}
}
public void cleanup() {
ALCcontext curContext;
ALCdevice curDevice;
curContext = alc.alcGetCurrentContext();
curDevice = alc.alcGetContextsDevice(curContext);
alc.alcMakeContextCurrent(null);
alc.alcDestroyContext(curContext);
alc.alcCloseDevice(curDevice);
al = null;
alc = null;
}
public Buffer loadBuffer(InputStream is) throws UnsupportedAudioFileException, IOException {
Buffer[] buf = AudioSystem3D.generateBuffers(1);
WAVData wd = WAVLoader.loadFromStream(is);
buf[0].configure(wd.data, wd.format, wd.freq);
return buf[0];
}
public Buffer loadBuffer(String fileName) throws IOException, UnsupportedAudioFileException {
return AudioSystem3D.loadBuffer(fileName);
}
public Source[] loadSources(String[] stream,int sources) throws UnsupportedAudioFileException, IOException {
Buffer[] buf = AudioSystem3D.generateBuffers(sources);
Source[] src;
src=new Source[sources];
src=AudioSystem3D.generateSources(sources);
for(int i=0;i {
WAVData wd = WAVLoader.loadFromFile(stream[i]);
buf[i].configure(wd.data, wd.format, wd.freq);
src[i].setBuffer(buf[i]);
}
return src;
}
public Source loadSource(InputStream stream) throws UnsupportedAudioFileException, IOException {
return AudioSystem3D.generateSource(loadBuffer(stream));
}
public Listener getListener() {
return AudioSystem3D.getListener();
}
public Source createSource(Buffer buffer) {
return AudioSystem3D.generateSource(buffer);
}
public void addFilter()
{
al.alSourcei(0, ALConstants.AL_DIRECT_FILTER, 0);
}
public Boolean alcIsExtensionPresent()
{
ALCcontext curContext;
ALCdevice curDevice;
curContext = alc.alcGetCurrentContext();
curDevice = alc.alcGetContextsDevice(curContext);
return alc.alcIsExtensionPresent(curDevice,"ALC_EXT_EFX");
}
public int createFilter(int filtertype, float gain, float gainlimit) {
int filters[] = new int[1];
al.alGenFilters(1, filters, 0);
al.alFilteri(filters[0], AL.AL_FILTER_TYPE, filtertype);
al.alFilterf(filters[0], filtertype, gain);
al.alFilterf(filters[0], filtertype, gainlimit);
return filters[0];
}
public void deleteFilter(int filter) {
al.alDeleteFilters(1, new int[] {
filter
}
, 0);
}
}
a class particlov (niekde na nete najdeny)
class Particle
{
public float x = 0;
public float y = 0;
public float vx = 0;
public float vy = 0;
public float k = .03;
public boolean lines = true;
public color col = color(255, 255, 0, 20);
private float grav = 0;
private float angle = 0;
public void Particle()
{
}
public void move()
{
float dx = mouseX - x;
float dy = mouseY - y;
float dist = sqrt(dx*dx + dy*dy);
angle += .05;
if(dist < 100)
{
float tx = mouseX - dx / dist * (cos(angle) * 50 + 50);
float ty = mouseY - dy / dist * (sin(angle) * 50 + 50);
vx += (tx - x) * k;
vy += (ty - y) * k;
}
else
{
float force = 2000 / (dist * dist);
vx += force * dx / dist;
vy += force * dy / dist;
}
vx += random(-1, 1);
vy += random(-1.5, 1.5);
vy += grav;
vx *= .95;
vy *= .95;
x += vx;
y += vy;
if(x > w)
{
x = w;
vx *= -1;
}
if(x<0)
{
x = 0;
vx *= -1;
}
if(y > h)
{
y = h;
vy *= -1;
}
if(y < 0)
{
y = 0;
vy *= -1;
}
}
public void render()
{
stroke(col);
strokeWeight(5);
if(lines)
{
line(x, y, x-vx, y-vy);
}
else
{
point(x, y);
}
}
}
When I sleep, I dream too much