!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
! Sergio Steffe' - Laboratorio Sperimentale di Matematica Computazionale
! Dipartimento di Matematica - Universita' di Pisa - AA 2002/2003
!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
program noise
!
!!!!!!!!!!!!!!! descrizione !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
! genera 3 secondi di rumore stereo sui due auricolari, con 
!
! formato di uscita: 16bit big endian stereo PCM
!
!!!!!!!!!!!!!!! dichiarazioni !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
IMPLICIT NONE
!
!
INTEGER,PARAMETER ::  iduemax=32767
!mi tengo sotto il minimo valore 32767 per non avere guai con l'arrotondamento
!
!
!frequenza di campionamento
DOUBLE PRECISION fsample
!
!
!durata totale del suono
DOUBLE PRECISION TTIME
!
!numero capionature
INTEGER NTOT
!
!ampiezza del suono generato
DOUBLE PRECISION amp
!
!nome del file di output
CHARACTER(len=25) FILENAME
!
!posfisso da aggiungere al nome file
CHARACTER(len=4) :: POSTF='.cdr'
!
!variabile per lettura nome file
CHARACTER(len=20) FILENAME1
!
!
!contatore principale del generatore del suono
INTEGER I
!
!
!interi usati per conversioni da real a intero due bytes big little endian
INTEGER(2) ii,iids,iisn
!
!
!!!!!!!!!!!!!! assegnazione delle variabili !!!!!!!!!!!!!!!!!!!!!!!!!!!
write(*,*)'Nome del file (max 20 char senza spazi): '
read(*,*) FILENAME1
FILENAME = FILENAME1(1:SCAN( FILENAME1,' ',.FALSE.)-1)//POSTF
write(*,*)'hai detto: ',FILENAME
!
!
!!!!!!!!!!!!!! inizio calcoli !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
!si apre il file
!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)
!
open(unit=10,file=FILENAME,status='REPLACE',form='UNFORMATTED',access='DIRECT',RECL=4)
!
!setup delle variabili
!
fsample=44100.0
!
TTIME=3.0
!
NTOT=TTIME*fsample +0.5
!
!loop principale
!
do I=1,NTOT
!
!generatore di numeri a caso tra 0 e +1
call RANDOM_NUMBER(amp)
amp=-1 + 2*amp
ii=NINT(amp*iduemax)
call MVBITS(ii,0,8,iids,8)
call MVBITS(ii,8,8,iids,0)
call RANDOM_NUMBER(amp)
amp=-1 + 2*amp
ii=NINT(amp*iduemax)
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)
write(*,*)'Scritti',TTIME,'secondi suono (PCM 2x16 bit big endian) nel file:',FILENAME
end program noise
