Newsgroup: it.comp.software.divx
Titolo: [OT?] fondere canali audio (mixer)

Il mio problema è questo.
Ho due tracce mono.
Sono l'audio originale e la voce dell'interprete.
Vorrei fonderle in modo automatico (possibilmente batch) in un unico 
flusso stereo.
Vorrei che fossero possibili entrambe le seguenti opzioni:
a) una traccia diventa il canale sinistro e l'altra il canale destro.
b) le tracce vengono fuse lasciando una leggera prevalenza della prima 
traccia nel canale sinistro e della seconda nel canale destro
Eventualmente vorrei poter utilizzare una terza traccia (commento di 
un giornalista) come canale centrale.
C'è qualche software, possibilmente opensource e necessariamente per 
windows, che mi permetta di farlo?
besweet? Qualche applicazione di tipo mixer?
Avete qualche esempio? 

 un giornalista) come canale centrale.
Per questo non lo so. Ti serve un programma che prenda tre traccie audio (o
una traccia wav a tre canali) e lo trasformi in Dolby Ditgital o DTS.
Besweet lo fa (con wave a sei canali), ma viene con il volume basso.
ffmpeggui produce risultati migliori, ma non so quanti canali di uscita può
impostare (il mio indica sempre due) e se prendi wave multicanali in
ingresso.
bye
-- 
HomePage e FAQ: 
http://giubbe.altervista.org
Inutile scrivere in privato, non ricevo le email

 Per questo audacity. E' un potente audio editor opensource.
Lo conosco bene.
E' che lo devono usare degli utonti per cui speravo in qualcosa di 
semplicissimo oppure di command-line, cui fare un wrapper con Delphi o 
roba simile.
C'è una cosa chiamata "mixere" (open source, su sourceforge) ma 
purtroppo non permette di salvare - solo di ascoltare. Audacity 
permetterebbe comunque di registrare, ma ovviamente gli utonti di cui 
sopra hanno pure fretta. Non gli va bene di attendere un tempo pari 
alla durata dell'audio.

 semplicissimo oppure di command-line,
a riga di comando c'e' "soxmix" (cerca con google), e' una versione
di "sox" che accetta piu' file di input (da mixare); le opzioni sono
le stesse di "sox" (le trovi con google);
quasi certamente lo trovi gia' compilato anche per windows
(altrimenti dovresti compilarlo senza troppe difficolta' in ambiente
MinGW o CygWin)

 quasi certamente lo trovi gia' compilato anche per windows
ti confermo che c'e' gia':
questa e' la home page di "sox": 
http://sox.sourceforge.net
da tale pagina puoi scaricare una versione precompilata
per windows:
Win32 Binary (Win95/98/NT/XP): sox12181.zip
(lo zip contiene sia sox.exe che soxmix.exe)

 (lo zip contiene sia sox.exe che soxmix.exe)
