CLASSE CSOUND

bobbyantho Messages postés 69 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 23 avril 2009 - 7 janv. 2006 à 01:07
 anonyme - 24 mars 2014 à 09:56
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/35447-classe-csound

//multiplier par deux les fréquences comprises entre 500Hz et 2kHz
CSoundProcessing::TBande bande;
bande.fCoef = 2.0;
bande.fFreqBas = 500;
bande.fFreqHaut = 2000;

Tu peux mexpliquer ?
frabuel Messages postés 4 Date d'inscription vendredi 28 août 2009 Statut Membre Dernière intervention 11 mars 2010
11 mars 2010 à 15:24
bonjour,

Avec en partie ce bout de code, j'arrive à acquérir une image lorsqu'il y a un son émis.
Le problème est qu'à chaque nouvelle boucle le PC est de plus en plus lent. Je pense que snd1.Reset(); n'efface pas le tableau. Dois je utiliser ta fonction Formate et si oui peux tu m'aider à l'utiliser

Merci d'avance

while (!bQuit)
{
snd1.StartRecord();
Sleep(100);
snd1.StopRecord();
int maxAudio = snd1.GetMax();
snd1.Reset();
if ( maxAudio > 6000)
{
snd2.Play();
WebCam.SauvegardeBitmap(0);
}
}
cs_devermyst Messages postés 4 Date d'inscription jeudi 24 août 2006 Statut Membre Dernière intervention 11 mars 2010
11 mars 2010 à 12:19
pour - Avoir la taille du fichier en sample ou obtenir la frequence d'echantillonnage
j'ai ajouter des methodes

pour les données par contre je coince
cs_devermyst Messages postés 4 Date d'inscription jeudi 24 août 2006 Statut Membre Dernière intervention 11 mars 2010
11 mars 2010 à 11:50
Re Bonjour,

En fait j'ai plein de question, elles sont liées a mon manque de connaissance du c++
Comment je peux faire pour:
- Avoir la taille du fichier en sample ou obtenir la frequence d'echantillonnage
- Acceder directement au buffer et manipuler les samples comme bon me semble
- Avoir la phase directement, et la phase "unwrap"é :)
- Faire un filtrage (convolution mais en conservant la taille) avec ce que je veux comme filtre.

Merci et dsl si les questions sont betes
cs_devermyst Messages postés 4 Date d'inscription jeudi 24 août 2006 Statut Membre Dernière intervention 11 mars 2010
10 mars 2010 à 16:47
Bonjour

ouha tu es super rapide, effectivement, j'allais ecrire pour dire zut je suis trop bete oublie ma question et boom trop rapide pour moi tu avais deja repondu.

Merci pour tout
bobbyantho Messages postés 69 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 23 avril 2009
10 mars 2010 à 16:41
Bonjour,

Il faut ajouter tous les fichiers .h et .cpp à ton projet.
cs_devermyst Messages postés 4 Date d'inscription jeudi 24 août 2006 Statut Membre Dernière intervention 11 mars 2010
10 mars 2010 à 14:51
Bonjour,

Merci pour tout ton travail, cependant etant debutant j'aurais besoin d'un peu d'aide ;). Voila je suis en train de faire un prg, j'ai besoin de tout ce que ta class offre, ce qui est super, cependant... mhmm mhmm, bon je bosse sous visual studio 2005, j'ai mis les define en haut, et la seule chose que j'ai mis pour le moment c'est:

CSoundProcessing process;
CSound MonSon;

le resultat du build est:

1>main.obj : error LNK2019: unresolved external symbol "public: virtual __thiscall CSoundProcessing::~CSoundProcessing(void)" (??1CSoundProcessing@@UAE@XZ) referenced in function _main
1>main.obj : error LNK2019: unresolved external symbol "public: __thiscall CSoundProcessing::CSoundProcessing(void)" (??0CSoundProcessing@@QAE@XZ) referenced in function _main
1>E:\EMKalman_C\EKM\Debug\EKM.exe : fatal error LNK1120: 2 unresolved externals
1>Build log was saved at "file://e:\EMKalman_C\EKM\EKM\Debug\BuildLog.htm"
1>EKM - 3 error(s), 0 warning(s)

si qq peut me dire pourquoi :), merci d'avance
frabuel Messages postés 4 Date d'inscription vendredi 28 août 2009 Statut Membre Dernière intervention 11 mars 2010
10 déc. 2009 à 10:25
Tu as raison c'est logique, en tout cas ça marche, c'est royal !!!
Merci pour tout, tu m'as fait gagner beaucoup de temps.
bobbyantho Messages postés 69 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 23 avril 2009
9 déc. 2009 à 08:39
C'est normal, c'est dans l'objet snd1 qu'il faut aller chercher le max... !

Tu n'as qu'à ajouter une méthode dans la classe CSound :

//.h
short GetMax() const;

//.cpp
short CSound::GetMax() const
{
//pour récupérer le max du canal gauche
short maxG = m_Buffer[0].GetMax();

//pour récupérer le max du canal droit (identique au canal gauche pour un son mono)
short maxD = m_Buffer[1].GetMax();

//le maximum des deux canaux
return = max(maxG , maxD);
}
frabuel Messages postés 4 Date d'inscription vendredi 28 août 2009 Statut Membre Dernière intervention 11 mars 2010
9 déc. 2009 à 08:32
J'arrive à jouer le son acquis mais je n'ai aucune valeur dans m_Buffer[2] ( je ne trouve pas mon ou mes erreurs), la valeur maxAudio reste à 0. Sinon tout passe bien sous visual c++. Voici un bout de code :


// Lance l'affichage de la webcam
WebCam.AfficheWebCam();

// Boucle
while (!bQuit)
{

//acquisition de 0.5 secondes
snd1.StartRecord();
Sleep(200); //j 'ai essyé aussi avec un valeur >1 sec.
snd1.StopRecord();
//jouer le son ok fonctionne
//snd1.Play();

CTab<short> m_Buffer[2];
//pour récupérer le max du canal gauche
int maxG = m_Buffer[0].GetMax();

//pour récupérer le max du canal droit
int maxD = m_Buffer[1].GetMax();

//le maximum des deux canaux
int maxAudio = max(maxG , maxD);

if ( maxAudio > 0 )
{
WebCam.SauvegardeBitmap(0);
}
snd1.Reset();
etc...
Merci pour ton aide et pour ton boulot sur CSound
bobbyantho Messages postés 69 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 23 avril 2009
8 déc. 2009 à 08:28
Salut,

Je n'ai jamais testé cette classe sous Visual Studio 2008.

La classe CTab est un template ; dans mon objet, elle est déclaré et utilisée comme un tableau de deux tableaux de short :

CTab<short> m_Buffer[2];

//pour récupérer le max du canal gauche
int maxG = m_Buffer[0].GetMax();

//pour récupérer le max du canal droit (identique au canal gauche pour un son mono)
int maxD = m_Buffer[1].GetMax();

//le maximum des deux canaux
int max = max(maxG , maxD);
frabuel Messages postés 4 Date d'inscription vendredi 28 août 2009 Statut Membre Dernière intervention 11 mars 2010
7 déc. 2009 à 15:56
Salut,

Je débute en C++ sous visual C++ 2008. J’arrive à acquérir le signal audio mais je butte sur la classe CTab. Je souhaite récupérer la valeur max de mon signal snd1 avec GetMax afin de capturer une image de mon signal vidéo. Merci d’avance.
gate35 Messages postés 8 Date d'inscription vendredi 10 avril 2009 Statut Membre Dernière intervention 23 avril 2009
23 avril 2009 à 14:18
Non je ne les ai pas oubliés ...Merci beaucoup en tout cas pour ton travail très intéressant et ta rapidité de réponse:).
bobbyantho Messages postés 69 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 23 avril 2009
23 avril 2009 à 14:13
Je suis désolé mais je ne pense pas désormais pouvoir beaucoup t'aider.

