Besoin d' aide Dessin de SPECTRUM [Résolu]

cs_satellite34 688 Messages postés mercredi 6 avril 2005Date d'inscription 2 juin 2006 Dernière intervention - 28 juil. 2005 à 15:24 - Dernière réponse : cs_satellite34 688 Messages postés mercredi 6 avril 2005Date d'inscription 2 juin 2006 Dernière intervention
- 11 août 2005 à 19:58
yop, je fais un player mp3 http://www.cppfrance.com/code.aspx?ID=32901 , avec wxWIDGETS et FMOD

et vu que je programme tout seul dans mon coin et qu' il n' ya aucune info sur les spectres, je voudrai savoir si qqun peut me filer un coup de main a dessinner un beau spectrum à la place de la ligne verte minable de base -):

le code à ameliorer :

void Mp3PlayerFrm::DessineSpectre(wxDC& dc)
{
//dessin du spectre.....
spectrumData = FSOUND_DSP_GetSpectrum(); //recupere les 512 cannaux separés...

dc.BeginDrawing();
wxColour MaCouleurVerte(0,255,0);
wxPen MonCrayonVert(MaCouleurVerte,8,wxSWISS);
dc.SetPen(MonCrayonVert);
for ( int i = 0 ; i < 400 ; i++ )
{
spectrumValue = int (1000 * (spectrumData[ i ] + spectrumData[ i +1 ] + spectrumData[ i+2 ] + spectrumData[ i+3 ] + spectrumData[ i+4 ] )) / 5;

if (spectrumValue >= 200) //si spectrum value depasse de spectrWnd..
spectrumValue = 199; //recadre

dc.DrawPoint( i , 198-spectrumValue ); //dessine
}
dc.EndDrawing();
}

allé défoulez vous bien & thx all!!!!!!!!!
Afficher la suite 

Votre réponse

15 réponses

Meilleure réponse
cs_satellite34 688 Messages postés mercredi 6 avril 2005Date d'inscription 2 juin 2006 Dernière intervention - 11 août 2005 à 19:58
3
Merci
yomerci mais j'a i déja réussi avec fmod...

a+


Recherche entreprise développement à Montpellier pour BTS Informatique de Gestion en alternance............

Merci cs_satellite34 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 96 internautes ce mois-ci

Commenter la réponse de cs_satellite34
cs_satellite34 688 Messages postés mercredi 6 avril 2005Date d'inscription 2 juin 2006 Dernière intervention - 29 juil. 2005 à 16:08
0
Merci
ouououououou allééééééééé!!!!!!!!!!
Commenter la réponse de cs_satellite34
SnOOpss 571 Messages postés samedi 3 avril 2004Date d'inscription 5 décembre 2013 Dernière intervention - 29 juil. 2005 à 20:20
0
Merci
Le degradé que je t avais mit te plait pas ???



Il fait une barre mais c'est pas dur de le chnager pour kil ne fasse qu'une ligne !!
Commenter la réponse de SnOOpss
cs_satellite34 688 Messages postés mercredi 6 avril 2005Date d'inscription 2 juin 2006 Dernière intervention - 31 juil. 2005 à 11:21
0
Merci
ben en fait je n' y arrive pas a l'adapter a wx
et je ne comprends pas bien le systus ...

