Bienvenue, Invité. Merci de vous connecter ou de vous inscrire.
Avez-vous perdu votre e-mail d'activation ?

Auteur Sujet: Génération d'un signal audio sinusoïdal variable  (Lu 2367 fois)

0 Membres et 3 Invités sur ce sujet

Ember

  • Newbie
  • *
  • Messages: 3
    • Voir le profil
Génération d'un signal audio sinusoïdal variable
« le: Août 30, 2013, 11:59:50 pm »
Coucou  8)

Tout d'abord merci beaucoup au créateur de la lib pour cette merveilleuse lib 2D  ;D

Depuis 2-3 jours, j'essaye de bidouiller le sample permettant de générer un signal sinusoïdal : https://github.com/SFML/SFML/wiki/Tutorial%3A-Play-Sine-Wave

En faite, je voudrais créer un programme où on peut faire varier en temps réel le signal généré. Le sample permet juste de créer un buffer contenant le signal fixé à une certaine fréquence qui est lu en boucle. L'idée serait donc de générer un buffer en temps réel et de l'envoyer à la carte son. Le truc c'est que j'ai pas mal bidouillé le sample, et à chaque fois ça donne des sons étranges et le programme plante. Quelqu'un sait comment faire? Parce que là je suis complètement perdu.

Merci :)
« Modifié: Septembre 01, 2013, 01:58:50 am par Ember »

G.

  • Hero Member
  • *****
  • Messages: 1592
    • Voir le profil
Re : Génération d'un signal audio sinusoïdal variable
« Réponse #1 le: Août 31, 2013, 05:07:34 am »
Perso j'avais rien trouvé de mieux que de faire un nouveau sf::SoundBuffer et puis un sf::Sound::setBuffer avec.
Au départ je pensais qu'en chargeant les nouveaux samples dans le même SoundBuffer j'entendrais le nouveau son, mais non. Si je veux utiliser le même SoundBuffer il fallait que je fasse un buffer = sf::SoundBuffer(); (pourquoi ???) avant de load les nouveaux samples (et de refaire un setBuffer ? je ne sais plus) et de relancer le son sinon il ne se passait rien.
Bon ensuite j'avais pas cherché plus que ça quoi, et j'y connaissais pas grand chose. Ça a l'air chelou tout ça, je ne sais pas quelle est la vraie bonne méthode. :D
Voilà mon code de départ de l'époque:
#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>

int main()
{
        sf::RenderWindow win(sf::VideoMode(400, 300), "", sf::Style::Default);

        const unsigned int samples = 44100 * 0.5;
        const unsigned int sampleRate = 44100;
        sf::Int16 raw[samples];
        sf::SoundBuffer buffer[2];
        sf::Sound sound;
        int currentBuffer = 0;

        unsigned int AMPLITUDE = 28000;
        const double TWO_PI = 6.28318;

        double frequency = 440;
        double increment = frequency / sampleRate;
        double pos = 0;
        for (unsigned int i = 0; i < samples; ++i) {
                raw[i] = AMPLITUDE * sin(pos * TWO_PI);
                pos += increment;
        }
        if (!buffer[currentBuffer].loadFromSamples(raw, samples, 1, sampleRate)) {
                return 1;
        }
        sound.setBuffer(buffer[currentBuffer]);
        sound.setLoop(true);
        sound.play();

        bool newFrequency = false;

        while (win.isOpen()) {
                newFrequency = false;
                sf::Event event;
                while (win.pollEvent(event)) {
                        if (event.type == sf::Event::Closed) {
                                win.close();
                        }
                        if (event.type == sf::Event::KeyReleased) {
                                if (event.key.code == sf::Keyboard::Escape) {
                                        win.close();
                                }
                                if (event.key.code == sf::Keyboard::Left || event.key.code == sf::Keyboard::H) {
                                        newFrequency = true;
                                        frequency -= 25;
                                }
                                if (event.key.code == sf::Keyboard::Right || event.key.code == sf::Keyboard::J) {
                                        newFrequency = true;
                                        frequency += 25;
                                }
                        }
                }
                if (newFrequency) {
                        currentBuffer = (currentBuffer + 1) % 2;
                        increment = frequency / sampleRate;
                        pos = 0;
                        for (unsigned int i = 0; i < samples; ++i) {
                                raw[i] = AMPLITUDE * sin(pos * TWO_PI);
                                pos += increment;
                        }
                        if (!buffer[currentBuffer].loadFromSamples(raw, samples, 1, sampleRate)) {
                                return 1;
                        }
                        sound.setBuffer(buffer[currentBuffer]);
                        sound.play();
                }

                win.clear();
                win.display();
        }

        return 0;
}

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Génération d'un signal audio sinusoïdal variable
« Réponse #2 le: Août 31, 2013, 11:21:44 am »
Générer le son en temps réel -> sf::SoundStream. Je te laisse voir avec le tuto qui va bien ;)
Laurent Gomila - SFML developer

Ember

  • Newbie
  • *
  • Messages: 3
    • Voir le profil
Re : Génération d'un signal audio sinusoïdal variable
« Réponse #3 le: Août 31, 2013, 11:28:08 am »
G. --> J'avais plus ou moins essayé cette méthode de générer un buffer, mais quand on change de fréquence, on obtient ceci :

Laurent --> Je vais essayer  ;D Je mettrai mon code quand ce sera terminé

Ember

  • Newbie
  • *
  • Messages: 3
    • Voir le profil
Re : Génération d'un signal audio sinusoïdal variable
« Réponse #4 le: Septembre 01, 2013, 02:20:10 am »
Alors j'ai un peu avancé, finalement je pense que je ne vais pas générer un signal en temps direct. Avec la fonction pitch, on peut choisir directement la valeur qu'on veut. Par contre je voulais savoir si c'est normal qu'on ne puisse pas dépasser la valeur 8 ?

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32504
    • Voir le profil
    • SFML's website
    • E-mail
Re : Génération d'un signal audio sinusoïdal variable
« Réponse #5 le: Septembre 01, 2013, 08:47:20 am »
Attention : changer le pitch modifie aussi la vitesse de lecture.

Citer
Par contre je voulais savoir si c'est normal qu'on ne puisse pas dépasser la valeur 8 ?
Je ne sais pas trop. Les spécifications d'OpenAL ne donnent pas de valeur max pour ce paramètre.
Laurent Gomila - SFML developer

 

anything