J'imagine que tu n'as pas oublié les :
#include "Sound.h"
#include "SoundProcessing.h"

Bon courage pour la suite.
gate35 Messages postés 8 Date d'inscription vendredi 10 avril 2009 Statut Membre Dernière intervention 23 avril 2009
23 avril 2009 à 14:07
Coucou désolée de t'embêter encore...
Voilà ce que me donne maintenant ton exemple:
1>z:\mes documents\visual studio 2008\projects\oal\oal\recup.cpp(13) : error C2065: 'process' : undeclared identifier
1>z:\mes documents\visual studio 2008\projects\oal\oal\recup.cpp(13) : error C2228: left of '.SetSound' must have class/struct/union
1> type is ''unknown-type''
1>z:\mes documents\visual studio 2008\projects\oal\oal\recup.cpp(16) : error C2065: 'process' : undeclared identifier
1>z:\mes documents\visual studio 2008\projects\oal\oal\recup.cpp(16) : error C2228: left of '.Echo' must have class/struct/union
1> type is ''unknown-type''
1>z:\mes documents\visual studio 2008\projects\oal\oal\recup.cpp(25) : error C2065: 'process' : undeclared identifier
1>z:\mes documents\visual studio 2008\projects\oal\oal\recup.cpp(25) : error C2228: left of '.SetSound' must have class/struct/union
1> type is ''unknown-type''
1>z:\mes documents\visual studio 2008\projects\oal\oal\recup.cpp(33) : error C2065: 'process' : undeclared identifier
1>z:\mes documents\visual studio 2008\projects\oal\oal\recup.cpp(33) : error C2228: left of '.PasseBande' must have class/struct/union
1> type is ''unknown-type''
1>z:\mes documents\visual studio 2008\projects\oal\oal\recup.cpp(43) : error C2065: 'process' : undeclared identifier
1>z:\mes documents\visual studio 2008\projects\oal\oal\recup.cpp(43) : error C2228: left of '.GetFFT' must have class/struct/union
1> type is ''unknown-type''
1>z:\mes documents\visual studio 2008\projects\oal\oal\recup.cpp(51) : error C2679: binary '>' : no operator found which takes a right-hand operand of type 'double' (or there is no acceptable conversion)
1> could be 'built-in C++ operator>(const double *, const double *)'
1> while trying to match the argument list '(CTab<TYPE>, double)'
1> with
1> [
1> TYPE=double
1> ]
1>z:\mes documents\visual studio 2008\projects\oal\oal\recup.cpp(53) : error C2440: '=' : cannot convert from 'CTab<TYPE>' to 'double'
1> with
1> [
1> TYPE=double
1> ]
1> No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called

Enfin c mieux déjà mais c pas encore ça...
Merci
Cdlt
gate35 Messages postés 8 Date d'inscription vendredi 10 avril 2009 Statut Membre Dernière intervention 23 avril 2009
23 avril 2009 à 10:36
OK merci donc maintenant de ce coté là c'est bon je vais aller voir les include et les constantes...
Merci
bobbyantho Messages postés 69 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 23 avril 2009
23 avril 2009 à 10:32
Tu définies ces constantes dans les propriétés du projet, dans la rubrique "Préprocesseur", par exemple il devrait y avoir :

WIN32;_WINDOWS;_FRA;WINVER=0x0501;_WIN32_WINNT=0x501

avec 0x501 pour Windows XP
gate35 Messages postés 8 Date d'inscription vendredi 10 avril 2009 Statut Membre Dernière intervention 23 avril 2009
23 avril 2009 à 10:23
mais encore?peux tu développer stp?
bobbyantho Messages postés 69 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 23 avril 2009
23 avril 2009 à 10:18
A combien sont-ils définis ?
gate35 Messages postés 8 Date d'inscription vendredi 10 avril 2009 Statut Membre Dernière intervention 23 avril 2009
23 avril 2009 à 10:15
Alors du coup j'ai l'erreur suivante:
fatal error C1189: #error : WINVER setting conflicts with _WIN32_WINNT setting
Cdlt
gate35 Messages postés 8 Date d'inscription vendredi 10 avril 2009 Statut Membre Dernière intervention 23 avril 2009
23 avril 2009 à 09:46
Ah pas WINVER tu as raison je vérifie...
Merci
bobbyantho Messages postés 69 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 23 avril 2009
23 avril 2009 à 09:43
Je n'ai jamais testé sous visual C++ 2008.

Comme ça je dirais que tes erreurs ressemblent à un mauvais #include ou des non définitions de constantes, regardes peut-être de ce coté là.

Sinon _WIN32_WINNT et WINVER sont-elles bien définis dans les propriétés du projet ?
gate35 Messages postés 8 Date d'inscription vendredi 10 avril 2009 Statut Membre Dernière intervention 23 avril 2009
23 avril 2009 à 09:23
Salut,
Je suis sous visual C++ 2008 version complète, MFC... J'ai essayé plusieurs choses, ton exemple compris...
Merci
Cdlt
bobbyantho Messages postés 69 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 23 avril 2009
23 avril 2009 à 08:40
Salut,

Es-tu sous visual C++ ? MFC ou pas MFC ?
Peux-tu en dire un peu plus ?
gate35 Messages postés 8 Date d'inscription vendredi 10 avril 2009 Statut Membre Dernière intervention 23 avril 2009
22 avril 2009 à 17:28
Salut,
J'ai quelques difficultés a utiliser ta classe, j'obtiens la liste d'erreurs suivantes:

1>C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\winnt.h(11263) : error C2065: 'PCONTEXT' : undeclared identifier
1>C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\winnt.h(11264) : error C2146: syntax error : missing ')' before identifier 'ContextRecord'
1>C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\winnt.h(11264) : warning C4229: anachronism used : modifiers on data are ignored
1>C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\winnt.h(11264) : error C2182: 'RtlCaptureContext' : illegal use of type 'void'
1>C:\Program Files\Microsoft SDKs\Windows\v6.0A\include\winnt.h(11264) : error C2491: 'RtlCaptureContext' : definition of dllimport data not allowed
Aurais tu des idées, as tu déjà rencontré le pb? J'ai essayé pas mal de choses et fait le tour des propositions de google sur ces erreurs... Dés que je fais appel à une des fonctions de la classe quelque soit le programme j'obtiens ce type d'erreurs...
Merci
Cordialement
bobbyantho Messages postés 69 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 23 avril 2009
19 févr. 2009 à 08:15
En mettant à TRUE le paramètre 'bInverse' de la méthode FFT(...) !
kennyflorian Messages postés 8 Date d'inscription jeudi 28 décembre 2006 Statut Membre Dernière intervention 18 février 2009
18 févr. 2009 à 22:50
On m'a bien aidé sur un forum je suis arrivé à régler mes problèmes.
Maintenant j'ai traité mon signal. J'ai donc un tableau de valeurs issues d'un traitement FFT. J'ai donc toutes mes données en fréquentiel. Comment faire la FFT inverse sur ce tableau pour repasser en temporel ?
bobbyantho Messages postés 69 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 23 avril 2009
18 févr. 2009 à 09:18
- Essaye avec CSound et pas Csound !
- Avec un '(LPCWSTR)(const char*)lavariable', le 'CreateFileW' devrit passer.
- Pour le chemin du .wav, c'est "C:\\Emplacement\\du\\fichier\\fichier.wav".

Cordialement.
kennyflorian Messages postés 8 Date d'inscription jeudi 28 décembre 2006 Statut Membre Dernière intervention 18 février 2009
16 févr. 2009 à 20:32
Je bosse sur Visual C++
Mon programme principal main.cpp

#include "Sound.h"
#include
using namespace std;

