Bon ben comme je le disais, j'ai trouvé une méthode mais elle ne fonctionne pas à 100%, le son sature dans les niveaux élevés.
voici mon programme en C :
Code :
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <math.h>
- int main(int argc,char *argv[]) {
- char mixname[255];
- FILE *pcm1, *pcm2, *mix;
- char sample1, sample2;
- int value;
- pcm1 = fopen(argv[1],"r" );
- pcm2 = fopen(argv[2],"r" );
- strcpy (mixname, argv[1]);
- strcat (mixname, "_temp.wav" );
- mix = fopen(mixname, "w" );
- while(!feof(pcm1)) {
- sample1 = fgetc(pcm1);
- sample2 = fgetc(pcm2);
-
- if ((sample1 < 0) && (sample2 < 0)) {
- value = sample1 + sample2 - (sample1 * sample2 / -(pow(2,16-1)-1));
- }else{
- value = sample1 + sample2 - (sample1 * sample2 / (pow(2,16-1)-1));
- }
- fputc(value, mix);
- }
- fclose(pcm1);
- fclose(pcm2);
- fclose(mix);
- return 0;
- }
|
il fonctionne de la façon suivante :
Code :
- ./audiomix son1.wav son2.wav
|
son1.wav et son2.wav sont des sons en raw PCM 16bits décompressés à partir de .mp3 par lame avec la commande suivante:
Code :
- lame --decode -t son1.mp3
|
il génère ensuite un fichier son1.wav_temp.wav (le nom à la con) qui est le mix des 2 sources que je recomprsse ensuite avec lame de la façon suivante :
Code :
- lame -s 44.1 s son1.wav_temp.wav
|
Evidemment, ce n'est qu'une ébauche, le son 1 doit être plus court que le son 2, il n'y a pas de gestion d'erreurs...
Mais bon l'algo semble bon et pourtant ça sature, quelqu'un a une idée?