C Programma per l'estrazione da un file B-format (4 canali) di un file WAV mono corrispondente ad un microfono C direttivo virtuale puntato ina prescelta direzione C Program VirtualMike Include 'flib.fi' Include 'flib.fd' Character*80 Outfile,Infile,Ref CHARACTER RIFF*4,FMT*8,DAT*4,AA*20 INTEGER*4 FILELEN,BOH,FSAMP,BYTERATE,NBYTES,i,j INTEGER*4 FILELEN2,FSAMP2,BYTERATE2 INTEGER*2 UNO,NoutCHANN,BYTESxPOINT,BITSxWORD,NinCHANN,NinCHANN2 INTEGER*2 BITSxWORD2 INTEGER*4 N,Nblocks REAL*4 W(4096),X(4096),Y(4096),Z(4096),V(4096) INTEGER*2 Wint(4096),Xint(4096),Yint(4096),Zint(4096),Vint(4096) Character Buffer*20 write(6,1) 1 format('*** Virtual Mike - Converts A 4-channels B-format File', 1' into a mono WAV file ***',/) write (6,2) 2 format(1x,' Copyright (2001) by Angelo Farina - University of', 1' Parma (Italy)',/) CHR0=0 LEN=0 Narg=NARGS() IF (Narg.LT.6) THEN Write(6,'(1H ,39HName of the WXYZ 4channels .WAV file = ,\)') Read(5,'(A40)')Infile Write(6,'(1H ,39HName of the mono .WAV output file = ,\)') Read(5,'(A40)')Outfile Write(6,'(1H ,39HDirectivity Factor (0..2) = ,\)') Read(5,*)D Write(6,'(1H ,41HSelect Angular (A) or Cartesian (C) ref.:,\)') Read(5,'(A40)')Ref if ((Ref(1:1).eq.'A').or.(Ref(1:1).eq.'a')) then Write(6,'(1H ,28HAzimut Angle (degrees) = ,\)') Read(5,*)Azimut Write(6,'(1H ,28HElevation Angle (degrees) = ,\)') Read(5,*)Elevation pi=2.0*asin(1.0) Xcoord=cos(Azimut/180.0*pi)*cos(Elevation/180.0*pi) Ycoord=sin(Azimut/180.0*pi)*cos(Elevation/180.0*pi) Zcoord=sin(Elevation/180.0*pi) else Write(6,'(1H ,15HX coordinate = ,\)') Read(5,*)Xcoord Write(6,'(1H ,15HY coordinate = ,\)') Read(5,*)Ycoord Write(6,'(1H ,15HZ coordinate = ,\)') Read(5,*)Zcoord end if ELSE call GetArg(1,InFile,Len) Write(6,'(39HFile Name of the WXYZ 4channels file = ,A40)') 1 InFile call GetArg(2,OutFile,Len) Write(6,'(39HFile Name of the .WAV output file = ,A40)') 1 OutFile call GetArg(3,AA,Len) write(Buffer,'(A20)') AA read(Buffer,*) D Write(6,'(39HDirectivity Factor (0..2) = ,F12.3)') D call GetArg(4,Ref,Len) if ((Ref(1:1).eq.'A').or.(Ref(1:1).eq.'a')) then call GetArg(5,AA,Len) write(Buffer,'(A20)') AA read(Buffer,*) Azimut Write(6,'(28HAzimut Angle (degrees) = ,F12.3)') Azimut call GetArg(6,AA,Len) write(Buffer,'(A20)') AA read(Buffer,*) Elevation Write(6,'(28HElevation Angle (degrees) = ,F12.3)')Elevation pi=2.0*asin(1.0) Xcoord=cos(Azimut/180.0*pi)*cos(Elevation/180.0*pi) Ycoord=sin(Azimut/180.0*pi)*cos(Elevation/180.0*pi) Zcoord=sin(Elevation/180.0*pi) else call GetArg(5,AA,Len) write(Buffer,'(A20)') AA read(Buffer,*) Xcoord Write(6,'(15HX coordinate = ,F12.3)') Xcoord call GetArg(6,AA,Len) write(Buffer,'(A20)') AA read(Buffer,*) Ycoord Write(6,'(15HY coordinate = ,F12.3)') Ycoord call GetArg(7,AA,Len) write(Buffer,'(A20)') AA read(Buffer,*) Zcoord Write(6,'(15HZ coordinate = ,F12.3)') Zcoord end if END IF C Normalizzazione coordinate puntamento microfono virtuale Den=sqrt(Xcoord*Xcoord+Ycoord*Ycoord+Zcoord*Zcoord) Xcoord=Xcoord/Den Ycoord=Ycoord/Den Zcoord=Zcoord/Den C Apro i files di Input e di Output Open(Unit=1,Form='BINARY',File=Infile,Mode='READ',Status='OLD') read(1)RIFF,FILELEN,FMT READ(1)BOH,UNO,NinCHANN if (NinCHANN.NE.4) then Write(6,*)'ERROR - The input file must be 4-channels' STOP END IF READ(1)FSAMP,BYTERATE READ(1)BYTESxPOINT,BITSxWORD,DAT,NBYTES c DO WHILE (DAT.ne.'data') c read(1)(dummybyte,i=1,NBYTES) c READ(1)DATA,NBYTES c END DO N=NBYTES/BYTESxPOINT C N è il numero di punti da leggere del file .WAV write(6,*) 'Number of data points #1 :',N,' with ',NinCHANN, 1' Channels' write(6,*) 'Sampling Frequency #1 (Hz):',Fsamp,' with ', 1BitsxWord,' Bits' Nblocks=N/4096 C Scrittura del file .WAV Open(Unit=9,Form='BINARY',File=Outfile,Mode='WRITE') Rewind(9) C Preparo le costanti write(6,139) FSAMP 139 format(1x,'Outfile Fsampling =',I8,' Hz') NoutCHANN=1 BYTESxPOINT=BYTESxPOINT/4 BYTERATE=FSAMP*BYTESxPOINT NBYTES=N*BYTESxPOINT FILELEN=36+NBYTES Write(9) RIFF,FILELEN,FMT Write(9) BOH,UNO,NoutCHANN Write(9) FSAMP,BYTERATE Write(9) BYTESxPOINT,BITSxWORD,DAT,NBYTES C Inizio a trasferire i dati write (6,'(1h )') write(6,11) 11 format(1x,'Saving data to output file (s)...') sq=sqrt(2.0) if (BITSxWORD.eq.16) then do j=1,Nblocks read(1) (Wint(i),Xint(i),Yint(i),Zint(i),i=1,4096) do i=1,4096 W(i)=sq*Wint(i) X(i)=1.0*Xint(i) Y(i)=1.0*Yint(i) Z(i)=1.0*Zint(i) V(i)=0.5*((2.0-D)*W(i)+D*(Xcoord*X(i)+Ycoord*Y(i) 1 +Zcoord*Z(i))) Vint(i)=int(V(i)) end do write(9) (Vint(i),i=1,4096) end do do i=1,(N-Nblocks*4096) read(1) Wint(i),Xint(i),Yint(i),Zint(i) W(i)=sq*Wint(i) X(i)=1.0*Xint(i) Y(i)=1.0*Yint(i) Z(i)=1.0*Zint(i) V(i)=0.5*((2.0-D)*W(i)+D*(Xcoord*X(i)+Ycoord*Y(i) 1 +Zcoord*Z(i))) Vint(i)=int(V(i)) write(9) Vint(i) end do else do j=1,Nblocks read(1)( W(i),X(i),Y(i),Z(i),i=1,4096) do i=1,4096 W(i)=sq*W(i) V(i)=0.5*((2.0-D)*W(i)+D*(Xcoord*X(i)+Ycoord*Y(i) 1 +Zcoord*Z(i))) end do write(9) (V(i),i=1,4096) end do do i=1,(N-Nblocks*4096) read(1) W(i),X(i),Y(i),Z(i) W(i)=sq*W(i) V(i)=0.5*((2.0-D)*W(i)+D*(Xcoord*X(i)+Ycoord*Y(i) 1 +Zcoord*Z(i))) write(9) V(i) end do end if C Chiusura dei files e fine write (6,*) ' Conversion terminated OK !!!!' close(1) close(9) END