int main(){
Csound monson1;
monson1.PlayFile("musique1.wav");
return 0;}

Mon objectif pour le moment est d'arriver à lire un fichier .wav (ce que je n'arrive pas encore à faire).
Comment le programme trouve t'il le fichier ? J'ai essayé de rentrer tout le chemin au lieu de simplement son nom mais ça ne marche pas mieux.
J'ai rajouté tous les fichiers d'en-tête et les fichiers .cpp dans le projet.
J'ai plusieurs types d'erreurs :

Pour le fichier sound.cpp :
warning C4996: 'strcpy': This function or variable may be unsafe.

error C2664: 'CreateFileW' : impossible de convertir le paramètre 1 de 'const CStr' en 'LPCWSTR'

Pour le fichier main.cpp :
error C2065: 'Csound' : identificateur non déclaré
error C2146: erreur de syntaxe : absence de ';' avant l'identificateur 'monson1'
error C2065: 'monson1' : identificateur non déclaré
error C2228: la partie gauche de '.PlayFile' doit avoir un class/struct/union

Voila je ne comprends pas pourquoi cela ne marche pas. Est-ce que vous pouvez m'aider? Merci

Cordialement

Florian
bobbyantho Messages postés 69 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 23 avril 2009
16 févr. 2009 à 15:46
En fait, il ne faut pas partir de l'exemple ci-dessus qui est désormais obsolète. Si tu regardes en haut de cette page, juste en dessous du descriptif du .h, tu pourras voir un exemple complet et surtout à jour.

Si tu utilises Dev-C++, il faut remplacer la ligne :
#pragma comment(lib,"winmm.lib")
par celle-ci :
#pragma comment(lib,"libwinmm.a")
dans le fichier Sound.h.

Je te conseille donc de récupérer les dernières sources et d'utiliser le premier exemple.

Cordialement.
kennyflorian Messages postés 8 Date d'inscription jeudi 28 décembre 2006 Statut Membre Dernière intervention 18 février 2009
16 févr. 2009 à 02:36
Arff ta classe à l'air super mais je suis débutant en C++, je galère pas mal.
J'ai copié l'exemple cité au dessus dans ces pages, rajouter les fichiers d'en-tetes et ceux en .cpp .

Quand je lance le programme principal ça plante évidemment. Il me dit que les fonctions, par exemple : "Acquisition" ne font pas parties de la classe CSound, ce que je comprends volontier puisque il est impossible de trouver une telle fonction dans la classe CSound sur le fichier d'en-tete.

Ensuite sur sound.cpp il me dit
'strcpy': This function or variable may be unsafe.
et ça
'CreateFileW' : impossible de convertir le paramètre 1 de 'const CStr' en 'LPCWSTR'

et pleins d'autres erreurs...

Tu peux pas envoyer un lien qui contient un fichier projet qui marche car j'ai du mal à architecturer tout ça pour en sortir quelque chose...

Merci

Florian
Scaq Messages postés 8 Date d'inscription lundi 7 octobre 2002 Statut Membre Dernière intervention 8 janvier 2014
21 déc. 2008 à 18:37
Salut!
Je n'ai pas encore le fichier que j'en ai l'eau à la bouche...
XD
cs_Noura12 Messages postés 44 Date d'inscription vendredi 20 juillet 2007 Statut Membre Dernière intervention 3 octobre 2008
14 nov. 2008 à 12:43
là je serai desoléee je me trompe ^^',
la frequence sera pas la cause puise que là je viens d'essayer deux wav téléchargés et qui ont la même frequence mais ça marche plus :/
Donc je précise que jusqu'à maintenant le seul cas qui fonctionne bien c'est celui de mixer deux wav enregistrés a travers micro,

je vois pas le paramètre qui pourra etre modifié pour avoir de bonne resultat :s

merci pour toute explication :)
cs_Noura12 Messages postés 44 Date d'inscription vendredi 20 juillet 2007 Statut Membre Dernière intervention 3 octobre 2008
14 nov. 2008 à 12:35
Edit : g ajouté le bout de code au dessus pour récupérer la fréquence dominante et puis la sétté :)
cs_Noura12 Messages postés 44 Date d'inscription vendredi 20 juillet 2007 Statut Membre Dernière intervention 3 octobre 2008
14 nov. 2008 à 12:31
Merci beaucouppppppppppppp.... ça marche nickel,
g un petit souci ^^' ,

quand je mix deux fichiers audio enregistrés a travers micro,ils auront la meme frequence 44100 et le mixage fonctionne tres bien, mais quand j'essaye de mixer deux wave telechargés et qui n'ont pas la meme frequence , le fichier de sortie "mix.wav" à l'air de se lire RAPIDEMENT.. comme sil prend la frequense minimale!!

voila g essayé de fixer la frequence de mes input par SetFreq(44100) mais ça change rien :s

g essayé ça aussi :

CTab<double> tabFFT[2];
if(process.GetFFT(tabFFT))
{
int indexFreqMax = 0;
double max = 0.0;

//trouver la fréquence dominante (en amplitude)
for(int i=0;i<tabFFT[0].Size();i++)
{
if( (double)*tabFFT[0] < max)
{
max = (double)*tabFFT[0] ;
indexFreqMax = i;
}
}

//calcul de la fréquence correspondante
double freqMax = (double)(indexFreqMax * snd2.GetFreq() / CSoundProcessing::TAILLE_FFT);

}

NB: "freqMax " prend tjrs la valeur 0 !

tu vois un peu les choses ?

Merci encors
cs_Noura12 Messages postés 44 Date d'inscription vendredi 20 juillet 2007 Statut Membre Dernière intervention 3 octobre 2008
13 nov. 2008 à 15:14
je me demande si t'as déja testé de faire un mix de deux wav en.. un chez toi ??
Merci :)
cs_Noura12 Messages postés 44 Date d'inscription vendredi 20 juillet 2007 Statut Membre Dernière intervention 3 octobre 2008
13 nov. 2008 à 15:07
oui g testé, dans ce cas on entre dans une boucle infini puisque la condition n'est pas réalisé:

do
{
::SetFilePointer(hFichierWave,idxData+sizeof(WAVEHEADER),NULL,FILE_BEGIN);
::ReadFile(hFichierWave,&chkData,4,&dwCaract,NULL);
idxData++;
}while(!((chkData[0]=='d') && (chkData[1]=='a') && (chkData[2]=='t') && (chkData[3]=='a')));
bobbyantho Messages postés 69 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 23 avril 2009
13 nov. 2008 à 14:34
Essaye de commenter le test 'if(hEnTete.wFormat == 1)' et vois ce que ça donne !
cs_Noura12 Messages postés 44 Date d'inscription vendredi 20 juillet 2007 Statut Membre Dernière intervention 3 octobre 2008
13 nov. 2008 à 14:17
Bonne nouvelle ou mauvaise nouvelle .. je sais pas :s,
le flux audio d'un wav n'est pas compresse !
je veux bien tester cette classe et jusqu'à mtn j'y arrive pas :(
heeelp!
cs_Noura12 Messages postés 44 Date d'inscription vendredi 20 juillet 2007 Statut Membre Dernière intervention 3 octobre 2008
13 nov. 2008 à 13:12
je pense que les wav du system (window) sont de format non compressé et pourtant ça marche pas :/
c marrant de ne pas trouver un fichier wav non compréssé!
cs_Noura12 Messages postés 44 Date d'inscription vendredi 20 juillet 2007 Statut Membre Dernière intervention 3 octobre 2008
13 nov. 2008 à 11:39
Merci beaucoup,
je testerai alors les fichiers WAVE PCM non compressés :).
bobbyantho Messages postés 69 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 23 avril 2009
13 nov. 2008 à 11:20
Pour info, voilà les formats WAVE les plus courants :

