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.