Annonce

>>> Bienvenue sur codelab! >>> Première visite ? >>> quelques mots sur codelab //// une carte des membres//// (apéros) codelab


#1 2015-11-06 16:17:40 Manipulation par transparence

Rávion
membre
Date d'inscription: 2015-11-06
Messages: 20

Manipulation par transparence



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 tongue et donc je sollicite vos lumières pour m'aider.

Merci d'avance.

Hors ligne

 

#2 2015-11-06 21:38:10 Re : Manipulation par transparence

Tepaze
membre
Lieu: Angers
Date d'inscription: 2014-04-14
Messages: 202

Re: Manipulation par transparence



Et quel est ton problème ?

Hors ligne

 

#3 2015-11-06 22:31:00 Re : Manipulation par transparence

Rávion
membre
Date d'inscription: 2015-11-06
Messages: 20

Re: Manipulation par transparence



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 ? smile

Hors ligne

 

#4 2015-11-07 07:28:19 Re : Manipulation par transparence

matheynen
membre
Date d'inscription: 2008-06-09
Messages: 226

Re: Manipulation par transparence



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


Ce que vous avez fait au plus petit de mes frères, c'est à moi que vous l'avez fait.

Hors ligne

 

#5 2015-11-07 13:49:23 Re : Manipulation par transparence

Rávion
membre
Date d'inscription: 2015-11-06
Messages: 20

Re: Manipulation par transparence



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 hmm

Hors ligne

 

#6 2015-11-07 17:48:55 Re : Manipulation par transparence

Olivier
N°4
Lieu: Chalon sur la Saône
Date d'inscription: 2009-04-07
Messages: 1471
Site web

Re: Manipulation par transparence



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. smile

citation :

Si tu donnes un poisson à un homme, il mangera un jour.
Si tu lui apprends à pêcher, il mangera toujours.

smilesmile

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 ! smile


L'Amour au Peuple !

Hors ligne

 

#7 2015-11-08 20:38:30 Re : Manipulation par transparence

Rávion
membre
Date d'inscription: 2015-11-06
Messages: 20

Re: Manipulation par transparence



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é. big_smile

Hors ligne

 

#8 2015-11-08 21:08:57 Re : Manipulation par transparence

chrisjo
membre
Date d'inscription: 2012-12-26
Messages: 22

Re: Manipulation par transparence



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

 

#9 2015-11-08 22:52:23 Re : Manipulation par transparence

Rávion
membre
Date d'inscription: 2015-11-06
Messages: 20

Re: Manipulation par transparence



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 smile

Dernier détail et j'arrête de vous embêter tongue , 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

 

#10 2015-11-09 15:21:10 Re : Manipulation par transparence

Rávion
membre
Date d'inscription: 2015-11-06
Messages: 20

Re: Manipulation par transparence



Help, i need somebody !

Hors ligne

 

#11 2015-11-09 19:55:55 Re : Manipulation par transparence

Rávion
membre
Date d'inscription: 2015-11-06
Messages: 20

Re: Manipulation par transparence



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

 

#12 2015-11-09 19:59:48 Re : Manipulation par transparence

matheynen
membre
Date d'inscription: 2008-06-09
Messages: 226

Re: Manipulation par transparence



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


Ce que vous avez fait au plus petit de mes frères, c'est à moi que vous l'avez fait.

Hors ligne

 

#13 2015-11-09 21:25:30 Re : Manipulation par transparence

Rávion
membre
Date d'inscription: 2015-11-06
Messages: 20

Re: Manipulation par transparence



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 hmm

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

 

#14 2015-11-09 22:59:40 Re : Manipulation par transparence

Rávion
membre
Date d'inscription: 2015-11-06
Messages: 20

Re: Manipulation par transparence



Je séche là hmm

J'aimerais montrer mon programme demain, ça m'arrangerait de réussir à faire disparaitre l'image définitivement.

Hors ligne

 

#15 2015-11-11 09:44:22 Re : Manipulation par transparence

matheynen
membre
Date d'inscription: 2008-06-09
Messages: 226

Re: Manipulation par transparence



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)


Ce que vous avez fait au plus petit de mes frères, c'est à moi que vous l'avez fait.

Hors ligne

 

fil rss de cette discussion : rss

Pied de page des forums

Powered by FluxBB

codelab, graphisme & code : emoc / 2008-2024