
Envoyé par
msdaath
Par contre je ne comprends toujours vraiment à quoi sert le getByteFrequencyData malgrés la doc, enfin surtout j'ai l'impression de l'utiliser pour rien là ?
Dans le but d'utiliser le moins de mémoire possible, getByteFrequencyData ne crée pas un tableau à 1024 entrées à chaque fois que tu l'appelles. C'est à toi de lui dire dans quel tableau tu veux qu'il mette les données. Ainsi, quand tu exécutes l'instruction analyser.getByteFrequencyData(FFTData), l'analyseur met ses données dans FFTData.
Une autre question que je me pose, pourquoi les valeurs mettent elles du temps à descendre à 0 ? (c'est à dire que même lorsque la musique ne joue plus, les valeurs ne baissent pas brutalement.
Une partie de la réponse se trouve ici. L'analyseur a une propriété smoothingTimeConstant égale à 0.8 par défaut et qui est une sorte de « facteur d'amortissement » qui fait que les valeurs mettent un certain temps à changer.
Et en petite précision, y a t'il toujours au moins 1024 valeurs ? les valeurs >20 n'ont pas vraiment de sens, ne serait t'il pas plus exacte d'ajouter un if(array[i]>=20) dans le while de ma fonction getMoyenne ?
Là c'est une histoire de jugement personnel… Et de maths ! En effet, la décomposition d'un signal sonore se fait par une transformée de Fourier (c'est un procédé mathématique qui permet de séparer les fréquences pures dans un signal complexe), et l'API html5 utilise une implémentation connue de ce procédé, qui s'appelle Fast Fourier Transform (d'où les initiales FFT). On demande à cet algorithme une certaine résolution, la « taille » de la transformée, qui détermine le nombre de bandes de fréquences dans le résultat. Cette taille est la propriété fftSize de l'analyseur, qui est 2048 par défaut. Pour une raison qui m'échappe un peu je l'avoue, la taille du tableau doit être égale à la moitié de fftSize.
Demander une plus grande taille donnera des résultats plus précis mais prendra plus de temps de calcul. À l'inverse, avec une fftSize plus petite, l'algo sera plus rapide mais moins précis.
Tu peux tout à fait filtrer les valeurs inférieures à 20, mais ce sera peut-être plus utile pour toi de jouer sur les propriétés minDecibels et maxDecibels de l'analyseur. N'hésite pas à faire des tests !
Encore une fois il n'est pas garanti que le code soit dépourvu de lignes aberrantes !
Le seul truc un peu gênant c'est les chaînes passées à setTimeout. Passe directement tes fonctions, c'est plus propre :
window.setTimeout(printHz, 500);
Partager