hai risolto?
ad ogni modo ti esemplifico alcune possibili soluzioni, mediante
l'uso di sox/soxmix.
il filtro che ti serve e' "avg" (average), che puo' essere usato
in questo modo:
supponiamo che "in.wav" sia un file audio a due canali (l, r);
se a, b, c, d sono 4 numeri compresi tra 0.0 e 1.0, il comando
sox in.wav out.wav avg a,b,c,d
crea una traccia out.wav i cui canali l e r sono costruiti da
quelli di in.wav in base ai valori di a, b, c, d
(in questo specifico caso, a = l->l, b = l->r, c = r->l, d = r->r;
per altri casi, ti rimando alle documentazioni).
esempi:
il seguente comando crea una copia identica di in.wav:
sox in.wav out.wav avg 1,0,0,1
il seguente comando crea una copia di in.wav in cui i canali vengono
invertiti (l con r, r con l):
sox in.wav out.wav avg 0,1,1,0
il seguente comando mette sul canale l il mix dei due canali e
in r silenzio assoluto:
sox in.wav out.wav avg 1,0,1,0
il seguente comando mette sul canale l il mix dei due canali e
in r un mix un po' attenuato dei due canali:
sox in.wav out.wav avg 1,0.3,1,0.3
questi esempi dovrebbero essere abbastanza chiari...
a questo punto, puoi ottenere cio' che vuoi mediante una sequenza
di comandi simile a questa:
(1) sox in1.wav tmp1.wav avg 1,0,1,0
(2) sox in2.wav tmp2.wav avg 0,1,0,1
(3) soxmix -v 1 tmp1.wav -v 1 tmp2.wav out.wav
il comando (1) prende la prima traccia e crea una traccia
temporanea (tmp1.wav) sul cui canale sinistro c'e' un mix dei
due canali e sul destro niente;
il comando (2) prende la seconda traccia e crea una traccia
temporanea (tmp2.wav) sul cui canale destro c'e' un mix dei
due canali e sul sinistro niente;
il comando (3) mixa le due tracce temporanee, creando una
traccia il cui canale sinistro coincide con la prima traccia
di partenza, e il destro con la seconda.
cambiando i coefficienti puoi ottenere tutte le possibilita'
che desideri, ma devi fare attenzione ai coefficienti "-v"
(l'ampiezza, cioe' il volume): nell'esempio che ti ho fatto,
"-v 1" non crea problemi perche' sappiamo che tmp1 e tmp2
non hanno segnali in comune (il canale destro di tmp1 e'
vuoto e il sinistro di tmp2 pure...), ma in altri casi, se
usi l'opzione "-v 1" potrebbero esserci "esuberi" nei valori
calcolati dei campioni, e cio' puo' dare problemi di
"clipping"; per sapere il massimo valore che non dia problemi
di clipping puoi usare preventivamente il filtro "stat"
(vedi documentazione di sox).
questa soluzione non e' molto bella perche' consiste di tre
passaggi e vengono creati due file temporanei; forse si
puo' fare in unico passaggio usando solo soxmix, ma non lo
conosco abbastanza bene per saperlo...
in ambiente linux (o altro s.o. che supporta "named pipes")
si poteva fare in questo modo:
(1) mkfifo tmp1.wav
(2) mkfifo tmp2.wav
(3) sox in1.wav tmp1.wav avg 1,0,1,0 &
(4) sox in2.wav tmp2.wav avg 0,1,0,1 &
(5) soxmix -v 1 tmp1.wav -v 1 tmp2.wav out.wav
questo sembra piu' complesso ma in realta' e' molto piu'
efficiente: (1) e (2) creano due "named pipes"; (3) e (4)
hanno l'effetto di addormentare due istanze di "sox", che
saranno svegliate da "soxmix"; in pratica, si hanno tre
processi che comunicano mediante fifo, e non viene creato
alcun file temporaneo...
non ho idea se questa soluzione possa essere usata anche
in windows...
ah, dimenticavo...
avevi anche l'esigenza di mettere una terza traccia come
"centrale"; non ho capito di preciso quanti canali dovra'
avere la traccia finale; se i canali finali sono solo 2,
puoi procedere in modo del tutto analogo a sopra:
supponiamo che la terza traccia sia in3.wav; crei una
terza traccia temporanea
sox in3.wav tmp3.wav avg ...
al posto dei puntini metti i livelli che creano l'effetto
che desideri (esempio: 0.4,0.4,0.4,0.4), poi mixi tutte
le tracce temporanee:
soxmix tmp1.wav tmp2.wav tmp3.wav out.wav
se, invece, vuoi creare un audio con piu' di due canali,
puoi sempre farlo con comandi simili a questi, ma devi
giocare un po' con il parametro "-c" e le opzioni del
filtro "avg".
ti faccio giusto un paio di esempi:
se in.wav e' mono, e vuoi farlo diventare stereo (con i
due canali identici), puoi fare cosi':
sox in.wav -c 2 out.wav
insieme al parametro "-c" puoi usare "avg" per controllare
cio' che viene messo nei due canali...
se vuoi ottenere un "quad" wav (4 canali) procedi cosi':
sox in.wav -c 4 out.wav
pero', con 4 canali, i parametri di "avg" sono piu' complessi
di quelli per 2.

 hai risolto?
ni, nel senso che sox per win32 non legge/scrive
il formato mp3. Vedrò se riesco a convincere i
miei utonti ad acquisire in wav e trasformare
poi in mp3 via lame.
Purtroppo tutto il software che usano è proprietario,
e so già che non li convincerò che ogg è meglio.
Ti ringrazio comunque tantissimo.

 il formato mp3.
