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

Auteur Sujet: Mixer plusieurs SoundBuffer  (Lu 1951 fois)

0 Membres et 1 Invité sur ce sujet

voidcome

  • Newbie
  • *
  • Messages: 3
    • Voir le profil
Mixer plusieurs SoundBuffer
« le: Juin 21, 2014, 12:46:15 pm »
Bonjour,

Je développe actuellement un petit logiciel d'édition de fichiers audio, et je souhaite réaliser quelques traitements audio. Vu que j'ai plusieurs questions "différentes", j'ai créé plusieurs sujets afin de séparer les questions et rendre le tout plus clair pour le forum ainsi que pour les prochains qui feront des recherches; j'espère que ce n'est pas gênant.


Une de ces fonctions, plus complexe, consiste à mixer deux (ou plus) fichiers audios différents. J'ai essayé dans un premier temps des fichiers ayant le même BitRate car c'est plus simple. Dans l'idée, je parcours tous ces buffers, je fais une addition de chaque sample suivi d'une division par le nombre de buffer. Le code est ci-dessous et après quelques tests, ça semble fonctionner.

Première question : Qu'en pensez-vous ? Est-ce que ce code est correct, ou est-ce qu'il y a un petit truc qui m'a échappé ?



    sf::SoundBuffer bufferOne;
    sf::SoundBuffer bufferTwo;

    if (!bufferOne.loadFromFile("Jigsaw 48000.wav"))
    {
        std::cout << "Error one.wav" << std::endl;
        return 1;
    }

    if (!bufferTwo.loadFromFile("paintball 48000.wav"))
    {
        std::cout << "Error two.wav" << std::endl;
        return 1;
    }



    int const channelCount = bufferOne.getChannelCount();
    int const sampleRate = bufferOne.getSampleRate();

    int const oneLength = bufferOne.getSampleCount();
    int const twoLength = bufferTwo.getSampleCount();
    int const maxLength = max(oneLength, twoLength);

    sf::Int16 const * oneSamples = bufferOne.getSamples();
    sf::Int16 const * twoSamples = bufferTwo.getSamples();

    std::vector<sf::Int16> mixedSamplesVector;
    mixedSamplesVector.reserve(maxLength);

    int numberOfBuffers;
    sf::Int16 currentSample;

    for (int i = 0; i < maxLength; i++)
    {
        numberOfBuffers = 0;
        currentSample = 0; // Est-ce une bonne valeur de d'initialisation ?

        if (i < oneLength)
        {
            numberOfBuffers++;
            currentSample += oneSamples[i];
        }

        if (i < twoLength)
        {
            numberOfBuffers++;
            currentSample += twoSamples[i];
        }

        currentSample = currentSample / numberOfBuffers;

        mixedSamplesVector.push_back(currentSample);
    }


    sf::SoundBuffer mixedBuffer;
    mixedBuffer.loadFromSamples(&mixedSamplesVector[0], mixedSamplesVector.size(), channelCount, sampleRate);
    mixedBuffer.saveToFile("mixed.wav");

 



Seconde question : Pour mixer avec des sampleRate différents, je ne vois pas vraiment comment m'y prendre, surtout que je n'ai quasiment pas de connaissance dans le traitement audio. Je pense qu'il faudrait convertir tous les buffer dans le même sampleRate et ensuite faire ce mix... mais comment les convertir ?

Est-ce que vous connaissez une petite classe ou librairie qui pourrait me faire ça ?


Merci.

Laurent

  • Administrator
  • Hero Member
  • *****
  • Messages: 32498
    • Voir le profil
    • SFML's website
    • E-mail
Re : Mixer plusieurs SoundBuffer
« Réponse #1 le: Juin 21, 2014, 02:44:17 pm »
Là il te faut clairement soit des connaissances (via quelques recherches) en traitement audio, soit une bibliothèque adaptée. SFML n'est focalisée que sur la lecture.
Laurent Gomila - SFML developer