Bien sûr que vous pouvez, ce n'est tout simplement pas trivial de le faire sonner "bien".
Je ne sais pas comment le faire sous Linux, mais si vous pouvez jouer un tampon PCM, tout ce que vous avez à faire est de le remplir avec ce que vous voulez.
Donc, en supposant que votre tampon soit configuré pour jouer dans des échantillons monauraux 16 bits signés, à 44100 échantillons par seconde, la création d'un son A4 pur (sinusoïdal) (440 Hz) est aussi simple que
int16_t buffer[44100];
float frequency = 440.0f;
float sampling_ratio = 44100.0f;
float amplitude = 0.5f;
float t;
for (int i = 0; i < 44100; i++)
{
float theta = ((float)i / sampling_ratio) * PI;
buffer[i] = (int16_t)(sin(theta * frequency) * 32767.0f * amplitude);
}
Cependant, ce son est probablement très ennuyeux pour vos intérêts, vous devez donc faire des choses plus compliquées. En général, il existe deux types de synthèse sonore: additive et soustractive . Il y en a beaucoup d'autres, mais ces deux sont probablement les plus simples. Aujourd'hui, je vais juste parler de la synthèse additive.
Pour la synthèse additive, vous faites la même chose que je viens de faire là-haut, mais au lieu d'utiliser simplement une fréquence à une amplitude, vous ajoutez plusieurs ondes ensemble. Cela revient à appuyer sur plusieurs touches d'un piano en même temps. Vous modifiez donc votre code pour qu'il ressemble à ceci:
void add_sine_wave(int16_t* buffer, int buffer_length, float frequency, float sampling_ratio, float amplitude)
{
for (int i = 0; i < buffer_length; i++)
{
float theta = ((float)i / sampling_ratio) * M_PI;
// make sure to correct for overflows and underflows
buffer[i] += (int16_t)(sin(theta * frequency) * 32767.0f * amplitude);
}
}
puis utilisez-le comme ceci:
int16_t buffer[44100];
memset(buffer, 0, sizeof(buffer));
// Create an A Major chord
add_sine_wave(buffer, 44100, 440.0f, 44100.0f, 0.5f);
add_sine_wave(buffer, 44100, 554.37f, 44100.0f, 0.5f);
add_sine_wave(buffer, 44100, 659.26f, 44100.0f, 0.5f);
Soit dit en passant, je reçois mes fréquences d' ici (j'utilise un tempérament égal , mais il y a beaucoup d' autres réglages disponibles).
Notez que jusqu'à présent , je ne l' ai été en utilisant des ondes sinusoïdales, mais vieux synthétiseurs soutiens également carrés , triangulaires et scie vagues ainsi, chacun avec ses propres propriétés sonores intéressantes. Leur mise en œuvre est assez simple.
Vous pouvez également augmenter la variété de sons que vous pouvez créer:
- Modulation d'amplitude : modification de l'amplitude de l'onde à travers le tampon
- Modulation de fréquence : modification de la fréquence de l'onde à travers le tampon
- Reverb : répétition d'un échantillon en changeant sa forme et sa position dans le tampon. C'est un sujet très complexe.
- Envelopping : Changer l'amplitude d'un échantillon pour lui donner plus de vie
Le point ici est que les techniques elles-mêmes ne sont pas très difficiles, vous n'avez donc pas vraiment besoin d'une bibliothèque pour les résumer pour vous. C'est de les utiliser pour créer des sons intéressants ce qui est difficile.
Une dernière note. Lorsque vous expérimentez un son comme celui-ci, il peut être très utile d'enregistrer vos données dans des fichiers WAV, puis de les visualiser dans certains logiciels comme Audacity. De cette façon, vous pouvez voir plus clairement ce que vous faites.