bonjour
je fais actuellement un patch qui selectionne 4 lecteur wave pour les faire jouer dependament de la valeur dune variable de 0 a 3 sur Pure data
la commende de la variable arrive de processing via OSC
mon probleme est que quand je lance tous mes programme (processing et pure data)
la fonction [sel #] envoie toujours des bang ce qui fais redémarrer le sample a chaque bang recu
si jutilise des message dans mon patch pour dire [0 (, si je pèse dessus il me sort uniquement 1 bang donc jusque la tous fonctionne mais j ai l impression que processing envoi le chiffre "0" 5 fois par seconde via OSC
il y a t il un moyen pour que processing envoie juste une fois le chiffre 0 ?
merci
a+
Hors ligne
Salut,
as tu mis ton instruction (envoi OSC) dans ta fonction draw() ? si oui c'est normal puisque cette fonction est une boucle infinie. Placer alors ton code dans un if et ne le déclencher qu'en fonction d'une condition que tu auras fixé. Tu peux aussi le mettre dans setup() qui lui n'est exécuté qu'une fois au démarrage. Mais tout dépend de ce que tu attend de ton programme et quand/comment tu veux communiquer avec PD...
Hors ligne
Salut
oui justement il est dans le draw ..... maintenant je comprend
j ai une fonction Osc() que je declare dans draw car mes autre variable faut qu il sois répéter
donc esce que je peut mettre une condition dans mon void Osc () Je mexplique
OscMessage myFidMp3 = new OscMessage("/fid0Mp3"); myFidMp3.add(mp3State[0]); myFidMp3.add(mp3State[1]); myFidMp3.add(mp3State[2]); myFidMp3.add(mp3State[3]); // if(rotAngle10 != rotAngle10) { <-- es ce que je peut faire sa comme sa ? myFidMp3.add(rotAngle10); } myFidMp3.add(volAngle10); myFidMp3.add(tobjState[10]); oscP5.send(myFidMp3, myRemoteLocation);
en gros j ai besoin d un si la valeur de "rotAngle" change envoi la nouvelle variable
merci
a+
Hors ligne
salut tous le monde
bon j ai essayer de le mettre dans un if mais aussitôt que la condition est rempli il envoi a pure data encore en boucle du au draw() je sais plus quoi faire je suis a cour d idée
auriez vous une solution ?
merci
a+
Hors ligne
Qu'est-ce que tu veux faire exactement ?
Quel sont les actions que tu souhaites pour ton programme ? son déroulé ?
Sois plus précis et aiguille nous sinon on ne peut pas trop t'aider
Hors ligne
sinon, si t'y arrive spas dans processing, tu peux utiliser [change] dans pd qui évitera les répétitions de nombre. Cependant c'est une solution moyennement élégante, t'auras toujours torp de ressources affectées à l'envoi de ta valeur depuis Processing ce qui peut avoir des conséquences déplaisantes pour le cpu ; mais ça fonctionnera.
Hors ligne
salut a tous
merci VIC pour ta réponse mais vue que je fais un logiciel de musique de type "reactable" le moin de Charge cpu je prend le mieux c'est non ?
voici mon code (juste une parti) mais désoler il n est pas balisé je suis pas rendu la ses sur que j aurais pu le faire au fur et a mesure mais bon
import TUIO.*; import oscP5.*; import netP5.*; OscP5 oscP5; NetAddress myRemoteLocation; TuioProcessing tuioClient; fidGui[] fidGui = new fidGui[100]; fid_fonction[] fid_fonction = new fid_fonction[100]; String[] fileName; String mp3 = "nada"; float songTime; int I; int nada; int circlex=25; int circley=-2; int circleSize = 60; int SIZE = 69; int sineWave0 = 1 , squareWave0 = 0, sawWave0 = 0, noiseWave0 = 0; int sineWave1 = 1 , squareWave1 = 0, sawWave1 = 0, noiseWave1 = 0; int[] tobjState; int[] mp3State; int[] parametreMp3; int[] midiNote = new int[10]; int[] songNumero = new int[5]; int[] mp3_PD_State = new int[20]; float xpostcurScreen,ypostcurScreen; float xposTcur,yposTcur,yposTcur1; float circleX, circleY; float[] rotAngle = new float[100]; float angle = 0,angle1 = 0; float[] fidXpos = new float[100]; float[] fidYpos = new float[100]; float[] fidXposScreen = new float[100]; float[] fidYposScreen = new float[100]; float[] volAngle; float[] getAngle = new float[100]; float BPM = 120; float millisPerBeat = 1000/(BPM/60.0); float cursor_size = 15; float object_size = 60; float table_size = 760; float scale_factor = 1; float volume; PFont font; float volAngle0, volAngle1, volAngle2, volAngle3, volAngle10; float rotAngle0, rotAngle1, rotAngle2, rotAngle3, rotAngle10; boolean[] parametreWave; boolean nadabool; boolean parametreWavebool = false; boolean parametreInstrumentbool = false, parametreInstrumentbool1 = false; boolean tcurState = false; boolean overRect(float x, float y, float width, float height) { if (xpostcurScreen >= x && xpostcurScreen <= x+width && ypostcurScreen >= y && ypostcurScreen <= y+height ) { return true; } else { return false; }} void setup() { //size(screen.width,screen.height); size(640,480); noStroke(); smooth(); loop(); hint(ENABLE_NATIVE_FONTS); font = createFont("Arial", 18); scale_factor = height/table_size; tuioClient = new TuioProcessing(this); oscP5 = new OscP5(this,9996); myRemoteLocation = new NetAddress("127.0.0.1",9997); parametreWave = new boolean[5]; for (int i = 0; i < 5; i++) { parametreWave[i] = false; } volAngle = new float[100]; for (int i = 0; i < 100; i++) { volAngle[i] = 0; } fileName = new String[20]; for (int i = 0; i < 20; i++) { fileName[i] = "File.Mp3"; } parametreMp3 = new int[5]; for (int i = 0; i < 5; i++) { parametreMp3[i] = 0; } tobjState = new int[100]; for (int i = 0; i < 100; i++) { tobjState[i] = 0; } mp3State = new int[4]; for (int i = 0; i < 4; i++) { mp3State[i] = 0; } } void draw() { midiNote[2] = int(getAngle[2]); midiNote[3] = int(getAngle[3]); songNumero[0] = int(getAngle[10]); songNumero[1] = int(getAngle[11]); songNumero[2] = int(getAngle[12]); songNumero[3] = int(getAngle[13]); songNumero[4] = int(getAngle[14]); background(125,125,255); textFont(font,18*scale_factor); centerCircle(); tempo(); Tobject(); Tcursor(); Osc(); //*******FID # 0 a 3********************************** fidGui[0] = new fidGui(fidXpos[0],fidYpos[0],fidXposScreen[0], fidYposScreen[0], rotAngle[0],xposTcur,yposTcur,xpostcurScreen,ypostcurScreen); fid_fonction[0] = new fid_fonction(fidXpos[0],fidYpos[0],fidXposScreen[0], fidYposScreen[0], rotAngle[0],xposTcur,yposTcur,xpostcurScreen,ypostcurScreen,nada,volAngle[0],nada,nada,nada); fidGui[1] = new fidGui(fidXpos[1],fidYpos[1],fidXposScreen[1], fidYposScreen[1], rotAngle[1],xposTcur,yposTcur,xpostcurScreen,ypostcurScreen); fid_fonction[1] = new fid_fonction(fidXpos[1],fidYpos[1],fidXposScreen[1], fidYposScreen[1], rotAngle[1],xposTcur,yposTcur,xpostcurScreen,ypostcurScreen,nada,volAngle[1],nada,nada,nada); fidGui[2] = new fidGui(fidXpos[2],fidYpos[2],fidXposScreen[2], fidYposScreen[2], rotAngle[2],xposTcur,yposTcur,xpostcurScreen,ypostcurScreen); fid_fonction[2] = new fid_fonction(fidXpos[2],fidYpos[2],fidXposScreen[2], fidYposScreen[2], rotAngle[2],xposTcur,yposTcur,xpostcurScreen,ypostcurScreen,midiNote[2],volAngle[2],nada,nada,nada); fidGui[3] = new fidGui(fidXpos[3],fidYpos[3],fidXposScreen[3], fidYposScreen[3], rotAngle[3],xposTcur,yposTcur,xpostcurScreen,ypostcurScreen); fid_fonction[3] = new fid_fonction(fidXpos[3],fidYpos[3],fidXposScreen[3], fidYposScreen[3], rotAngle[3],xposTcur,yposTcur,xpostcurScreen,ypostcurScreen,midiNote[3],volAngle[3],nada,nada,nada); //***********FID # 10 a 14***************************** fidGui[10] = new fidGui(fidXpos[10],fidYpos[10],fidXposScreen[10], fidYposScreen[10], rotAngle[10],xposTcur,yposTcur,xpostcurScreen,ypostcurScreen); fid_fonction[10] = new fid_fonction(fidXpos[10],fidYpos[10],fidXposScreen[10], fidYposScreen[10], rotAngle[10],xposTcur,yposTcur,xpostcurScreen,ypostcurScreen,nada,volAngle[10],songNumero[0],parametreMp3[0],songTime); fidGui[11] = new fidGui(fidXpos[11],fidYpos[11],fidXposScreen[11], fidYposScreen[11], rotAngle[11],xposTcur,yposTcur,xpostcurScreen,ypostcurScreen); fid_fonction[11] = new fid_fonction(fidXpos[11],fidYpos[11],fidXposScreen[11], fidYposScreen[11], rotAngle[11],xposTcur,yposTcur,xpostcurScreen,ypostcurScreen,nada,volAngle[11],songNumero[1],parametreMp3[1],nada); fidGui[12] = new fidGui(fidXpos[12],fidYpos[12],fidXposScreen[12], fidYposScreen[12], rotAngle[12],xposTcur,yposTcur,xpostcurScreen,ypostcurScreen); fid_fonction[12] = new fid_fonction(fidXpos[12],fidYpos[12],fidXposScreen[12], fidYposScreen[12], rotAngle[12],xposTcur,yposTcur,xpostcurScreen,ypostcurScreen,nada,volAngle[12],songNumero[2],parametreMp3[2],nada); fidGui[13] = new fidGui(fidXpos[13],fidYpos[13],fidXposScreen[13], fidYposScreen[13], rotAngle[13],xposTcur,yposTcur,xpostcurScreen,ypostcurScreen); fid_fonction[13] = new fid_fonction(fidXpos[13],fidYpos[13],fidXposScreen[13], fidYposScreen[13], rotAngle[13],xposTcur,yposTcur,xpostcurScreen,ypostcurScreen,nada,volAngle[13],songNumero[3],parametreMp3[3],nada); fidGui[14] = new fidGui(fidXpos[14],fidYpos[14],fidXposScreen[14], fidYposScreen[14], rotAngle[14],xposTcur,yposTcur,xpostcurScreen,ypostcurScreen); fid_fonction[14] = new fid_fonction(fidXpos[14],fidYpos[14],fidXposScreen[14], fidYposScreen[14], rotAngle[14],xposTcur,yposTcur,xpostcurScreen,ypostcurScreen,nada,volAngle[14],songNumero[4],parametreMp3[4],nada); //println(); } void addTuioObject(TuioObject tobj) { println("add object "+tobj.getSymbolID()+" ("+tobj.getSessionID()+") "+tobj.getX()+" "+tobj.getY()+" "+tobj.getAngle()); tobjState[tobj.getSymbolID()] = 1; } void removeTuioObject(TuioObject tobj) { println("remove object "+tobj.getSymbolID()+" ("+tobj.getSessionID()+")"); tobjState[tobj.getSymbolID()] = 0; } void updateTuioObject (TuioObject tobj) { println("update object "+tobj.getSymbolID()+" ("+tobj.getSessionID()+") "+tobj.getX()+" "+tobj.getY()+" "+tobj.getAngle() +" "+tobj.getMotionSpeed()+" "+tobj.getRotationSpeed()+" "+tobj.getMotionAccel()+" "+tobj.getRotationAccel()); } void addTuioCursor(TuioCursor tcur) { println("add cursor "+tcur.getCursorID()+" ("+tcur.getSessionID()+ ") " +tcur.getX()+" "+tcur.getY()); tcurState = true; } void updateTuioCursor (TuioCursor tcur) { println("update cursor "+tcur.getCursorID()+" ("+tcur.getSessionID()+ ") " +tcur.getX()+" "+tcur.getY() +" "+tcur.getMotionSpeed()+" "+tcur.getMotionAccel()); } void removeTuioCursor(TuioCursor tcur) { println("remove cursor "+tcur.getCursorID()+" ("+tcur.getSessionID()+")"); tcurState = false; } void refresh(TuioTime bundleTime) { redraw(); } void Osc() { OscBundle myBundle = new OscBundle(); OscMessage myFidOsc = new OscMessage("/fid0Param"); myFidOsc.add(rotAngle0); myFidOsc.add(volAngle0); myFidOsc.add(sineWave0); myFidOsc.add(squareWave0); myFidOsc.add(sawWave0); myFidOsc.add(noiseWave0); myFidOsc.add(tobjState[0]); oscP5.send(myFidOsc, myRemoteLocation); myBundle.add(myFidOsc); myFidOsc.clear(); myFidOsc.setAddrPattern("/fid1Param"); myFidOsc.add(rotAngle1); myFidOsc.add(volAngle1); myFidOsc.add(sineWave1); myFidOsc.add(squareWave1); myFidOsc.add(sawWave1); myFidOsc.add(noiseWave1); myFidOsc.add(tobjState[1]); oscP5.send(myFidOsc, myRemoteLocation); myBundle.add(myFidOsc); myFidOsc.clear(); myFidOsc.setAddrPattern("/fid2Param"); myFidOsc.add(rotAngle2); myFidOsc.add(volAngle2); /*myFidOsc.add(sineWave2); myFidOsc.add(squareWave2); myFidOsc.add(sawWave2); myFidOsc.add(noiseWave2);*/ myFidOsc.add(tobjState[2]); oscP5.send(myFidOsc, myRemoteLocation); myBundle.add(myFidOsc); myFidOsc.clear(); myFidOsc.setAddrPattern("/fid3Param"); myFidOsc.add(rotAngle3); myFidOsc.add(volAngle3); /*myFidOsc.add(sineWave3); myFidOsc.add(squareWave3); myFidOsc.add(sawWave3); myFidOsc.add(noiseWave3);*/ myFidOsc.add(tobjState[3]); oscP5.send(myFidOsc, myRemoteLocation); OscMessage myFidMp3 = new OscMessage("/fid0Mp3"); myFidMp3.add(mp3State[0]); myFidMp3.add(mp3State[1]); myFidMp3.add(mp3State[2]); myFidMp3.add(mp3State[3]); myFidMp3.add(songNumero[0]); //****************** SES CETTE VALEUR QU IL NE FAUT PAS REPETER myFidMp3.add(volAngle10); myFidMp3.add(tobjState[10]); oscP5.send(myFidMp3, myRemoteLocation); println(rotAngle10); } void oscEvent(OscMessage theOscMessage) { if (theOscMessage.checkAddrPattern("/mp3Duration") && theOscMessage.checkTypetag("f")) { songTime = theOscMessage.get(0).floatValue(); } }
en gros la variable "songNumero[0]" est en fonction de la rotation du fid il a une valeur de 1 a 4 ses cette variable qui faut qui gere quel lecteur dans pure data est en marche donc quand je met la valeur 1 il faut envoyer 1 bang a pure data si je met 2 un autre bang et ainsi de suite mais la si il est sur 1 il envoi toujours des bang et meme chose pour le 2, 3 et 4 ce qui provoque dans pure data un "mini bug audio "comme si on fesais un reset et que le fichier recommence toujours au debut
merci
a+
Dernière modification par imdidi (2013-07-12 17:16:12)
Hors ligne
Pourquoi ne pas initialiser tes FID dans le setup et mettre à jour les valeurs si elles changent ?
Ici à chaque boucle draw() tu rcrée un objet et donc tu rappelle le constructeur de l'objet. Tu dois pouvoir modifier les valeurs sans recréer d'objet avec new.
Hors ligne
salut a tous
alors je devrais mettre tous mes instance de class dans setup ?
et si oui comment je fais pour mettre les valeurs a jour quand elle change (desole pour la question de newbie lol)
Hors ligne
C'est préférable oui. Un objet est créé une seule fois.
Ensuite tu met à jour les valeurs (attibuts) avec des fonctions (méthodes) de ta classe.
Comment est définie ta classe FID ?
Hors ligne
ok merci je vais faire la correction il me faut juste savoir comment updater
voici le code de ma class fid_Gui
class fidGui { float obj_size = object_size*scale_factor; float fidposX, fidposY, fidposScreenX, fidposScreenY, fidAngle; float tcurposX, tcurposY, tcurposScreenX,tcurposScreenY; float paramcircleX = fidposX_()+14,paramcircleY = fidposY_()+30, paramcircleSize = 15; boolean tcurStatee; boolean parametreWave_; boolean parametreInstrumentbool_, parametreInstrumentbool1_; fidGui(float _fidposX, float _fidposY, float _fidposScreenX, float _fidposScreenY, float _fidAngle, float _tcurposX, float _tcurposY, float _tcurposScreenX,float _tcurposScreenY) { fidposX = _fidposX; fidposY = _fidposY; fidposScreenX = _fidposScreenX; fidposScreenY = _fidposScreenY; fidAngle = _fidAngle; tcurposX = _tcurposX; tcurposY = _tcurposY; tcurposScreenX = _tcurposScreenX; tcurposScreenY = _tcurposScreenY; } float fidposX_() { return fidposX; } float fidposY_() { return fidposY; } float fidposScreenX_() { return fidposScreenX; } float fidposScreenY_() { return fidposScreenY; } float fidAngle_() { return fidAngle; } float tcurposX_() { return tcurposX; } float tcurposY_() { return tcurposY; } float tcurposScreenX_() { return tcurposScreenX; } float tcurposScreenY_() { return tcurposScreenY; } //************************************************************************************************** void fidGUI() { float a = map(fidAngle_(),0,6.30,1.5,4.8); pushMatrix(); pushStyle(); noFill(); stroke(255,255,255,130); strokeWeight(4); strokeCap(ROUND); arc(fidposX_()-3,fidposY_(),70,70,1.5,4.8); arc(fidposX_()-3,fidposY_(),70,70,1.5,(a)%4.8); arc(fidposX_(),fidposY_(),70,70,5.5,7); popStyle(); popMatrix(); } //********************************************************************* void imagesiWave() { pushMatrix(); pushStyle(); fill(255,255,255); textSize(10); text("Si",7,-29); popStyle(); popMatrix(); } //**************************************************************** void imagesqWave() { pushMatrix(); pushStyle(); fill(255,255,255); textSize(10); text("Sq",7,-29); popStyle(); popMatrix(); } //******************************************************************** void imagesaWave() { pushMatrix(); pushStyle(); fill(255,255,255); textSize(10); text("Sa",7,-29); popStyle(); popMatrix(); } //*********************************************************************** void imagenoWave() { pushMatrix(); pushStyle(); fill(255,255,255); textSize(10); text("Wn",6,-29); popStyle(); popMatrix(); } }
Hors ligne
Si tu as une classe MaClasse par exemple avec des attributs x, y, z.
Tu déclare un objet : MaClasse monObjet;
tu peux ensuite modifier ces attributs de plusieurs facons :
- soit en affectant directement la valeur si les attributs sont en public: dans ta classe
- soit en créant des méthodes permettant de les modifier. Par exemple setX(int _x) :
void setX(int _x) { x = _x; }
Il te reste ensuite à ajouter une méthode, disons update(), que tu déclenche quand tu le souhaites dans ton draw. Dans cette méthode tu appelle ta fonction fidGUI(.....) avec tes paramètres qui sont les attributs de ta classe. Que ces attributs aient changé ou non.
Dans ton draw tu auras donc :
quand tu veux modifier une valeur :
monObjet.x = 10; monObjet.y = 50; monObjet.z = 0;
puis après ton traitement tu fais une mise à jour, en fin de boucle draw par exemple :
monObjet.update();
Dernière modification par Marty (2013-07-12 18:30:21)
Hors ligne
ok Merci beaucoup je vais faire les modification requise
Dernière modification par imdidi (2013-07-12 19:55:12)
Hors ligne