Code Description
0 (0x0000) Unknown
1 (0x0001) PCM/uncompressed
2 (0x0002) Microsoft ADPCM
6 (0x0006) ITU G.711 a-law
7 (0x0007) ITU G.711 µ-law
17 (0x0011) IMA ADPCM
20 (0x0016) ITU G.723 ADPCM (Yamaha)
49 (0x0031) GSM 6.10
64 (0x0040) ITU G.721 ADPCM
80 (0x0050) MPEG
65,536 (0xFFFF) Experimental
bobbyantho Messages postés 69 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 23 avril 2009
13 nov. 2008 à 11:19
Effectivement !

En fait, si 'hEnTete.wFormat' est égal à 9, cela signifie que le fichier WAV n'est pas au format PCM. Ce doit être un format WAVE compressé.

Ma classe ne permet actuellement de lire que des fichiers WAVE PCM non compressés.

Cordialement.
cs_Noura12 Messages postés 44 Date d'inscription vendredi 20 juillet 2007 Statut Membre Dernière intervention 3 octobre 2008
13 nov. 2008 à 10:55
Merci pour ta reponse si rapide..
je l'ai testé aussi mais ça donne rien :(
voila en appelant la fonction "OpenFile" en premier, fallait que cette condition soit bel et bien realisée pour que ça passe bien, Or ce n'est plus le cas chez moi : if(hEnTete.wFormat == 1)
la valeur de "hEnTete.wFormat " que j'ai est egal à 9 !!
et comme ça le Play ne donnera plus rien tantque l'openFile ne fait pas son travaille :s
bobbyantho Messages postés 69 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 23 avril 2009
13 nov. 2008 à 08:27
Bonjour,

Et comme ceci ? :

MonSon.PlayFile("d:\\1.wav");
cs_Noura12 Messages postés 44 Date d'inscription vendredi 20 juillet 2007 Statut Membre Dernière intervention 3 octobre 2008
12 nov. 2008 à 19:49
pour plus de précision, ça bug au niveau de la fonction "OpenFile",
cette condition n'est plus réalisé quoique je fasse :s :

//si fichier wave PCM
if(hEnTete.wFormat == 1)

idées ?
cs_Noura12 Messages postés 44 Date d'inscription vendredi 20 juillet 2007 Statut Membre Dernière intervention 3 octobre 2008
12 nov. 2008 à 17:57
Comme tout le monde, je te félicite... :)
voila pour une première utilisation , g voulu lire un fichier .wav en passant par la fonction :
BOOL PlayFile(const CStr& strNomFichier);

au debut j'avais l'erreur de convertion non possible du paramètre 1 de 'const CStr' en 'LPCWSTR',
bien resolu avec ce bout de code :

const char * jj = strNomFichier;

// Lecture du fichier wave
bResult = ::sndPlaySound((LPCWSTR)jj, SND_SYNC);

voila mon main :

#include "Sound.h"

int main(void)
{
//création de l'objet son
CSound MonSon;
MonSon.PlayFile("d:/1.wav");
}

mais rien ne se lit et je vois pas l'erreur!!
Merci d'avance
cs_brunad64 Messages postés 2 Date d'inscription samedi 30 octobre 2004 Statut Membre Dernière intervention 16 octobre 2008
16 oct. 2008 à 10:07
Merci beaucoup, réponse impressionnante de rapidité !

Ta suggestion était la bonne, ça compile mais ça bloque après dans Str.h sur les macros _toupper etc. J'ai supprimé ce fichier et j'ai remplacé les types CStr par string de la STL du C++.
Cela fonctionne maintenant sous devcpp après quelques adaptations.
Enfin, je n'ai essayé que ça pour l'instant:

#include "Sound.h"
...
main(){
...
CSound MonSon;
MonSon.OpenFile("La_4.wav");
MonSon.Play();
...
}

Merci et bravo pour cette classe qui est très bien.
bobbyantho Messages postés 69 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 23 avril 2009
16 oct. 2008 à 08:17
Bonjour,

Peut-être essayer avec quelque-chose de ce genre :
friend class CSoundProcessing;
cs_brunad64 Messages postés 2 Date d'inscription samedi 30 octobre 2004 Statut Membre Dernière intervention 16 octobre 2008
15 oct. 2008 à 22:42
Bonjour,
à la compilation sous devcpp j'ai le message

26 E:\Son\Accords\CSound\Sound.h a class-key must be used when declaring a friend
correspondant au code:

...
class CSoundProcessing;

class CSound
{
friend CSoundProcessing;
...
ce qui semble pourtant correct, un idée ?
merci
Utilisateur anonyme
29 sept. 2008 à 20:45
PS: un mail à thomas.guitar"at"hotmail.fr avec un dossier zippé contenant tout le barda avec un fichier .sln ou .vcproj, et je te dois une bière =)
Utilisateur anonyme
29 sept. 2008 à 20:39
Salut bobby (en espérant que tu répondes ^^)
D'une, bravo pour l'initiative, j'adore ta classe :P
De deux, peux tu me décrire pas à pas comment incruster ta classe dans un nouveau projet vide avec Visual Studio 08?
(include spéciaux, paramètre du projet, etc..)
J'ai beau essayer, je chope toujours des erreurs à la compilo :/

Un grand merci d'avance ^^ !
cs_pack8 Messages postés 2 Date d'inscription lundi 3 décembre 2007 Statut Membre Dernière intervention 17 mars 2008
17 mars 2008 à 18:45
salut
je veux cet projet mais avec c++ builder
je fait des aissi pour converté cet source a c++ builder mais je ne peut pas
sivous pouez aide moi
et merci
bobbyantho Messages postés 69 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 23 avril 2009
15 mars 2008 à 14:58
Voilà une nouvelle MAJ avec de nombreuses optimisations et corrections et une utilisation beaucoup plus simple.
bobbyantho Messages postés 69 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 23 avril 2009
27 févr. 2008 à 14:32
Eh bien mets un point d'arrêt au début de la méthode Colle et regardes ce qu'il ce passe en pas à pas.
cs_Dev123456789 Messages postés 2 Date d'inscription mercredi 15 mars 2006 Statut Membre Dernière intervention 27 février 2008
27 févr. 2008 à 13:43
Merci pour ta réponse si rapide !

La fonction "Colle" est donc la fonction pour "fusionner" 2 .wav?

Je ne comprend sans doute pas tout. Peux-tu regarder mon code stp, il est très court?

/////////////////////////////////////
//création des objets "son"
CSound* Son1 = new CSound();
CSound* Son2 = new CSound();
CSound* Son3 = new CSound();

Son1->Ouvrir("tada.wav");
Son2->Ouvrir("tada.wav");
Son3 = Son1->Colle(Son2);

if(Son3->IsValide())
Son3->Lire();

delete Son1;
delete Son2;
delete Son3;
/////////////////////////////////////

J'ai fait exprès de prendre le même fichier pour m'assurer que dans la fonction Colle les conditions étaient bien respectées. Mais la fonction Son3->Lire() ne produit aucun son. Que dois-je faire?
merci
bobbyantho Messages postés 69 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 23 avril 2009
27 févr. 2008 à 11:26
Avec la méthode CSound* Colle(const CSound* pWaveAdd)

CSound son1, son2;

...

CSound* son3 = son1.Colle(&son2);
cs_Dev123456789 Messages postés 2 Date d'inscription mercredi 15 mars 2006 Statut Membre Dernière intervention 27 février 2008
27 févr. 2008 à 09:53
Merci bobbyantho pour ce source, le code est très bien écrit.

Saurais-tu en utilisant ta classe comment fusionner 2 fichiers .wav (ou 2 buffers wav) en un seul? Pas une concaténation je veux dire mais plutôt que les 2 sons soient côte à côte.

