bobbyantho
Messages postés69Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention23 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.
//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és4Date d'inscriptionvendredi 28 août 2009StatutMembreDernière intervention11 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és4Date d'inscriptionjeudi 24 août 2006StatutMembreDernière intervention11 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és4Date d'inscriptionjeudi 24 août 2006StatutMembreDernière intervention11 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és4Date d'inscriptionjeudi 24 août 2006StatutMembreDernière intervention11 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és69Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention23 avril 2009 10 mars 2010 à 16:41
Bonjour,
Il faut ajouter tous les fichiers .h et .cpp à ton projet.
cs_devermyst
Messages postés4Date d'inscriptionjeudi 24 août 2006StatutMembreDernière intervention11 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és4Date d'inscriptionvendredi 28 août 2009StatutMembreDernière intervention11 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és69Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention23 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és4Date d'inscriptionvendredi 28 août 2009StatutMembreDernière intervention11 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és69Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention23 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és4Date d'inscriptionvendredi 28 août 2009StatutMembreDernière intervention11 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és8Date d'inscriptionvendredi 10 avril 2009StatutMembreDernière intervention23 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és69Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention23 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és8Date d'inscriptionvendredi 10 avril 2009StatutMembreDernière intervention23 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és8Date d'inscriptionvendredi 10 avril 2009StatutMembreDernière intervention23 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és69Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention23 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 :
gate35
Messages postés8Date d'inscriptionvendredi 10 avril 2009StatutMembreDernière intervention23 avril 2009 23 avril 2009 à 10:23
mais encore?peux tu développer stp?
bobbyantho
Messages postés69Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention23 avril 2009 23 avril 2009 à 10:18
A combien sont-ils définis ?
gate35
Messages postés8Date d'inscriptionvendredi 10 avril 2009StatutMembreDernière intervention23 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és8Date d'inscriptionvendredi 10 avril 2009StatutMembreDernière intervention23 avril 2009 23 avril 2009 à 09:46
Ah pas WINVER tu as raison je vérifie...
Merci
bobbyantho
Messages postés69Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention23 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és8Date d'inscriptionvendredi 10 avril 2009StatutMembreDernière intervention23 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és69Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention23 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és8Date d'inscriptionvendredi 10 avril 2009StatutMembreDernière intervention23 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és69Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention23 avril 2009 19 févr. 2009 à 08:15
En mettant à TRUE le paramètre 'bInverse' de la méthode FFT(...) !
kennyflorian
Messages postés8Date d'inscriptionjeudi 28 décembre 2006StatutMembreDernière intervention18 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és69Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention23 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és8Date d'inscriptionjeudi 28 décembre 2006StatutMembreDernière intervention18 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és69Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention23 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és8Date d'inscriptionjeudi 28 décembre 2006StatutMembreDernière intervention18 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és8Date d'inscriptionlundi 7 octobre 2002StatutMembreDerniè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és44Date d'inscriptionvendredi 20 juillet 2007StatutMembreDerniè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és44Date d'inscriptionvendredi 20 juillet 2007StatutMembreDerniè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és44Date d'inscriptionvendredi 20 juillet 2007StatutMembreDerniè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és44Date d'inscriptionvendredi 20 juillet 2007StatutMembreDerniè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és44Date d'inscriptionvendredi 20 juillet 2007StatutMembreDerniè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é:
bobbyantho
Messages postés69Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention23 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és44Date d'inscriptionvendredi 20 juillet 2007StatutMembreDerniè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és44Date d'inscriptionvendredi 20 juillet 2007StatutMembreDerniè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és44Date d'inscriptionvendredi 20 juillet 2007StatutMembreDerniè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és69Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention23 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és69Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention23 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és44Date d'inscriptionvendredi 20 juillet 2007StatutMembreDerniè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és69Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention23 avril 2009 13 nov. 2008 à 08:27
Bonjour,
Et comme ceci ? :
MonSon.PlayFile("d:\\1.wav");
cs_Noura12
Messages postés44Date d'inscriptionvendredi 20 juillet 2007StatutMembreDerniè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és44Date d'inscriptionvendredi 20 juillet 2007StatutMembreDerniè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és2Date d'inscriptionsamedi 30 octobre 2004StatutMembreDernière intervention16 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:
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és2Date d'inscriptionlundi 3 décembre 2007StatutMembreDernière intervention17 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és69Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention23 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és69Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention23 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és2Date d'inscriptionmercredi 15 mars 2006StatutMembreDernière intervention27 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();
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és69Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention23 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és2Date d'inscriptionmercredi 15 mars 2006StatutMembreDernière intervention27 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és41Date d'inscriptionsamedi 4 mars 2006StatutMembreDernière intervention19 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 :
Sinon ta source est superbe. Je vais certainement m'en servir pour un logiciel gérant des fichiers wav. 10/10
roidelajungle
Messages postés9Date d'inscriptionvendredi 5 octobre 2007StatutMembreDernière intervention18 décembre 2007 18 déc. 2007 à 07:41
Ok.
Merci de m'avoir aider autant que possible.
bobbyantho
Messages postés69Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention23 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és9Date d'inscriptionvendredi 5 octobre 2007StatutMembreDernière intervention18 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és69Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention23 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és9Date d'inscriptionvendredi 5 octobre 2007StatutMembreDernière intervention18 décembre 2007 17 déc. 2007 à 13:57
Up !
Quelqu'un peut m'aider??????
roidelajungle
Messages postés9Date d'inscriptionvendredi 5 octobre 2007StatutMembreDernière intervention18 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és69Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention23 avril 2009 9 nov. 2007 à 20:02
Eh bien enregistres un son d'une seconde que tu coupes après !
roidelajungle
Messages postés9Date d'inscriptionvendredi 5 octobre 2007StatutMembreDernière intervention18 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és9Date d'inscriptionvendredi 5 octobre 2007StatutMembreDernière intervention18 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és9Date d'inscriptionvendredi 5 octobre 2007StatutMembreDernière intervention18 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és69Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention23 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és9Date d'inscriptionvendredi 5 octobre 2007StatutMembreDernière intervention18 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és69Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention23 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és2Date d'inscriptionvendredi 16 juin 2006StatutMembreDernière intervention13 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és69Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention23 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és2Date d'inscriptionvendredi 16 juin 2006StatutMembreDernière intervention13 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és69Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention23 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és16Date d'inscriptionmercredi 29 novembre 2006StatutMembreDernière intervention31 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és16Date d'inscriptionmercredi 29 novembre 2006StatutMembreDernière intervention31 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és16Date d'inscriptionmercredi 29 novembre 2006StatutMembreDernière intervention31 mai 2007 30 mai 2007 à 10:55
d'accord je regarde tout ca merci bien!!!!!
bobbyantho
Messages postés69Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention23 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és16Date d'inscriptionmercredi 29 novembre 2006StatutMembreDernière intervention31 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és16Date d'inscriptionmercredi 29 novembre 2006StatutMembreDernière intervention31 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és69Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention23 avril 2009 29 mai 2007 à 15:24
Bien sûr que si !
snowlover
Messages postés16Date d'inscriptionmercredi 29 novembre 2006StatutMembreDernière intervention31 mai 2007 29 mai 2007 à 09:27
et bien parce que je ne peux pas avoir 2 fonctions callback si?
bobbyantho
Messages postés69Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention23 avril 2009 25 mai 2007 à 17:10
Pourquoi vouloir regrouper les deux ???
snowlover
Messages postés16Date d'inscriptionmercredi 29 novembre 2006StatutMembreDernière intervention31 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és16Date d'inscriptionmercredi 29 novembre 2006StatutMembreDernière intervention31 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és16Date d'inscriptionmercredi 29 novembre 2006StatutMembreDernière intervention31 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és16Date d'inscriptionmercredi 29 novembre 2006StatutMembreDernière intervention31 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és69Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention23 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.
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és16Date d'inscriptionmercredi 29 novembre 2006StatutMembreDernière intervention31 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és16Date d'inscriptionmercredi 29 novembre 2006StatutMembreDernière intervention31 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és69Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention23 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és16Date d'inscriptionmercredi 29 novembre 2006StatutMembreDernière intervention31 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és16Date d'inscriptionmercredi 29 novembre 2006StatutMembreDernière intervention31 mai 2007 13 mai 2007 à 15:03
Je te remercie également bobbyantho pour ton code exelent et ton aide precieuse.
benwa74
Messages postés5Date d'inscriptionvendredi 26 mai 2006StatutMembreDerniè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és69Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention23 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és5Date d'inscriptionvendredi 26 mai 2006StatutMembreDerniè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és16Date d'inscriptionmercredi 29 novembre 2006StatutMembreDernière intervention31 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és69Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention23 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és16Date d'inscriptionmercredi 29 novembre 2006StatutMembreDernière intervention31 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és53Date d'inscriptionjeudi 31 juillet 2003StatutMembreDernière intervention28 mars 2007 14 mars 2007 à 18:10
Mais le processus est interrompu quand la fenetre est reduite ou restaurée.
Richon55
Messages postés5Date d'inscriptionmardi 16 janvier 2007StatutMembreDernière intervention25 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és5Date d'inscriptionmardi 16 janvier 2007StatutMembreDernière intervention25 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és69Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention23 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és1Date d'inscriptionlundi 25 décembre 2006StatutMembreDernière intervention25 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és1787Date d'inscriptionlundi 22 novembre 2004StatutMembreDernière intervention31 janvier 20092 3 août 2006 à 18:33
Oui il m'avait étonné également le truc du MMSYSERRO_NOERROR ;)
bobbyantho
Messages postés69Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention23 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és1787Date d'inscriptionlundi 22 novembre 2004StatutMembreDernière intervention31 janvier 20092 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és69Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention23 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és1491Date d'inscriptiondimanche 19 novembre 2000StatutModérateurDerniè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és69Date d'inscriptionvendredi 10 octobre 2003StatutMembreDernière intervention23 avril 2009 7 janv. 2006 à 01:07
24 mars 2014 à 09:56
CSoundProcessing::TBande bande;
bande.fCoef = 2.0;
bande.fFreqBas = 500;
bande.fFreqHaut = 2000;
Tu peux mexpliquer ?
11 mars 2010 à 15:24
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);
}
}
11 mars 2010 à 12:19
j'ai ajouter des methodes
pour les données par contre je coince
11 mars 2010 à 11:50
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
10 mars 2010 à 16:47
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
10 mars 2010 à 16:41
Il faut ajouter tous les fichiers .h et .cpp à ton projet.
10 mars 2010 à 14:51
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
10 déc. 2009 à 10:25
Merci pour tout, tu m'as fait gagner beaucoup de temps.
9 déc. 2009 à 08:39
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);
}
9 déc. 2009 à 08:32
// 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
8 déc. 2009 à 08:28
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);
7 déc. 2009 à 15:56
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.
23 avril 2009 à 14:18
23 avril 2009 à 14:13
J'imagine que tu n'as pas oublié les :
#include "Sound.h"
#include "SoundProcessing.h"
Bon courage pour la suite.
23 avril 2009 à 14:07
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
23 avril 2009 à 10:36
Merci
23 avril 2009 à 10:32
WIN32;_WINDOWS;_FRA;WINVER=0x0501;_WIN32_WINNT=0x501
avec 0x501 pour Windows XP
23 avril 2009 à 10:23
23 avril 2009 à 10:18
23 avril 2009 à 10:15
fatal error C1189: #error : WINVER setting conflicts with _WIN32_WINNT setting
Cdlt
23 avril 2009 à 09:46
Merci
23 avril 2009 à 09:43
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 ?
23 avril 2009 à 09:23
Je suis sous visual C++ 2008 version complète, MFC... J'ai essayé plusieurs choses, ton exemple compris...
Merci
Cdlt
23 avril 2009 à 08:40
Es-tu sous visual C++ ? MFC ou pas MFC ?
Peux-tu en dire un peu plus ?
22 avril 2009 à 17:28
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
19 févr. 2009 à 08:15
18 févr. 2009 à 22:50
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 ?
18 févr. 2009 à 09:18
- Avec un '(LPCWSTR)(const char*)lavariable', le 'CreateFileW' devrit passer.
- Pour le chemin du .wav, c'est "C:\\Emplacement\\du\\fichier\\fichier.wav".
Cordialement.
16 févr. 2009 à 20:32
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
16 févr. 2009 à 15:46
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.
16 févr. 2009 à 02:36
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
21 déc. 2008 à 18:37
Je n'ai pas encore le fichier que j'en ai l'eau à la bouche...
XD
14 nov. 2008 à 12:43
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 :)
14 nov. 2008 à 12:35
14 nov. 2008 à 12:31
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
13 nov. 2008 à 15:14
Merci :)
13 nov. 2008 à 15:07
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')));
13 nov. 2008 à 14:34
13 nov. 2008 à 14:17
le flux audio d'un wav n'est pas compresse !
je veux bien tester cette classe et jusqu'à mtn j'y arrive pas :(
heeelp!
13 nov. 2008 à 13:12
c marrant de ne pas trouver un fichier wav non compréssé!
13 nov. 2008 à 11:39
je testerai alors les fichiers WAVE PCM non compressés :).
13 nov. 2008 à 11:20
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
13 nov. 2008 à 11:19
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.
13 nov. 2008 à 10:55
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
13 nov. 2008 à 08:27
Et comme ceci ? :
MonSon.PlayFile("d:\\1.wav");
12 nov. 2008 à 19:49
cette condition n'est plus réalisé quoique je fasse :s :
//si fichier wave PCM
if(hEnTete.wFormat == 1)
idées ?
12 nov. 2008 à 17:57
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
16 oct. 2008 à 10:07
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.
16 oct. 2008 à 08:17
Peut-être essayer avec quelque-chose de ce genre :
friend class CSoundProcessing;
15 oct. 2008 à 22:42
à 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
29 sept. 2008 à 20:45
29 sept. 2008 à 20:39
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 ^^ !
17 mars 2008 à 18:45
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
15 mars 2008 à 14:58
27 févr. 2008 à 14:32
27 févr. 2008 à 13:43
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
27 févr. 2008 à 11:26
CSound son1, son2;
...
CSound* son3 = son1.Colle(&son2);
27 févr. 2008 à 09:53
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?
3 janv. 2008 à 17:03
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
18 déc. 2007 à 07:41
Merci de m'avoir aider autant que possible.
17 déc. 2007 à 22:17
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.
17 déc. 2007 à 15:48
Et aussi, pourquoi les valeurs de TAILLE_FFT et de TAILLE_BUFFER n'influent pas sur le spectre calculé?
17 déc. 2007 à 15:11
On ne peut savoir qu'une fréquence est entre 0-18000Hz qu'après l'avoir calculée.
17 déc. 2007 à 13:57
Quelqu'un peut m'aider??????
19 nov. 2007 à 10:48
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?
9 nov. 2007 à 20:02
9 nov. 2007 à 17:02
Que puis-je faire?
9 nov. 2007 à 16:19
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.
9 nov. 2007 à 16:03
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éé.
9 nov. 2007 à 14:49
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.
9 nov. 2007 à 12:14
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????
13 juin 2007 à 10:44
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 :) !
13 juin 2007 à 10:04
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
13 juin 2007 à 09:19
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.
12 juin 2007 à 20:39
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
1 juin 2007 à 09:09
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.
31 mai 2007 à 17:36
Merci
31 mai 2007 à 14:51
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 !!
30 mai 2007 à 10:55
30 mai 2007 à 10:25
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++.
30 mai 2007 à 08:33
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.
29 mai 2007 à 17:02
29 mai 2007 à 15:24
29 mai 2007 à 09:27
25 mai 2007 à 17:10
25 mai 2007 à 10:03
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
23 mai 2007 à 11:57
23 mai 2007 à 11:14
23 mai 2007 à 10:32
22 mai 2007 à 19:29
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"
22 mai 2007 à 16:05
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!!
22 mai 2007 à 13:58
22 mai 2007 à 13:14
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à.
22 mai 2007 à 10:37
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!!!!!!
13 mai 2007 à 15:03
13 mai 2007 à 01:14
12 mai 2007 à 11:42
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.
11 mai 2007 à 17:20
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
10 mai 2007 à 14:39
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!!!!
3 mai 2007 à 09:15
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.
2 mai 2007 à 17:45
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.
14 mars 2007 à 18:10
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.
13 févr. 2007 à 09:40
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!
29 janv. 2007 à 17:30
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.
26 déc. 2006 à 15:26
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.
25 déc. 2006 à 21:06
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 !!!
3 août 2006 à 18:33
3 août 2006 à 18:30
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...
3 août 2006 à 15:55
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
9 janv. 2006 à 07:53
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.
7 janv. 2006 à 19:15
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+
7 janv. 2006 à 01:07
Vos commentaires et remarques sont les bienvenues.