il mio si' :-)
--------
sox -h
[...]
Supported file formats: aiff al au auto avr cdr cvs dat vms gsm hcom la lu
maud mp3 nul ossdsp prc raw sb sf sl smp sndt sph 8svx sw txw ub ul uw voc
vorbis vox wav wve 
--------
e' un peccato che l'abbiano compilato senza mp3...
pero' hai ancora varie possibilita':
1) lo ricompili con il supporto mp3 :-) (potrebbe essere difficile);
2) puoi usarlo in pipeline con "lame"; ad esempio:
lame --decode pippo.mp3 - | sox -t wav - -c 1 mono.wav
questo stupido esempio prende in ingresso "pippo.mp3" (stereo) e crea un
wav mono facendo il downmix dei due canali; e' solo per farti capire
come fare in modo che sox prenda in ingresso anche mp3... suppongo che
"lame" (command-line) esista anche per windows e che le pipe funzionino
anche sotto windows...
per fare in modo che venga scritto in uscita un mp3, si puo' procedere in
modo analogo:
sox[mix] ... -t wav - | lame [ opzioni ] - pluto.mp3
ciao

 come fare in modo che sox prenda in ingresso anche mp3... 
Effettivamente quella della pipeline con lame potrebbe essere un'idea.
Bisogna che faccia un test per i tempi con dei file campione significativi.

 Bisogna che faccia un test per i tempi con dei file campione significativi.
ho appena fatto alcuni test (sotto linux); in effetti la pipeline ha un suo
costo...
i test che ho fatto sono questi.
ho preso alcuni mp3 di varie durate, poi ho impartito piu' volte questi due
comandi:
(1) time sox in.mp3 -t wav - avg 0.8,0.2,0.2,0.8 | lame --quiet -m j
    -b 128 - out1.mp3
(2) time lame --quiet --decode in.mp3 - | sox -t wav - -t wav - avg
    0.8,0.2,0.2,0.8 | lame --quiet -m j -b 128 - out2.mp3
("time" serve per vedere quanto tempo impiega).
il primo prende in ingresso un mp3, lo decomprime, attenua un pochino il
suo grado di stereofonia (aggiunge un po' della traccia sinistra a quella
destra, e un po' della destra a quella sinistra, mediante l'effetto
"avg 0.8,0.2,0.2,0.8"), e quindi ricomprime il risultato in mp3 usando
lame;
il secondo fa la stessa identica cosa, ma usa lame anche per decodificare
il mp3 in ingresso (il primo usa il decoder staticamente linkato a sox,
che pero' non e' "libmp3lame", ma "libmad").
ebbene, in tutte le prove il secondo si e' rivelato piu' lento del primo
(come ci si poteva aspettare), impiegando un tempo superiore di un
fattore compreso tra 13% e 15% (troppo!).
in altre parole, se il primo impiega 100 secondi, il secondo impiega tra
113 e 115 secondi.
pero' non sono certo che "libmad" e lame siano ugualmente efficienti...
il mio sospetto e' che libmad sia piu' veloce...
infatti e' cosi'! :-)
ho cercato la home page di "libmad", il primo risultato di google:
http://www.underbit.com/products/mad
su quella pagina, nell'elenco delle applicazioni che usano libmad
ci sono: sox, mplayer, ecc. c'e' anche "mpg321", che ho sotto mano...
bene, a questo punto ho modificato il comando (2) in questo modo:
(2) time mpg321 --quiet -w - in.mp3 | sox -t wav - -t wav - avg
    0.8,0.2,0.2,0.8 | lame --quiet -m j -b 128 - out2.mp3
e' quasi uguale a quello di prima, solo che invece di usare lame,
usa mpg321 per decomprimere il mp3 in ingresso.
questo comando e' molto piu' veloce di quello di prima :-)
adesso impiega un tempo superiore a (1) di un fattore compreso
tra 3% e 5%.
adesso mi torna :-)
in conclusione, se le pipe sono gestite bene dal s.o. ("gestite
bene" voglio dire che i processi comunicano mediante strutture
in memoria), usando front-end e back-end mp3 esterni a sox,
dovresti avere un overhead abbastanza contenuto...
ah, dimenticavo... naturalmente, tieni presente che in una
elaborazione del tipo dell'esempio che ti ho fatto in questo post
(sia metodo (1) che (2)), la stragrande maggioranza dei tempi
di calcolo sono spesi nella codifica e nella decodifica mp3;
i tempi spesi da sox per fare tutte le varie manipolazioni dei
campioni audio, sono veramente una piccolissima percentuale
rispetto al tempo totale...
ciao