Une idée?
ordiman85 Messages postés 41 Date d'inscription samedi 4 mars 2006 Statut Membre Dernière intervention 19 mars 2010
3 janv. 2008 à 17:03
Excellente source.

J'ai quand même une suggestion.

-------- Code : ------------------------

//Trouver un pilote de sortie son valide
for(UINT uiDevId=0;uiDevId<waveOutGetNumDevs();uiDevId++)
{
//si pas de pilote
if(uiDevId == waveOutGetNumDevs())
{
//Erreur
mmResult = MMSYSERR_BADDEVICEID;
}
//si le pilote est valide
if(waveOutOpen(&hWaveOut,WAVE_MAPPER,&m_WaveFormat,0,0,CALLBACK_NULL) == MMSYSERR_NOERROR)
{
//Pilote trouvé
mmResult = MMSYSERR_NOERROR;
}
}

--------------------------------

Je me demande à quoi sert cette boucle. L'appel de waveOutOpen est indépendant de uiDevId. Et aussi WAVE_MAPPER est l'identifiant de la sortie WAVE par défaut, celle qui nous intéresse, donc waveOutGetNumDevs ne sert à rien à mon avis, à part peut-être pour accéder au synthétiseur, au lecteur CD et cie... mais quel intérêt...
Un simple appel de ce style aurait suffi :

----------------------------
MMRESULT mmRes;

// Blabla...

mmRes = waveOutOpen(&hWaveOut,WAVE_MAPPER,&m_WaveFormat,0,0,CALLBACK_NULL);
if ( mmRes == MMSYSERR_NOERROR ) {
// Blabla...
-----------------------------

Sinon ta source est superbe. Je vais certainement m'en servir pour un logiciel gérant des fichiers wav. 10/10
roidelajungle Messages postés 9 Date d'inscription vendredi 5 octobre 2007 Statut Membre Dernière intervention 18 décembre 2007
18 déc. 2007 à 07:41
Ok.

Merci de m'avoir aider autant que possible.
bobbyantho Messages postés 69 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 23 avril 2009
17 déc. 2007 à 22:17
Aucune idée !

Je pense que la valeur de TAILLE_FFT joue sur la rapidité/qualité du résultat (d'après mes tests un fenêtre de 2048 échantillons est un bon compromis). Le spectre calculé n'est pas infini car il est limité par le spectre acceptable par le micro et la carte son dans le cas d'un enregistrement. Dans le cas de la lecture d'un fichier son, les données sont codées sur 16/32bits avec Fe=44kHz dans ma classe, ce qui limite sûrement aussi la plage de fréquence.
roidelajungle Messages postés 9 Date d'inscription vendredi 5 octobre 2007 Statut Membre Dernière intervention 18 décembre 2007
17 déc. 2007 à 15:48
A ce moment là pourquoi le spectre calculé n'est pas infini, si rien ne le limite?

Et aussi, pourquoi les valeurs de TAILLE_FFT et de TAILLE_BUFFER n'influent pas sur le spectre calculé?
bobbyantho Messages postés 69 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 23 avril 2009
17 déc. 2007 à 15:11
Désolé mais je ne peux pas t'aider.

On ne peut savoir qu'une fréquence est entre 0-18000Hz qu'après l'avoir calculée.
roidelajungle Messages postés 9 Date d'inscription vendredi 5 octobre 2007 Statut Membre Dernière intervention 18 décembre 2007
17 déc. 2007 à 13:57
Up !

Quelqu'un peut m'aider??????
roidelajungle Messages postés 9 Date d'inscription vendredi 5 octobre 2007 Statut Membre Dernière intervention 18 décembre 2007
19 nov. 2007 à 10:48
Salut,

j'essaye de comprendre comment fonctionne ta fonction de calcule de la FFT et je ne vois pas comment faire pour restreindre le spectre qu'elle calcule.
En effet elle donne accès à 0-60000Hz environ et je ne m'interesse qu'à 0-1800Hz et c'est vraiment important pour moi de ne pas calculer la partie du spectre qui ne m'interesse pas.

pouvez-vous m'aider?
bobbyantho Messages postés 69 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 23 avril 2009
9 nov. 2007 à 20:02
Eh bien enregistres un son d'une seconde que tu coupes après !
roidelajungle Messages postés 9 Date d'inscription vendredi 5 octobre 2007 Statut Membre Dernière intervention 18 décembre 2007
9 nov. 2007 à 17:02
En fait, c'est l'acquisition sur une durée inférieure à une seconde qui ne semble pas possible.

Que puis-je faire?
roidelajungle Messages postés 9 Date d'inscription vendredi 5 octobre 2007 Statut Membre Dernière intervention 18 décembre 2007
9 nov. 2007 à 16:19
Salut, c'est encore moi.

Je n'arrive pas à calculer la FFT d'un son de moins de 1 seconde. Est-ce possible avec la fonction GetFFT?
Ou faut-il que j'adapte tout à la main?

Merci par avance.
roidelajungle Messages postés 9 Date d'inscription vendredi 5 octobre 2007 Statut Membre Dernière intervention 18 décembre 2007
9 nov. 2007 à 16:03
Merci,

en fait c'est bon, j'ai trouvé la solution à mon Pb, une faute de débutant sur la nature du projet que j'avais créé.
bobbyantho Messages postés 69 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 23 avril 2009
9 nov. 2007 à 14:49
Bonjour,

Ce problème n'est absolument pas lié à la classe CSound.

C'est une erreur de link du compilateur qui signifie que tu utilises des fonctions (ici, en l'occurence WinMain) dont il ne trouve pas le corps.
roidelajungle Messages postés 9 Date d'inscription vendredi 5 octobre 2007 Statut Membre Dernière intervention 18 décembre 2007
9 nov. 2007 à 12:14
Bonjour à tous,

je suis un nouvel utilisateur de la classe CSOUND avec pour but de traiter le signal issu d'un micro.
je suis en pleine phase de découverte de cette classe et je recontre des petits Pb.
je suis sous visual C++ et au moment de la phase 'build' ça plante :
"Linking...
LIBCD.lib(wincrt0.obj) : error LNK2001: unresolved external symbol _WinMain@16
Debug/capturemicro.exe : fatal error LNK1120: 1 unresolved externals
Error executing link.exe."
quelqu'un peu m'aider????
bobbyantho Messages postés 69 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 23 avril 2009
13 juin 2007 à 10:44
Le tableau de format [2][TAILLE_FFT/2] contient en [0] le canal gauche et en [1] le canal droit du spectre des fréquences pour un son stéréo.

Ce spectre de fréquences peut être tracé ou utilisé pour trouver des coefficients afin de traiter ultérieurement le signal, ... qu'ajouter ?, ... son utilité est laissée à l'imagination de celui qui utilisera la classe :) !
muchou123 Messages postés 2 Date d'inscription vendredi 16 juin 2006 Statut Membre Dernière intervention 13 juin 2007
13 juin 2007 à 10:04
Bonjour,

Alors là, je dis merci et encore bravo, rapide et précis que demander de plus ;).
J'ai testé un peu toutes les fonctions pour m'amuser et tout marche nikel.
Il y a juste encore une petite chose, je sais que la FFT nous donne le spectre de fréquence du signal et j'arrive à l'utiliser à partir de ta classe. Mais je me demandais quelle utilitée elle avait réellement, on récupère après appel de la fonction un tableau[2][..], le 2 corresond t'il au nombre de bande ? Et une fois ce tableau en mains quelles opérations peut-on effectuer ? Si j'incrémente chaque point du tableau de 100 par exemple, est-ce que la fréquence va augmenter ?

Voilà merci encore

Bonne journée
bobbyantho Messages postés 69 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 23 avril 2009
13 juin 2007 à 09:19
Bonjour,

CSound* pSound = new CSound();

//on ouvre le fichier wave
pSound->Ouvrir("monFichier.wav");

