C++ - lire un ton généré à partir d'une onde sinusoïdale
Salut tout le monde, je suis en train d'essayer de comprendre comment lire un ton que j'ai généré à l'aide d'une onde sinusoïdale.
Voici mon code:
#include <iostream>
#include <OpenAL/al.h>
#include <OpenAL/alc.h>
#include <Math.h>
using namespace std;
int main (int argc, char * const argv[]) {
int number = 0;
int i, size;
double const Pi=4*atan(1);
cout << "Enter number of seconds:" << endl;
scanf("%d", &number);
size = 44100*number;
unsigned char buffer [size]; //buffer array
for(i = 0; i < size; i++){
buffer[i] = (char)sin((2*Pi*440)/(44100*i))*127;
}
return 0;
}
Évidemment, il ne fait rien pour le moment, puisque je n'ai aucune idée de comment jouer le tampon.
Je ne veux pas générer un fichier wav, je ne veux charger un. Je veux juste jouer le tampon que j'ai généré.
Je suis actuellement en train de travailler sur Mac OS X, et ont essayé d'utiliser OpenAL méthodes - toutefois, j'ai constaté que alut et alu ne sont pas une partie de plus et si j'essaie de l'utiliser, alors il s'avère que c'est tous les pillèrent toute façon.
J'ai aussi essayé d'inclure QAudioOutput, mais pour quelque raison il ne semble pas être n'importe où sur mon Mac.
Je veux juste une simple lecture de la tonalité, j'ai créé. Quelqu'un aurait-il tout ce qu'ils peuvent m'indiquer?
Tas merci!!!
OriginalL'auteur Moonlight293 | 2011-03-29
Vous devez vous connecter pour publier un commentaire.
J'ai écrit un exemple exactement pour cela. Fonctionne très bien avec OpenAL sous MacOSX et joue lisse seins. Jetez un oeil ici:
http://ioctl.eu/blog/2011/03/16/openal-sine-synth/
Code est assez court, je suppose que je peux l'ajouter ici un souci d'exhaustivité:
Mise à jour: j'ai trouvé OpenAL un peu trop limitatif pour mes besoins, comme j'ai quelques problèmes avec faible latence de lecture, comme cela semble être le principal domaine d'OpenAL. Au lieu de cela, je l'ai trouvé très convaincant PortAudio: http://www.portaudio.com/
Il prend en charge toutes les principales plates-formes (Mac,Win,Unix/ALSA) et semble très bien. Il est un exemple pour le sinus de la lecture qui est beaucoup plus sophistiquée, mais très simple. Il suffit de télécharger la dernière version et trouver le sine-la lecture de l'échantillon à tester/patest_sine.c
Juste une petite question - qu'est-ce que le 32760 pour lors de la prise des échantillons? Tas merci!
le format audio est MONO16, c'est à dire à 16 bits par échantillon. sine généré est float, donc de -1 à 1. De la carte à 16 bits, c'est à dire à partir de -32767 à 32768, je multiplie ce nombre. Un peu moins..uhm..paresse
Pour moi
#include <AL/alut.h>
œuvres au lieu de#include <OpenAL/al.h>
. probablement votre code est obsolète,aussi au lieu de
sleep
fonction, vous devez utiliseralutSleep
.sleep
peut ne pas fonctionner dans certains OS.OriginalL'auteur zerm
Vous aurez besoin de passer par le système d'exploitation pour lire des sons. Ce n'est pas aussi simple que vous ne le pensez. Dans OSX, vous aurez besoin de passer par CoreAudio.
Une meilleure approche serait d'utiliser un wrapper de la bibliothèque comme PortAudio (http://www.portaudio.com/) qui permet de rendre votre code plus portable et vous faire économiser de l'réutilisable nécessaires pour obtenir le son de votre programme.
OriginalL'auteur Jean-Marc Pelletier
Essayez ceci (ce programme utilise La transformée en Z concept, un exemple complet qui génère des tonalités dtmf avec ALSA et compilable sous LINUX sont disponibles ici):
Cette version tout simplement de générer les valeurs, pour plein DTMF suivez le lien sur la description.
OriginalL'auteur Elvis Rock Code