biensur que ca me plaierai ton dégradé d'ailleurs c'est ce que j'essaye de faire depuis une semaine mais che bloke.
(j' ai aussi un souci pour récupérer les tags mais ca c une otre histoire)

si ca t'dit de m' donner un coup de main en live
[mailto:satellitesound@msn.com satellitesound@msn.com]
thx ++
Commenter la réponse de cs_satellite34
cs_satellite34 688 Messages postés mercredi 6 avril 2005Date d'inscription 2 juin 2006 Dernière intervention - 31 juil. 2005 à 11:31
0
Merci
ô sinon si ca te dérange pas trop ce serai cool de m' expliquer pas a pas les actions qu' il faut faire , meme sans code , juste pour connaitre exactement la marche a suivre apré je me démmerderai a trouver comment faire avec wx
Commenter la réponse de cs_satellite34
SnOOpss 571 Messages postés samedi 3 avril 2004Date d'inscription 5 décembre 2013 Dernière intervention - 31 juil. 2005 à 19:16
0
Merci
alors pour faire le degradé moi ma methode perso ( pour un degradé d'une couleur vers noir par exemple) c'est



COLORREF ccouleurprog = ...... ;( ta valeur de degradé codé en RGB)



int fRed = (int)GetRValue(ccouleurprog);

int fBlue = (int)GetBValue(ccouleurprog);

int fGreen = (int)GetGValue(ccouleurprog);



maintenant que l on a les composante vert rouge et bleu je fait une boucle pour toi c'est une ligne donc



for ( int i = 0 ; i < 400 ; i++ )

{

spectrumValue
= int (1000 * (spectrumData[ i ] + spectrumData[ i +1 ] + spectrumData[
i+2 ] + spectrumData[ i+3 ] + spectrumData[ i+4 ] )) / 5;



if (spectrumValue >= 200) //si spectrum value depasse de spectrWnd..

spectrumValue = 199; //recadre



int deca = 200; // taille max de la barre ou ligne dans ton cas

for ( int j = 199 ; j < spectrumValue ; j-- ) {



if (fRed) fRed -= 128 / deca;

if (fBlue) fBlue -= 128 / deca;

if (fGreen) fGreen -= 128 / deca;



dessin d'un point coordonné (i,j) et de couleur RGB(fRed, fGreen , fBlue)



}





}

Mais ca va demander beaucoup de ressources systemes, il te faut vraiment te refaire une procedure pour afficher des points.
Commenter la réponse de SnOOpss
cs_satellite34 688 Messages postés mercredi 6 avril 2005Date d'inscription 2 juin 2006 Dernière intervention - 31 juil. 2005 à 20:41
0
Merci
c'est bien symphatique de ta part!!
merci beaucoup, je vais regarder ca ce soir et je te tiens au courant

thx
++
Commenter la réponse de cs_satellite34
cs_satellite34 688 Messages postés mercredi 6 avril 2005Date d'inscription 2 juin 2006 Dernière intervention - 31 juil. 2005 à 22:57
0
Merci
donc, maintenant j' ai :

void Mp3PlayerFrm::DessineSpectre(wxDC& dc)
{
//dessin du spectre.....dédié a Snoops de cppcs
const float *spectrumData = FSOUND_DSP_GetSpectrum(); //recupere les 512 cannaux separés...
int spectrumValue;

COLORREF m_degrade =(10,250,10);


int fRed = (int)GetRValue(m_degrade);
int fBlue = (int)GetBValue(m_degrade);
int fGreen = (int)GetGValue(m_degrade);



for ( int i = 0 ; i < 400 ; i++ ) //400 est le largeur de la fenetre:
//le spectrum retourne 512 floats
//mais pour garder tout le spectre dans la fenetre je defini a 400
{
spectrumValue = int (1000 * (spectrumData[ i ] + spectrumData[ i +1 ] + spectrumData[ i+2 ] + spectrumData[ i+3 ] + spectrumData[ i+4 ] )) / 5;

if (spectrumValue >= 200) //si spectrum value depasse de spectrWnd..
spectrumValue = 199; //recadre

int deca = 200; // taille max de la ligne
for ( int j = 199 ; j < spectrumValue ; j-- )
{


if (fRed) fRed -= 128 / deca;
if (fBlue) fBlue -= 128 / deca;
if (fGreen) fGreen -= 128 / deca;


wxColour MaCouleur(fRed, fGreen , fBlue);
wxPen MonCrayon(MaCouleur,8,wxSWISS); //crée un "crayon",
dc.SetPen(MonCrayon); //ce crayon est accroché au device context grace a SetPen

dc.DrawPoint( i , j ); //dessine

}//ferme la tite boucle

}//ferme la gde boucle

}//ferme la fonction

et avec ca j' ai une erreur de compilo =
46 C:\Documents and Settings\Administrateur\Bureau\PlayerMp3\spectrum.cpp [Warning] left-hand operand of comma has no effect

46 C:\Documents and Settings\Administrateur\Bureau\PlayerMp3\spectrum.cpp [Warning] right-hand operand of comma has no effect

je comprends pas pourquoi.
Donc, ca compile avec ces erreurs et ca n'affiche rien.
Une soluce????????
Commenter la réponse de cs_satellite34
cs_satellite34 688 Messages postés mercredi 6 avril 2005Date d'inscription 2 juin 2006 Dernière intervention - 31 juil. 2005 à 22:59
0
Merci
l'erreur se situe sur COLORREF m_degrade =(10,250,10);
plus précisément sur (10,250,10);
++
Commenter la réponse de cs_satellite34
SnOOpss 571 Messages postés samedi 3 avril 2004Date d'inscription 5 décembre 2013 Dernière intervention - 1 août 2005 à 19:05
0
Merci
Ben en fait en win32

pour avoir du rouge = (255,0,0)

m_degrade RGB(255,0,0) 255; (en decimal) = FF0000 en hexa !!



du bleu

m_degrade RGB(0,0,255) 16711680; (en decimal) = 0000FF en hexa



en fait m_degrade est un long pas un tableau !!!

c'est du codage sur plusieurs bit de poid differents ( si ca ce dit comme ca, je suis pas un pro du vocabulaire c++ )
Commenter la réponse de SnOOpss
cs_satellite34 688 Messages postés mercredi 6 avril 2005Date d'inscription 2 juin 2006 Dernière intervention - 1 août 2005 à 19:29
0
Merci
oué alor la j'a i rien compris!
tu peux préciser?? j' ai 0 erreurs de compile avec ca mais ca n'affiche tjrs rien

void Mp3PlayerFrm::DessineSpectre(wxDC& dc)
{
//dessin du spectre.....dédié a Snoops de cppcs

COLORREF m_degrade = 255;//Valeur du dégradé


int fRed = (int)GetRValue(m_degrade);
int fBlue = (int)GetBValue(m_degrade);
int fGreen = (int)GetGValue(m_degrade);


const float *spectrumData = FSOUND_DSP_GetSpectrum(); //recupere les 512 cannaux separés...
int spectrumValue;

wxColour MaCouleur(fRed, fBlue , fGreen); //creer la couleur que va prendre le crayon,
wxPen MonCrayon(MaCouleur,8,wxSWISS); //crée un "crayon",
dc.SetPen(MonCrayon); //ce crayon est accroché au device context grace a SetPen,


for (int i = 0 ; i < 400 ; i++ ) //400 est le largeur de la fenetre:
//le spectrum retourne 512 floats
//mais pour garder tout le spectre dans la fenetre je defini a 400
{
spectrumValue = int (100 * (spectrumData[ i ] + spectrumData[ i +1 ] + spectrumData[ i+2 ] + spectrumData[ i+3 ] + spectrumData[ i+4 ] )) / 5;

if (spectrumValue >= 200) //si spectrum value depasse de spectrWnd..
spectrumValue = 199; //recadre

int deca = 200; // taille max de la ligne
for (int j = 200 ; j < spectrumValue ; j-- )
{
if (fRed) fRed -= 128 / deca;
if (fBlue) fBlue -= 128 / deca;
if (fGreen) fGreen -= 128 / deca;

dc.DrawPoint(i, j); //dessine .
}//ferme la tite boucle

}//ferme la gde boucle

}//ferme la fonction

si je met la valeur en hexa a colorref, il me fait une erreur.
et j'ai pas trouver comment envoyer les bits avec wxWIDGETS!
'tain je crois bien que je vais me mettre au win32 car ca va pas du tout ca
j'en ai marre!lol!

allé, merci bien......
Commenter la réponse de cs_satellite34
SnOOpss 571 Messages postés samedi 3 avril 2004Date d'inscription 5 décembre 2013 Dernière intervention - 1 août 2005 à 21:24
0
Merci
ben je connais pas

wxColour MaCouleur(fRed, fBlue ,
fGreen); //creer
la couleur que va prendre le crayon,



mais si wxColour MaCouleur(255, 0 , 0); sert a ecrire en rouge c'est la
bonne commande sinon il t en faut une autre et ca marche pas en hexa
c'etait pour expliquer ou il faut utliser un code special.



en win32 il faut detruire le stylo a chaque fois avant d 'en recreer un sinon fuite de memoire !!!
Commenter la réponse de SnOOpss
cs_satellite34 688 Messages postés mercredi 6 avril 2005Date d'inscription 2 juin 2006 Dernière intervention - 2 août 2005 à 15:34
0
Merci
bon, salut!
j' arrive enfin a évoluer : maintenant j'ai un spectre de la forme que je souhaitée c a d "plein".

voili le code :

void Mp3PlayerFrm::DessineSpectre(wxDC& dc)
{
//dessin du spectre.....dédié a Snoops de cppcs

wxColour MaCouleur(0, 255 , 100); //creer la couleur que va prendre le crayon,
int red = MaCouleur.Red();
int green = MaCouleur.Green();
int blue = MaCouleur.Blue();

const float *spectrumData = FSOUND_DSP_GetSpectrum(); //recupere les 512 cannaux separés...
int spectrumValue;

for (int i = 0 ; i < 400 ; i++ ) //400 est le largeur de la fenetre:
//le spectrum retourne 512 floats
//mais pour garder tout le spectre dans la fenetre je defini a 400
{
spectrumValue = int (500* (spectrumData[ i ] + spectrumData[ i +1 ] + spectrumData[ i+2 ] + spectrumData[ i+3 ] + spectrumData[ i+4 ] )) / 5;

if (spectrumValue >= 200) //si spectrum value depasse de spectrWnd..
spectrumValue = 199; //recadre

int h = 200;
for (int j = 0 ; j < spectrumValue ; j++)
{
if (red) red -= 128/h;
if (green) green -= 128/h;
if (blue) blue -= 128/h;

wxColour macouleurmod(red, green, blue);
wxPen MonCrayon(macouleurmod,8,wxSWISS); //crée un "crayon",
dc.SetPen(MonCrayon); //ce crayon est accroché au device context grace a SetPen,

dc.BeginDrawing();
dc.DrawPoint(i, h-j); //dessine .
dc.EndDrawing();

}//ferme la tite boucle

}//ferme la gde boucle
dc.SetPen(wxNullPen);

}//ferme la fonction

par contre tout ce qui se rapporte au changement de couleur en fonction de la hauteur ne fonctionne pas.Franchement je comprends pas pkoi vu ke je recupere un valeur de dégradé avec
wxColour MaCouleur(0, 255 , 100);
int red = MaCouleur.Red();
int green = MaCouleur.Green();
int blue = MaCouleur.Blue();

et que je la traite en suite

if (red) red -= 128/h;
if (green) green -= 128/h;
if (blue) blue -= 128/h;

et pour finir, je la fait passer ds mon crayon avec
wxColour macouleurmod(red, green, blue);
wxPen MonCrayon(macouleurmod,8,wxSWISS); //crée un "crayon",
dc.SetPen(MonCrayon);

ca compile com' du beurre mais pas de changement de couleur.
allé en tous cas merci bocoup.

t' aurai pas une idée de comment faire du "set bit to device" avec wxWIDGETS?
Commenter la réponse de cs_satellite34
SnOOpss 571 Messages postés samedi 3 avril 2004Date d'inscription 5 décembre 2013 Dernière intervention - 2 août 2005 à 18:46
0
Merci
Au fait tu es sur que la commande RGB() est en win32 ????

Sinon pour le set bit to device j'ai commencé mais je l'ai pas fini en win32 alors wxWIDGET .....



Sinon pout on probleme regarde les differentes valeur que prennent red ,green et blue

red 0 -> 0

green 255 -> 0

bleu 100 -> 0



Sinon

if (red) red -= 128/h;

128/h = 0.32 chez toi

et j'ai peur que red ne prennent pas les chiffres apres la virgule



Float red au lieu de Int red

Mais bizarrement ca marche chez moi, soit j'ai jamais depassé 128 pixels soit j'ai oublié de te c/c un truc !!!!
Commenter la réponse de SnOOpss
Dockurt2k 1 Messages postés lundi 14 juillet 2003Date d'inscription 11 août 2005 Dernière intervention - 11 août 2005 à 19:32
0
Merci
Ma reponse est peut etre un peu hors sujet, je me permet de repondre a :

(j' ai aussi un souci pour récupérer les tags mais ca c une otre histoire)



Je te conseille id3lib: http://id3lib.sourceforge.net/

C'est open-source et ca marche vraiment bien.



Personellement je m'en sert dans un programme qui utilise aussi
wxWindows, donc je peut t'assurer qu'il n'y a pas de problemes de ce
cote (en plus les deux sont cross-plateform ).



j'espere t'avoir aide au moins pour ca
Commenter la réponse de Dockurt2k

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.