//on défini 2 bandes de fréquence à filtrer
int iNbBandes = 2;
TBande tBandes[iNbBandes];
//la première atténuera par 2 les fréquences entre 100Hz et 500Hz
tBandes[0].fFreqBas = 100;
tBandes[0].fFreqHaut = 500;
tBandes[0].fCoef = 0.5;
//la seconde amplifiera par 3 les fréquences entre 1kHz et 5kHz
tBandes[1].fFreqBas = 1000;
tBandes[1].fFreqHaut = 5000;
tBandes[1].fCoef = 3.0;

//on applique ces filtres
pSound->Equalizer(tBandes, iNbBandes);

Voilà, j'espère que c'est assez clair.
muchou123 Messages postés 2 Date d'inscription vendredi 16 juin 2006 Statut Membre Dernière intervention 13 juin 2007
12 juin 2007 à 20:39
Bonjour,

Ce code est vraiment très bien bravo.....Mais j'ai une petite question, je ne comprends pas comment appeler la fonction equalizer(), un exemple serait le bienvenue...

Merci
bobbyantho Messages postés 69 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 23 avril 2009
1 juin 2007 à 09:09
Bonjour,

Si le fichier est vide, deux solutions :
- tu ne fais pas l'acquisition sur la bonne entrée
- tu fais l'acquisition sur la bonne entrée (par exemple ton micro) mais celle-ci n'est pas sélectionnée dans Windows. Doubles-clic sur l'icone haut-parleur en barre des tâches, options / propriétés / enregistrement et coches sélectionner.

Concernant la méthode de fenêtrage, elle doit être utilisée avec un tableau de fréquences. Pour l'exemple d'utilisation, regardes dans la méthode Equalizer() où elle est utilisée.
snowlover Messages postés 16 Date d'inscription mercredi 29 novembre 2006 Statut Membre Dernière intervention 31 mai 2007
31 mai 2007 à 17:36
J'ai intégré ton code de recupération d'un son et l'enregistrement en fichier wav et ca marche parfaitement c'est vraiment simple a mettre en oeuvre. mais il y a des petit truc qui me bloque. Si je veux lire le fichier wav sans passer par le programme, avec VLC par exemple je n'entend rien. La durée correspond a celle de l'enregistrement mais on dirai que la bande est vide. et pui par la meme occasion peut tu m'explique comment appeler la fonction fenêtrage. J'ai essayer de l'utiliser et ca planter j'ai des message d'erreur. Je ne dois pas mettre ce qu'il faut en paramêtre je pense.

Merci
snowlover Messages postés 16 Date d'inscription mercredi 29 novembre 2006 Statut Membre Dernière intervention 31 mai 2007
31 mai 2007 à 14:51
Bonjour,

Merci pour les infos j'ai trouvé d'ou venait le problème. Pourrais-tu me dire comment tu as fait pour faire ton spectrogramme? Je pensais chercher des point de corrélation sur chaque module de chaque fréqence mais j'ai peur que ce soit tres long. Merci !!
snowlover Messages postés 16 Date d'inscription mercredi 29 novembre 2006 Statut Membre Dernière intervention 31 mai 2007
30 mai 2007 à 10:55
d'accord je regarde tout ca merci bien!!!!!
bobbyantho Messages postés 69 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 23 avril 2009
30 mai 2007 à 10:25
Bonjour,

Non, lorsqu'on appui sur une touche, on va dans la fonction CALLBACK de la fenêtre concernée uniquement. Quant aux données audio acquises, elles seront traitées dans la fonction CALLBACK de la classe CSound.

Quant au bug, attention que 'lpWaveHDR' soit bien initialisé, que 'pNvData' soit de type char* et que iTailleData+lpWaveHDR->dwBufferLength soit supérieur à 0. Effectivement, il ne reconnait pas l'opérateur 'new', vérifie que ton projet soit bien configuré pour C++.
snowlover Messages postés 16 Date d'inscription mercredi 29 novembre 2006 Statut Membre Dernière intervention 31 mai 2007
30 mai 2007 à 08:33
salut!

J'ai une petite question à propos d'une erreur que je rencontre sur la ligne de la fonction callback:
pNvData = new char[iTailleData+lpWaveHDR->dwBufferLength]

les erreurs sont:

'DEBUG_NEW' : undeclared identifier
'=' : cannot convert from 'int' to 'char *'
syntax error : missing ';' before type 'char'
syntax error : missing ';' before '['

J'ai l'impression que le type new char ne lui plait pas mais je ne sais pas pourquoi.
snowlover Messages postés 16 Date d'inscription mercredi 29 novembre 2006 Statut Membre Dernière intervention 31 mai 2007
29 mai 2007 à 17:02
A bon et bien écoute merci bien je vais tester alors mais à chaque fois que je vais appuyer sur une toucha par exemple le programme rentrera dans les 2 fonctions?
bobbyantho Messages postés 69 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 23 avril 2009
29 mai 2007 à 15:24
Bien sûr que si !
snowlover Messages postés 16 Date d'inscription mercredi 29 novembre 2006 Statut Membre Dernière intervention 31 mai 2007
29 mai 2007 à 09:27
et bien parce que je ne peux pas avoir 2 fonctions callback si?
bobbyantho Messages postés 69 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 23 avril 2009
25 mai 2007 à 17:10
Pourquoi vouloir regrouper les deux ???
snowlover Messages postés 16 Date d'inscription mercredi 29 novembre 2006 Statut Membre Dernière intervention 31 mai 2007
25 mai 2007 à 10:03
Bonjour bonjour.

J'ai encore besoin de vos lumieres.Voila, mon programme doit faire de la commande de webcam,grace a un protocole qui s'appel Twain www.twain.org pour ceux que ca interesse :). Mais également de la commande vocale pour laquelle j'utilise l'exelente class Csound!!!! Seulement j'ai un prob (comme toujours)!!!

Ma partie webcam utilise une fonction bien connue du nom de Callback :LRESULT CALLBACK WndProc(HWND hWnd, UINT iMessage,WPARAM wParam,LPARAM lParam).

Et en meme temps Csound utilse aussi cette fonction sous la forme: friend void CALLBACK WaveInProc(HWAVEIN hWaveIn, UINT uMsg, DWORD dwInstance, DWORD dwParam1, DWORD dwParam2);

Me voila bien mal pour regrouper les 2. Quelqu'un peut il me dire comment faire? Les différence entreWPARAM et DWORD par exemple, ou entre les type de handle HWND et HWAVEIN?

