Générer du bruit - théorie
La prochaine chose que je veux faire est de générer certain son. Mais d'abord je dois savoir dans quel genre de format le son devrait être. Nous savons (de notre expérimentation avec le simple) comment diriger l'audio vers notre port de sortie, mais parce que nous avons seulement copié notre entrée, nous n'avons aucune idée quel format c'était.
Avant d'allez plus loin, quelques rapels sur le stockage de l'audio numérique.
Echantillons
Pour comprendre le taux d'échantillonnage, nous devons savoir ce qu'est un échantillon. C'est trés simple. Un échantillon est une valeur simple représentant la valeur de la forme d'onde audio à un point donné. Un échantillon individuel est la plus petite unité qui peut être obtenu quand on sépare notre signal audio.
Taux d'échantillonage
C'est tout simplement le nombre d'échantillons par seconde. Ainsi un taux d'échantillon de 48000 échantillons par seconde signifie qu'une seconde du signal audio se compose de 48000 échantillons. Ceci est considéré comme la résolution "standard" de l'audio.
Supposons pendant un moment que nos échantillons sont juste des bytes signés, c'est à dire un simple échantillon qui peut avoir une valeur comprise entre -127 et +128. Si notre taux d'échantillonnage est par exemple 100 échantillons par seconde, une seconde d'audio se compose de 100 bytes. Par exemple, une onde carrée avec une fréquence de 1 cycle par seconde serait représentée de 50 bytes avec la valeur 128 suivie de 50 bytes avec la valeur -127. 1Hz (1 cycle par seconde) exige 100 échantillons par cycle pour 100 échantillons par seconde d'audio.
Si nous utilisons "s" pour représenter notre taux d'échantillonnage, "h" pour représenter la fréquence de notre signal désiré, et "spc" pour échantillon-par-cycle, nous pouvons écrire :
spc=s/h
Donc suivant le dernier exmeple (1Hz), un signal de 2Hz devrait utiliser la moitié d'échantillons par cycle.
spc=100/2 spc=50
Notez que le nombre d'échantillons par cycle dépend du taux d'échantillonnage, et rappelez-vous que JACK appelle nos callback quand le taux d'échantillonnage change.
Autre chose que nous devrons aborder est le taux Nyquist. Les sons avec des fréquences correspond à la moitié du taux d'échantillonnage ou plus sonneront bizarrement. Une discussion poussé de la fréquence Nyquist est au delà de la portée de cet article, mais il y a d'abondance d'information sur internet. Essayez la théorie d'échantillonage 101 (Sampling Theory 101) si vous voulez vraiment en savoir plus.
Nous avons vu la résolution horizontale du son, maintenant passons à la résolution verticale. Nos exemples précédents ont utilisé un simple byte pour stocker un échantillon, donc 256 valeurs possibles par échantillon.
Imaginez la différence entre une image de 16 couleurs, et une image utilisant la couleur 16 bits.regardez les images ci-dessous. La différence est que chaque Pixel peut être l'une de 65536 (la valeur la plus élevée dans un nombre de bits 16) couleurs, et ainsi nous pouvons nous déplacer sans à-coup d'une couleur à l'autre.
16 bits

16 couleurs

Et c'est exactement la même chose avec l'audio. 8bit audio a une gamme beaucoup inférieure de valeurs possibles pour chaque échantillon que 16bit audio.
Un exemple
Les CD, les disques qui stockent l'audio ou les données. Mais quel est le format audio utilisé ? La réponse est 16 bit stéréo échantilloné à 44.1kHz. Sachant qu'un CD peut tenir 74 minutes d'audio, en général, soit 4440 secondes. Il y a 44100 échantillons pour chaque seconde d'audio, soit 4440*44100=195804000 échantillons au total.
Chaque échantillon est de 16 bits, ou 2 bytes. le nombre total de bytes utilisés est 195804000*2=391608000. Il y a 1024 bytes dans 1 kilobyte, soit 391608000/1024=382430KB, et il y a 1024 kilobyte dans un megabyte, 382430/1024=373MB. N'oubliez pas que c'est stéréo, ainsi nous avons deux canaux. 373*2=746MB
Vous allez me dire que je n'ai que 650MB sur des CDR de 74 minute. C'est vrai, mais un CD audio a beaucoup moins de correction d'erreurs qu'un CD de données. S'il y a des problèmes en lisant un CD audio, le player peut interpoler. Ainsi, l'espace "manquant" est utilisé pour la correction d'erreurs.
Echantillons et frames
Vous avez probablement noté que je continue à parler des échantillons, mais JACK parle de frames. Il y a une différence. Jetez un coup d'oeil au tutorial du capture client de JACK pour une bonne description de la différence (page 3, section 3.3).
http://userpages.umbc.edu/~berman3/
Voici une courte explication : les frames sont des collections d'échantillons, un pour chaque canal. Ainsi, la stéréo a deux canaux et ainsi chaque frames aura deux échantillons. Mais ne vous inquiétez pas à ce sujet encore. Nous pouvons connecter le haut-parleur gauche et droit, mais vu que nous générons seulement le même signal mono à chacun, les frames et les échantillons sont identiques.
Générer du son
Nous savons que le taux d'échantillonnage pour JACK est variable et nous avons vu comment traiter cela. Bien, en regardant le code source de l'exemple métronome, nous pouvons voir que les différents échantillons sont de type "sample_t". Dans la partie haute du code, nous pouvons voir que c'est juste un typdef utilisant jack_default_audio_sample_t.
La documentation sur jack_default_audio_sample_t prouve que typdef est également un flottant. Ainsi, nous avons des échantillons représentés en tant que nombre flottant. C'est pratique, parce que la plupart des fonctions mathématiques dont on pourrait avoir besoin (sin, par exemple) renvoie des nombres flottants. Comment cela se réalise en terme de bits-par-échantillon ? regardons.
Le code ci-dessous vous montrera la taille des nombres flottants.
#include < stdio.h >
int main(){
printf("floats are %d bytes.\n",sizeof(float));
return 0;
}
Sur mon système, la compilation et l'exécution donne ceci :
$gcc -o floatsize floatsize.c $./floatsize floats are 4 bytes.
Ainsi, j'ai 4 bytes par échantillon, soit 32 bits.