Bienvenue, Invité. Merci de vous connecter ou de vous inscrire. Avez-vous oublié d'activer ?

Voir les contributions

Cette section vous permet de consulter les contributions (messages, sujets et fichiers joints) d'un utilisateur. Vous ne pourrez voir que les contributions des zones auxquelles vous avez accès.


Messages - voidcome

Pages: [1]
1
Audio / Faire des copier/coller sur un morceau de SoundBuffer
« le: Juin 21, 2014, 03:16:55 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.


Je souhaite faire des petites fonctions d’édition du genre copier un morceau (de 00m05s à 00m10s) d'un buffer A et ensuite le coller dans un buffer B à 00m17s. Je vais donc utiliser des SoundBuffer afin d'accéder aux samples.

Note : je ne sais pas du tout comment gérer des SampleRate différent pour le moment, donc je suppose avori deux fichiers avec le même SampleRate.


Première question : Pour être sûr d'avoir compris, le nombre de sample correspondant à une seconde est relatif au SampleRate. Donc, pour avoir un morceau entre 00m05s et 00m10s, avec un SampleRate de 44100, je dois parcourir le buffer entre l'offset (5 * 44100) et (10 * 44100) ?

Seconde question : Quelle valeur mettre dans les samples pour faire du vide ? Zéro ?
Par exemple, si je colle mon morceau copié après la fin d'un son, il faut que je remplisse le blanc qu'il y a entre les deux... mais avec quelle valeur pour sf::Int16 ?


Merci.



2
Audio / Modifier le son et la vitesse sur le soundbuffer
« le: Juin 21, 2014, 02:29:48 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 des fonctions "basiques" que je souhaite mettre en place est la possibilité de modifier le son et la vitesse d'une musique chargée. J'ai vu qu'il y avait des méthodes pour modifier ces valeurs dans la classe Sound mais le problème, c'est que le buffer n'est pas affecté : je ne peux donc pas sauvegarder le buffer qui contiendra ces changements.

J'ai essayé de fouiller un peu dans toutes les classes, mais j'ai l'impression qu'on ne peut pas enregistrer le buffer avec une modification de son et/ou de vitesse.

Du coup, est-ce que j'ai zappé une fonction ? Si non, comment est-ce qu'on peut s'y prendre ?


Merci.

3
Audio / 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.

Pages: [1]