Merci
snowlover Messages postés 16 Date d'inscription mercredi 29 novembre 2006 Statut Membre Dernière intervention 31 mai 2007
23 mai 2007 à 11:57
Bon en faite j'ai trouvé la solution tous seul....C'était bien le précompilateur StdAfx qui utilisait d'autre header et qui plantait tout... voila voila
snowlover Messages postés 16 Date d'inscription mercredi 29 novembre 2006 Statut Membre Dernière intervention 31 mai 2007
23 mai 2007 à 11:14
A oui sinon jutilise un précompilateur stdAfx ( j'ai pas le choix sinon ca plante).
snowlover Messages postés 16 Date d'inscription mercredi 29 novembre 2006 Statut Membre Dernière intervention 31 mai 2007
23 mai 2007 à 10:32
Bon j'ai verifié ton mon projet j'ai pas trouvé de windows.h . Par contre j'utilise le protocole twain pour faire de la prise d'image par webcam ca peut venir de la?
bobbyantho Messages postés 69 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 23 avril 2009
22 mai 2007 à 19:29
Il doit te manquer un #include, sûrement "windows.h" ou alors tu l'as inclus ailleurs que dans le Sound.h.

Voilà l'entête du fichier Sound.h :
#pragma once

#pragma comment(lib,"winmm.lib")

#include <windows.h>
#include <stdio.h>
#include <math.h>
#include <time.h>

Si tu as un #include <windows.h> ailleur que dans ce fichier, enlève-le ou remplace le par #include "Sound.h"
snowlover Messages postés 16 Date d'inscription mercredi 29 novembre 2006 Statut Membre Dernière intervention 31 mai 2007
22 mai 2007 à 16:05
Bon j'ai manqué un épisode je crois parce que ca ne fonctionne pas. J'ai mis le sound.h dans mon projet et j'ai des messages d'erreurs. Je pense que la librairie "winmm.lib" ce s'inclue pas. J'ai loupé quelque chose?

voila les erreurs:

error C2501:'HWAVEIN' : missing storage-class or type specifiers
error C2501:'m_hWaveIn' : missing storage-class or type specifiers
error C2146:syntax error : missing ';' before identifier 'm_WaveFormat' // j'ai verifier il ne manque pas de";"
error C2501:WAVEFORMATEX' : missing storage-class or type specifiers
error C2501:m_WaveFormat' : missing storage-class or type specifiers
error C2146:syntax error : missing ';' before identifier 'Start' // idem
error C2061: syntax error : identifier 'WAVEHDR'
error C2061: syntax error : identifier 'HWAVEIN'

Merci!!
snowlover Messages postés 16 Date d'inscription mercredi 29 novembre 2006 Statut Membre Dernière intervention 31 mai 2007
22 mai 2007 à 13:58
daccord donc en faite je ne m'en occupe pas de cette librairie. Merci bien
bobbyantho Messages postés 69 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 23 avril 2009
22 mai 2007 à 13:14
Bonjour,

Sous VisualC++, la librairie est "winmm.lib".

Elle est inclue directement dans le fichier Sound.h avec la directive de compilation :
#pragma comment(lib,"winmm.lib")
donc inutile de chercher à l'inclure au projet.

Voilà.
snowlover Messages postés 16 Date d'inscription mercredi 29 novembre 2006 Statut Membre Dernière intervention 31 mai 2007
22 mai 2007 à 10:37
Re bonjour a tous.

Encore une petite question. Avec le source que tu fournis il y a une librairie "libwinmm.a" indispensable. Le probleme c'est que je crois savoir que cette une librairie de dev-c++. Et je travaille avec visual c++. Comment je peut faire pour utiliser la librairie?

Merci!!!!!!
snowlover Messages postés 16 Date d'inscription mercredi 29 novembre 2006 Statut Membre Dernière intervention 31 mai 2007
13 mai 2007 à 15:03
Je te remercie également bobbyantho pour ton code exelent et ton aide precieuse.
benwa74 Messages postés 5 Date d'inscription vendredi 26 mai 2006 Statut Membre Dernière intervention 1 décembre 2008
13 mai 2007 à 01:14
Merci beaucoup bobbyantho. C'est tres clair. Encore merci pour le code, il est parfait !
bobbyantho Messages postés 69 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 23 avril 2009
12 mai 2007 à 11:42
Bonjour,

Tout d'abord merci Benwa74.
Voici un petit exemple d'utilisation de la classe (sous Dev-C++, ne pas oublier d'ajouter "libwinmm.a" dans les dépendances du projet) :

#include "Sound.h"

int main(void)
{
//création de l'objet son
CSound MonSon;

//acquisition de 3 secondes
MonSon.Acquisition(3.0);

//appliquer un écho
MonSon.Echo(0.7, 0.5);

//jouer le son
MonSon.Lire();

//sauvegarder au format wav
MonSon.Sauvegarder("fichier.wav");

return 0;
}

Concernant maintenant ta question Snowlover, j'avais fait de la reconnaissance vocale (du moins de mots et pas de phrases) de manière assez simple. Ca ne marchait pas très bien mais le principe peut être amélioré.

Voici la procédure que j'utilisais :
1) Formatage du son :
- mise au format 16 bits
- suppression des "blancs" de chaque coté
- normalisation en amplitude
- normalisation en durée (on calcule un quantum et on vient sous-échantillonner ou sur-échantilloner pour que la durée du son soit celle du son de référence)

2) Transformation en fréquence
- calculs de FFT sur plusieurs morceaux de signal avec un petit recouvrement et création d'un spectrogramme en agglomérant tous ces résultats
- normalisation en amplitude comme précédemment

3a) En cas d'apprentissage de mot, on stocke ce résultat dans un fichier

3b) En cas de recherche de mot, on compare aux mots de référence déjà appris
- on effectue une corrélation des deux spectrogrammes pour trouver le point maximum de corrélation
- on retient le mot qui avait la plus petite valeur à ce maximum

Voilà, bonne chance.
benwa74 Messages postés 5 Date d'inscription vendredi 26 mai 2006 Statut Membre Dernière intervention 1 décembre 2008
11 mai 2007 à 17:20
Salut,
D'abord merci beaucoup pour ce joli petit code qui vaut de l'or a mon avis. Cependant je n'arrive pas a tout comprendre.

Est ce qu'il est possible d'avoir un exemple de l'utilisation des fonctions ? Parce que je crois que je fais pas tout dans le bon sens... Du coups le programme compile mais ca ne fait rien.


Merci d'avance,

Benoit
snowlover Messages postés 16 Date d'inscription mercredi 29 novembre 2006 Statut Membre Dernière intervention 31 mai 2007
10 mai 2007 à 14:39
Bonjour,

D'abord je n'ai pas encore eu le temps de te remercier pour ton aide BOBBYANTHO alors merci j'ai tous compris!!

J'ai maintenant une autre question. Mon but est de faire de la reconnaissance vocale et donc je comptait me servir de la fft. Je pensais recupérer les tableaux que retourne la fft et les comparer à des tableaux de références. Mais en fait le mot que l'on prononce ne sera jamais identique à celui enregistré donc les tableaux seront toujours un peu différents. Est ce que quelqu'un ( peut etre diablo si sont projet fonctionne) pour m'eclairé sur comment je pourais déterminer si un son correspond à tel ou tel son de reference?

Merci a tous!!!!
bobbyantho Messages postés 69 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 23 avril 2009
3 mai 2007 à 09:15
Bonjour,

Il faut tout d'abord savoir que la FFT est faite sur des paquets de 2048 données. Pour chacun de ces paquets, on effectue le traitement suivant :

fTabSon -> contient le son tel quel (en fait un le paquet de 2048), non traité
fTabRe -> contient la partie réelle de la FFT
fTabIm -> contient la partie imaginaire de la FFT
fTabFFT -> contient la FFT : fTabRe² + fTabIm²

On recolle ensuite les paquets de 2048 de fTabFFT cette fois.
snowlover Messages postés 16 Date d'inscription mercredi 29 novembre 2006 Statut Membre Dernière intervention 31 mai 2007
2 mai 2007 à 17:45
Bonjour

JE suis novice en matiere de traitement audio (et débutant en programmation par la meme occasion). Et j'ai un peut de mal a comprendre tout le code. Si je ne me trompe pas on met dans fTab son la frequence, dans fTabRe la partie reel et dans fTaIm la partie imaginaire qui va avec chaque frequence. Mais dans fTabFFT il y a quoi alors? Je ne vois pas bien ce que contient ce tableau.

Merci de votre aide.
gabuzomeuh Messages postés 53 Date d'inscription jeudi 31 juillet 2003 Statut Membre Dernière intervention 28 mars 2007
14 mars 2007 à 18:10
bonjour

Ca a l'air bien comme classe mais moi ce que j'essaie de faire c'est du traitement en temps reel, c'est à dire prendre le signal en entrée le traiter et le sortir aussitot voir http://www.cppfrance.com/codes/MOTEUR-AUDIO-TEMPS-REEL_11177.aspx

