Bonjour à tous et à toutes,
J'ai pour objectif de récupérer, sous forme de graphique sur Excel, un signal audio contenu dans un fichier audio décompressé WAVE (.wav). Après quelques recherches, j'ai compris que le fichier WAVE était composé de deux parties : l'entête codée sur 44 octets, et le reste du fichier contenant les fameuses données qui composent le signal audio.
L'idée c'est de récupérer les différents échantillons qui composent le signal audio et de les stocker dans un tableau à deux entrées : l'amplitude du signal (indiqué par les différents échantillons qui le composent) et une échelle de temps (dépendant de la fréquence d'échantillonnage utilisée et de la durée totale du fichier audio)
Afin de pouvoir "découper" correctement la suite d'octets qui correspond aux données, il me faut quelques informations sur celle-ci en allant piocher dans l'entête. Je veux ainsi récupérer, entre autres, la fréquence d'échantillonnage du signal audio et savoir sur combien de bits chaque échantillon est codé.
Vous trouverez de plus amples informations sur le format WAVE sur Wikipédia, à l'adresse suivante : https://fr.wikipedia.org/wiki/WAVEform_audio_format .
J'ai alors commencé à coder mon projet. Voici la première partie de mon code, contenue dans un module nommé "mdlControl" :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51 'Commençons par un Type regroupant chaque partie de l'entête qui nous intéresse... Public Const taille_entete As Integer = 44 Public i As Long Public Type t_entete DataSize As Long NbreCanaux As Integer BitsPerSample As Integer BytePerSec As Long Frequence As Long vide As Byte End Type 'Une fois le type défini, on peut tirer toutes les informations nécessaires du fichier WAVE qu'on utilise... Public Sub DonneesEntete(ByRef entete As t_entete, ByVal fichier As String) Dim canal As Integer canal = FreeFile() Open fichier For Random As canal For i = 1 To 22 Get canal, , entete.vide Next i Get canal, , entete.NbreCanaux Get canal, , entete.Frequence Get canal, , entete.BytePerSec For i = 1 To 2 Get canal, , entete.vide Next i Get canal, , entete.BitsPerSample For i = 1 To 4 Get canal, , entete.vide Next i Get canal, , entete.DataSize Close canal End Sub
L'idée derrière ce code, c'est de récupérer une à une chaque variable intéressante apparaissant dans l'entête du fichier, connaissant sa structure (cf. lien ci-dessus)
Cette procédure est placée dans un module, je me place ensuite dans une Form nommée "frmCommandes" pour l'appeler dans une procédure événementielle :
Et... c'est là que ça coince ! Il se trouve que toutes les cellules servant de vérification me renvoient la valeur 0. Je ne pense pourtant pas m'être trompé de type pour chaque variable. Ce qui est encore plus étrange, c'est que lorsque je lance mon programme en "pas à pas détaillé" et que je place un espion sur la variable entete.vide (qui me sert à passer sur les données qui ne m'intéressent pas) , autant la première valeur que contient cette variable (dans mon cas) m'affiche 82, autant toutes celles qui suivent affichent la valeur 0.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25 'On clique sur le bouton de commande : Public Sub cmdRecupEntete_click() Dim fichier As String Dim entete As t_entete Dim Repertoire As String Repertoire = "C:\Users\Sideway\Desktop\" fichier = Repertoire & "test.wav" Call mdlControl.DonneesEntete(entete, fichier) 'Les lignes ci-dessous servent juste à vérifier que j'ai récupéré les bonnes variables. frmCommandes.Cells(1, 1) = fichier frmCommandes.Cells(2, 1) = entete.DataSize frmCommandes.Cells(3.1) = entete.BytePerSec frmCommandes.Cells(4, 1) = entete.NbreCanaux frmCommandes.Cells(5, 1) = entete.BitsPerSample frmCommandes.Cells(6, 1) = entete.Frequence End Sub
Voilà, je vous ai exposé mon problème; j'espère que vous saurez m'aider à le résoudre ! Merci beaucoup de votre attention, et du temps que vous m'accordez.
Sideway.
Partager