Bien le bonjour,
débutant sous Processing, je souhaite dans le cadre d'un projet étudiant exécuter la manipulation suivante :
j'importe deux images (l'une sur l'autre) et je voudrais que celle se trouvant au premier plan, disparaisse
lentement (en transparence) via une interaction par le son : càd plus le volume transmis au microphone est fort,
plus elle s'efface jusqu'à ce que le volume soit suffisament élévé pour qu'elle disparaisse totalement, et que
de fait on ne puisse plus voir que la seconde image (celle en second plan).
Pour le moment, mon programme ressemble à ceci :
--
import ddf.minim.*;
import ddf.minim.analysis.*;
import ddf.minim.effects.*;
import ddf.minim.signals.*;
import ddf.minim.spi.*;
import ddf.minim.ugens.*;
Minim minim;
AudioInput in;
void setup() {
minim = new Minim(this);
in = minim.getLineIn(Minim.STEREO, 512);
size(950,550);
PImage plage;
plage = loadImage("plage.jpg");
PImage perso;
perso = loadImage("perso.jpg");
image(plage,0,0);
image(perso,0,0);
}
void stop() {
in.close();
minim.stop();
super.stop();
}
--
C'est assez sommaire comme vous le voyez et donc je sollicite vos lumières pour m'aider.
Merci d'avance.
Hors ligne
Et quel est ton problème ?
Hors ligne
et bien je n'arrive pas à ce que mon image réagisse au son de mon micro, comme je l'ai dis j'aimerais que plus le son soit fort, plus l'image s'efface petit à petit (par transparence) jusqu'à disparaitre complétement.
Mais je ne sais pas quelles sont les instructions à inscrire pour y parvenir.
Une idée ?
Hors ligne
Voilà tout ce dont tu as besoin :
D'une fonction draw qui se rafraîchit 60x par seconde avec ton interaction
Ensuite dans celle-ci tu récupère ton volume avec un getVolume() ou encore mieux un getGain() sur ton entrée, à tester
Tu étalonne le résultat de 0 à 255 avec un map()
Et enfin tu utilise un tint(255, taVariable) devant l'image à effacer
Plus qu'à jouer les valeurs pour avoir un résultat qui répond bien et ton programme est fini
PS : les import ddf.minim... sont inutile, seul le premier est nécessaire
le * est un signe joker qui prend tout ce qui suit
Hors ligne
Merci beaucoup pour ta réponse matthieu !
Mais sans vouloir pousser, quelqu'un pourrait-il retranscrire ça directement en instructions ?
Car il y a certains termes dont je ne suis pas familier et du coup je risque de les rentrer d'une façon qui au final, fera que ça ne fonctionne pas et je ne comprendrais pas d'où l'erreur provient
Hors ligne
citation :
je risque de les rentrer d'une façon qui au final, fera que ça ne fonctionne pas
D'une part, tu ne pourras le savoir qu'en le faisant...
D'autre part, c'est justement en essayant de comprendre pourquoi cela ne fonctionne pas que tu apprendras...
La forme de la réponse de Mathieu est volontaire, je pense
Il te donne toutes les pistes pour arriver à ce que tu souhaites...
... mais, l'idée, c'est que tu y arrives par toi-même.
citation :
Si tu donnes un poisson à un homme, il mangera un jour.
Si tu lui apprends à pêcher, il mangera toujours.
Bien sûr, l'idée n'est pas de te mettre en échec...
Si tu bloques, sur un truc, poste-le...
Mais, de ce qui est présenté par Mathieu et compte-tenu du code que tu as déjà écrit, tu ne vas pas bloquer sur tous les points...
Courage !
Hors ligne
Merci pour ton commentaire bienvaillant Olivier.
J'ai essayé plusieurs méthodes en me renseignant sur les nouvelles fonctions que Matthieu m'a conseillée,
et j'ai pu donc rectifié mon programme de cette façon :
--
import ddf.minim.*;
float volume;
float x=0;
float y=255;
PImage perso;
PImage plage;
Minim minim;
AudioInput in;
void setup() {
size(640,480);
minim = new Minim(this);
in = minim.getLineIn(Minim.STEREO, 512);
perso= loadImage("perso.jpg");
}
void draw() {
volume =in.mix.level()*2550;
volume= map(x,y);
tint(255);
image(perso,0,0,640,480);
}
void stop() {
in.close();
minim.stop();
super.stop();
}
--
Le problème provient de la fonction map que je n'arrive pas à configurer comme il le faut, je ne comprends pas
où est l'erreur, qu'est ce qui ne va pas ? car je sens que je ne suis pas loin du résultat désiré.
Hors ligne
telle qu'elle est ta fonction "void stop() " n'est pas utilisée : il faut l'appeler dans "void draw()" qui est la seule à être exécutée automatiquement en boucle (par défaut 60 frames par seconde).
Ensuite comme l'a dit Matthieu, il faut que tu utilises "un tint(255, taVariable) devant l'image à effacer"
taVariable (transparence de tint) doit obtenir sa valeur en fonction de la variation du son.
Enfin, apparemment ton image de fond ne risque pas de s'afficher pas car tu dois la renouveler à chaque "draw" :
1 tint "normal"
2 img de fond
3 tint avec transparence
4 img superposée
Hors ligne
Merci chrisjo, grâce à toi j'ai rectifié le tir :
--
void draw() {
volume = in.mix.level()*2550;
perso = loadImage("perso.jpg");
plage = loadImage("plage.jpg");
tint(255);
image(perso,0,0,640,480);
tint(255,volume);
image(plage,0,0,640,480);
}
--
et ça fonctionne
Dernier détail et j'arrête de vous embêter , je voudrais qu'après que l'image transparente est disparue (en ayant atteint le volume sonore suffisant) elle ne réaparraise plus, en ne laissait donc plus voir que l'image de fond.
Comment faire ? Merci
Hors ligne
Help, i need somebody !
Hors ligne
Je me suis peut-être mal exprimer, quand je dis que je voudrais que l'image qui subit la transparence ne réaparraisse plus, je veux dire qu'il n'y est plus besoin d'émettre un son au micro pour la faire disparaitre une fois l'avoir fait disparaitre à la voix.
Hors ligne
Il ne faut pas hésiter à aller regarder dans la référence quand il y une fonction que tu ne comprends pas.
Il y en a trop que pour toutes les connaîtres.
Essaye un peu ça par curiosité : if(volume>0) volume = map(in.mix.getGain(), 0, 1, 255, 0);
Après avoir initialiser volume à 255 quand tu le déclare.
Tu peux encore mettre tes loadImage dans le setup pour alléger ton programme.
Si tu veux une bonne réactivité, exporte ton sketch dans le menu pour en faire une application.
Dis-nous si ça marche
Hors ligne
Bonne idée l'exportation, merci Matthieu.
Par contre, j'ai bien suivi ton conseil :
void draw() {
volume = in.mix.level()*2550;
perso = loadImage("perso.jpg");
plage = loadImage("plage.jpg");
tint(255);
image(perso,0,0,640,480);
tint(255,volume);
image(plage,0,0,640,480);
if(volume>0) volume = map(in.mix.level(),0,1,255,0);
}
mais ça fonctionne pas, l'image réapparait dès que je ne parle plus dans le micro
Je fais pas mal de recherches sur des tutoriels pour essayer de comprendre par moi-même, mais là en l'occurence je n'arrive pas à trouver une forme de code qui pourrait résoudre mon problème.
Peut-être que j'ai mal compris ou inscrit ton instruction ?
Hors ligne
Je séche là
J'aimerais montrer mon programme demain, ça m'arrangerait de réussir à faire disparaitre l'image définitivement.
Hors ligne
Comme tu l'as mis là, ta deuxième ligne de volume ne sert à rien, sa valeur est tout de suite écrasé par l'autre au début du draw.
J'ai nettoyé ton code et rajouté un élément pour le tunning.
import ddf.minim.*;
PImage perso, plage;
int volume = 255;
float seuil = 0.2; //à régler selon le volume maximale
Minim minim;
AudioInput in;
void setup(){
size(640, 480);
minim = new Minim(this);
in = minim.getLineIn(Minim.STEREO, 512);
perso = loadImage("perso.jpg");
plage = loadImage("plage.jpg");
}
void draw(){
if(volume*seuil>0) volume = int(map(in.mix.level(), 0, seuil, 255, 0));
tint(255);
image(perso, 0, 0, 640, 480);
tint(255, volume);
image(plage, 0, 0, 640, 480);
}
Tu y étais presque
Note : la balise code ne marche pas, le texte est vide et imposssible de joindre un fichier
Dernière modification par matthieu (2015-11-11 09:46:51)
Hors ligne
Pages: 1 2