Mais le processus est interrompu quand la fenetre est reduite ou restaurée.
Richon55 Messages postés 5 Date d'inscription mardi 16 janvier 2007 Statut Membre Dernière intervention 25 avril 2007
13 févr. 2007 à 09:40
Bonjour à tous,
je signal que j'ai pu résoudre mon problème,
il manque en fait 3 lignes de code qui initialise les tableaux fTabSon , fTabRe et fTabIm.
il suffit donc de rajouter, dans la fonction GetFFT, ces 3 lignes de code juste après la création des 3 tableaux :
memset(fTabSon[j],0,(TAILLE_FFT*sizeof(double)));
memset(fTabRe[j],0,(TAILLE_FFT*sizeof(double)));
memset(fTabIm[j],0,(TAILLE_FFT*sizeof(double)));
Voilà :-)
bonne programmation à tous!
Richon55 Messages postés 5 Date d'inscription mardi 16 janvier 2007 Statut Membre Dernière intervention 25 avril 2007
29 janv. 2007 à 17:30
Bonjour,
j'essaye grâce à votre classe CSound de récupérer le spectre de fréquence d'un son wave, mais il s'avère que la fonction GetFFt me renvoye des valeurs aberrantes: "[0] 3.8620959904185970e+065 "
voici les opérations que j'effectue :
MonSound.Ouvrir("essai.wav");
MonSound.Lire();
memset(fTabFFT[0],1,(TAILLE_FFT*sizeof(double))/2);
memset(fTabFFT[1],1,(TAILLE_FFT*sizeof(double))/2);
double fTabFFT[2][TAILLE_FFT/2];
MonSound.GetFFT(fTabFFT);

je précise que le signal "essai.wav" est un signal sinusoïdale de fréquence 1000 Hz et lorsque que j'effectue les lignes de codes ci-dessus, le tableau renvoyé par la fonction GetFFT est totalement remplie avec des valeurs aberrantes, est ce normal? pourriez vous me dire mes erreurs ?
merci d'avance
Cordialement.
bobbyantho Messages postés 69 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 23 avril 2009
26 déc. 2006 à 15:26
Bonjour,

Tout d'abord merci pour ces compliments.

Le facteur de 2 est normal, il vient du fait que tu es en 16 bits.

La formule exacte est donc :
(Temps total du son)*(fréquence d'échantillonage)*(bits par échantillonnage / 8)*(nombre de channels)

Mais sinon, la méthode GetBuffer(...) avec les paramètres à 0 peux te retourner la taille du buffer.

exemple:
int iTaille = Obj.GetBuffer(NULL,0);
int* pData = new int[iTaille];
Obj.GetBuffer(pData,iTaille);

Voilà, si tu as d'autres questions, n'hésites pas mais envoie-moi un message plutôt qu'un commentaire.
666Diablo666 Messages postés 1 Date d'inscription lundi 25 décembre 2006 Statut Membre Dernière intervention 25 décembre 2006
25 déc. 2006 à 21:06
Bonsoir,

Je tiends également à dire que je trouve ta classe super. Elle est trés facile à utiliser et même tellement facile que je m'en sers dans mon projet de reconnaissance vocale.
Mais j'ai un petit problème à vrai dire et je ne sais pas si il vient de moi ou si c'est une erreur de ta part.
Dans le doute je te demande donc, car je sais que je m'adresse au mieu placer pour me donner un coup de pouce...

Alors voilà mon problème vient de la taille des données. Tu me corriges si je me trompe, mais pour calculer la taille des données j'utilise la formule suivante:

(Temps total du son)*(fréquence d'échantillonage)*(nombre de channels)

Chacun de ces paramètres étant récupérés grace aux getteurs que tu as mis à disposition.
Or, quand je veux récupérer les données grace à la méthode GetBuffer(...), ça ne fonctionne pas !
Ma taille est en fait trop petite, et je me rends compte en augmentant la taille qu'en fait celle qui permet la récupération des données est 2 fois plus grande !!! Et je dois avouer que je ne comprends pas ce facteur 2...
Alors vu que je commence dans le traitement du son, je pense que l'erreur vient de moi.
Dans ce cas est-ce que tu peux me dire ou j'ai faux?

Je te remerci d'avance et bonne soirée !!!
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
3 août 2006 à 18:33
Oui il m'avait étonné également le truc du MMSYSERRO_NOERROR ;)
bobbyantho Messages postés 69 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 23 avril 2009
3 août 2006 à 18:30
Merci, c'est vrai que cette partie ne sert pas à grand chose.
En plus, je viens de m'apercevoir que Erreur : MMSYSERR_NOERROR n'est pas très logique non plus :).

En fait, il faudrait faire :

//Trouver un pilote d'entrée son valide
for(UINT uiDevId=0;uiDevId<=waveInGetNumDevs();uiDevId++)
{
//si pas de pilote
if(uiDevId == waveInGetNumDevs())
//Erreur
mmResult = MMSYSERR_NODRIVER;
//si le pilote est valide
else if(waveInOpen(&m_hWaveIn,WAVE_MAPPER,&m_WaveFormat,(DWORD)WaveInProc,(DWORD)WaveInProc,CALLBACK_FUNCTION) == MMSYSERR_NOERROR)
//Pilote trouvé
mmResult = MMSYSERR_NOERROR;
}

Je corrige ça...
cs_Joky Messages postés 1787 Date d'inscription lundi 22 novembre 2004 Statut Membre Dernière intervention 31 janvier 2009 2
3 août 2006 à 15:55
C'est vrai que c'est vraiment pas mal du tout !
Par contre une suggestion :

for(UINT uiDevId=0;uiDevId<waveInGetNumDevs();uiDevId++)
{
//si pas de pilote
if(uiDevId == waveInGetNumDevs())
{
//Erreur
mmResult = MMSYSERR_NOERROR;
}
//si le pilote est valide
if(waveInOpen(&m_hWaveIn,WAVE_MAPPER,&m_WaveFormat,(DWORD)WaveInProc,(DWORD)WaveInProc,CALLBACK_FUNCTION) == MMSYSERR_NOERROR)
{
//Pilote trouvé
mmResult = MMSYSERR_NOERROR;
}
}

J'pense pas qu'il passera un jour la condition if(uiDevId == waveInGetNumDevs() :o

ça se passe à la ligne 317, fonction start
Voilà Dis m'en plus
bobbyantho Messages postés 69 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 23 avril 2009
9 janv. 2006 à 07:53
Eh bien merci Max12 pour tous ces compliments.

J'ai en effet essayé de faire quelque-chose de compréhensible afin que chacun puisse facilement comprendre de quoi il était question.

Le point intéressant est le codage des algorithmes type écho, réverb... J'ai vu dans le forum beaucoup de question relative à ceci mais apparement personne n'avait pris la peine de donner des exemple (sans renvoyer à l'utilisation de fonctions toutes faites, type DirectSound), voilà qui est fait.
cs_max12 Messages postés 1491 Date d'inscription dimanche 19 novembre 2000 Statut Modérateur Dernière intervention 7 juillet 2014
7 janv. 2006 à 19:15
Je n'ai pas testé encore, mais j'ai balayé le code et c'est tout simplement excellent.
1) Bien commenté
2) Bien aéré
3) Bien codé en général
4) Bien aéré (comme parfaitement lisible)

10/10 (Je sais que je note jamais mais là je fais une exeption)

A+
bobbyantho Messages postés 69 Date d'inscription vendredi 10 octobre 2003 Statut Membre Dernière intervention 23 avril 2009
7 janv. 2006 à 01:07
Je tiens aussi à remercier gagah1 pour son code sur l'équalizer http://www.cppfrance.com/codes/EQUALIZER-WIN32-/34436.aspx qui m'a beaucoup aidé.

Vos commentaires et remarques sont les bienvenues.
Rejoignez-nous