!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
! Sergio Steffe' - Laboratorio Sperimentale di Matematica Computazionale
! Dipartimento di Matematica - Universita' di Pisa - AA 2002/2003
!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
program mono
!
!!!!!!!!!!!!!!! descrizione !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
!prende un file stereo 16 bit PCM big endian e 
!          crea un file mono sommando i canali
!
!!!!!!!!!!!!!!! dichiarazioni !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
IMPLICIT NONE
!
!
!definizioni di precisione semplice e doppia
INTEGER,PARAMETER ::  iduemax=32767
!mi tengo sotto il minimo valore 32767 per non avere guai con l'arrotondamento
!
!
!
DOUBLE PRECISION :: fsample=44100.0
!
!numero capionature
INTEGER :: i=0
!
!tempo totale
DOUBLE PRECISION ttot
!
!
!errore in lettura file: + se errore; 0 se ok; - se end of file
INTEGER ioerr
!
!nome del file di output
CHARACTER(len=25) FILENAMEOUT
!
!posfisso da aggiungere al nome file
CHARACTER(len=4) :: POSTF='.cdr'
!
!variabile per lettura nome file output
CHARACTER(len=20) FILENAME1
!
!nome del file di input
CHARACTER(len=64) FILENAMEIN
!
!
!segnale sonoro a ds e sn 
DOUBLE PRECISION soundds,soundsn
!
!interi usati per conversioni da real a intero due bytes big little endian
INTEGER(2) iids,iisn,ii,jj
!
!
!!!!!!!!!!!!!! inizio !!!!!!!!!!!!!!!!!!!!!!!!!!!
!si aprono i files
!REPLACE crea o cancella se esistente
!UNFORMATTED usa formato interno per salvare i dati
!DIRECT usa l'accesso ad un qualsiasi record
!RECL e' la lunghezza di ogni record (4 bytes)
!
write(*,*)'Nome del file di input:'
read(*,*)FILENAMEIN
!write(*,*)'hai detto: ',FILENAMEIN
!
open(unit=11,file=FILENAMEIN,status='OLD',form='UNFORMATTED',access='DIRECT',RECL=4,ERR=101)
!
write(*,*)'Nome del file di output (max 20 char senza spazi): '
read(*,*) FILENAME1
FILENAMEOUT = FILENAME1(1:SCAN( FILENAME1,' ',.FALSE.)-1)//POSTF
!write(*,*)'hai detto: ',FILENAMEOUT
!
open(unit=10,file=FILENAMEOUT,status='REPLACE',form='UNFORMATTED',access='DIRECT',RECL=4)
!
!
!loop principale: si legge un record si fa mono e si scrive
! ripetere fino a fine del file
!
ioerr=0
!
DO
i=i+1
read(unit=11,rec=i,IOSTAT=ioerr)ii,jj
IF (ioerr /= 0) EXIT
call MVBITS(ii,0,8,iids,8)
call MVBITS(ii,8,8,iids,0)
call MVBITS(jj,0,8,iisn,8)
call MVBITS(jj,8,8,iisn,0)
soundds=iids
soundsn=iisn
soundds=(soundds+soundsn)/2.0
soundsn=soundds
ii=NINT(soundds)
call MVBITS(ii,0,8,iids,8)
call MVBITS(ii,8,8,iids,0)
ii=NINT(soundsn)
call MVBITS(ii,0,8,iisn,8)
call MVBITS(ii,8,8,iisn,0)
!
write(unit=10,rec=i) iids,iisn
!

END DO	
!
close(unit=10)
close(unit=11)
!
ttot=i
ttot=ttot/fsample
write(*,501)ttot,FILENAMEOUT
501 FORMAT('Scritti',F5.1,' secondi suono (PCM 2x16 bit big endian) nel file: ',A)
GOTO 202
!
101 write(*,*)'ERRORE aprendo in lettura il file: ',FILENAMEIN
GOTO 202
102  write(*,*)'ERRORE leggendo il file: ',FILENAMEIN
ttot=i
ttot=ttot/fsample
write(*,*)'(dopo ',ttot,' secondi di audio)'

GOTO 202
202 CONTINUE
end program mono
