Existe-t-il une bibliothèque de sons pour que C génère des échantillons sonores à partir du code? [fermé]


10

Je travaille sur un moteur pour un jeu de style rétro en C. Je cherche une bibliothèque de sons qui produirait des sons de puce à partir de code ... Je veux créer mon propre tracker de chiptune simple pour que le moteur crée de la musique. Une telle chose existe-t-elle?

Je serais également intéressé par une bibliothèque pour utiliser les fichiers .nsf dans mon projet.

J'utilise Linux pour le développement.


Je pense que cette question relève de la catégorie "Quelle technologie utiliser". Bien que ces demandes de niche ne génèrent généralement pas une grande liste de réponses, je pense que ce n'est pas constructif.
MichaelHouse

Eh bien, le problème est que je n'arrive pas à trouver quoi que ce soit. Je ne sais même pas par où commencer ... Chaque bibliothèque que j'ai trouvée se concentre sur le chargement à partir de fichiers tels que .wav. Je peux utiliser libmikmod si je veux simplement charger un module .mod ou .xm, mais ce n'est pas ce que je veux faire.
rzrscm

Je ne pense pas que cela relève vraiment du développement du jeu. Ce sont des médias plus généraux que des jeux.
PixelArtDragon

Essayez de rechercher "mod tracker" ou peut-être "demoscene tracker" pour un contexte plus général et des ressources.
Patrick Hughes

1
Personnellement, je trouve que cette question est une bonne question. Comme j'aime programmer des jeux de style rétro, il est difficile de trouver des ressources pour des choses comme ça sans faire partie d'une communauté obscure.
Zack The Human

Réponses:


3

Probablement pas une bonne réponse mais voici une bibliothèque de différents moteurs audio

(Faites défiler jusqu'au deuxième segment pour les bibliothèques audio)

Au moins 9 moteurs sur 12 sont compatibles avec C. La plupart d'entre eux prennent également en charge les fichiers de suivi. Ce qui n'est pas si différent des fichiers nsf (je suppose que ce sont des fichiers de musique NES).


16

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:

  1. Modulation d'amplitude : modification de l'amplitude de l'onde à travers le tampon
  2. Modulation de fréquence : modification de la fréquence de l'onde à travers le tampon
  3. Reverb : répétition d'un échantillon en changeant sa forme et sa position dans le tampon. C'est un sujet très complexe.
  4. 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.


+1 pour lancer le vôtre. Je ne vois pas beaucoup de bibliothèques Linux qui prendraient en charge NSF. Mais, voici les spécifications: webcache.googleusercontent.com/...
michael.bartnett

Merci pour l'info. Je pourrais continuer à créer des fichiers .nsf pour mon projet maintenant que je me rends compte de tout ce que je devrais mettre pour que les sons sonnent juste.
rzrscm

+1 J'ai supposé que toute réponse à cette question serait fastidieuse. Je ne connais pas grand-chose à AM / FM mais généralement les ondes seront d'abord acheminées vers un filtre, comme dans la synthèse soustractive. De plus, votre exemple de plusieurs notes de piano est correct, un meilleur exemple serait juste une note! Une seule note de piano créera plusieurs harmoniques qui lui donneront son timbre. Un piano créera> 5 vagues additionnées, alors que dans la plupart des synthés, 2 ou 3 conviendront.
Tony

quelle est la bonne façon de vérifier les débordements dans la fonction "add_sine_wave"?
eadmaster

@eadmaster: Je voulais dire l'écrêtage. Assurez-vous que la valeur correspond à a shortavant de la convertir en a short.
Panda Pyjama

4

Pour les effets sonores chiptune, il y a une réponse définitive: sfxr .

Il s'agit d'une application autonome que vous pouvez utiliser pour générer des exemples, mais le code source est également disponible si vous souhaitez l'intégrer à votre code.


3

Je peux personnellement recommander les bibliothèques audio de Blargg . Quelque chose qui pourrait vous intéresser particulièrement est son Blip_Buffer .

Le site de Blargg a plusieurs synthétiseurs audio "rétro", et j'utilise activement son Game_Music_Emu pour lire des fichiers NSF dans un clone Mega Man que j'écris.

De nombreuses bibliothèques sont écrites en C ++ mais certaines fournissent également une interface C.


Je vais certainement en essayer quelques-uns ... Ils pourraient être exactement ce que je recherche car je travaille sur un moteur de jeu qui est destiné à imiter l'apparence d'un jeu NES.
rzrscm
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.