!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ! Sergio Steffe' - Laboratorio Sperimentale di Matematica Computazionale ! Dipartimento di Matematica - Universita' di Pisa - AA 2002/2003 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! program sinus ! !!!!!!!!!!!!!!! descrizione !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !genera un suono di 3 secondi sui due auricolari, con assegnate ! frequenza, ! ampiezze e fasi ! precisione numerica ! !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 ! ! !2 pi greco REAL pi2 ! !frequenza di campionamento REAL fsample ! !frequenza del suono generato REAL freq ! !durata totale del suono REAL TTIME ! !numero capionature INTEGER NTOT ! !ampiezza del suono generato REAL ampds, ampsn ! !fase del suono generato REAL faseds, fasesn ! !numero bit significativi (4-16) INTEGER(2) bitsi ! !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 ! !istante di tempo REAL t ! !segnale sonoro a ds e sn in scala arbitraria tra -1 e +1 REAL soundds,soundsn ! !interi usati per conversioni da real a intero due bytes big little endian INTEGER(2) iids,iisn,ii,iii,jj ! !!!!!!!!!!!!!! assegnazione delle variabili !!!!!!!!!!!!!!!!!!!!!!!!!!! ! !setup delle variabili numeriche ! pi2=8*atan(1.0D0) fsample=44100.0 ! TTIME=3.0 ! write(*,*)'Nome del file (max 20 char senza spazi): ' read(*,*) FILENAME1 FILENAME = FILENAME1(1:SCAN( FILENAME1,' ',.FALSE.)-1)//POSTF write(*,*)'hai detto: ',FILENAME ! write(*,*)'Frequenza:' read(*,*) freq write(*,*)'hai detto: ',freq ! write(*,*)'Ampiezze dei canali ds e sn (0.0-1.0):' read(*,*) ampds, ampsn ! IF (ampds < 0.0) THEN ampds=0.0 ENDIF IF (ampds > 1.0) THEN ampds=1.0 ENDIF ! IF (ampsn < 0.0) THEN ampsn=0.0 ENDIF IF (ampsn > 1.0) THEN ampsn=1.0 ENDIF ! write(*,*)'hai detto: ',ampds,ampsn ! write(*,*)'Fasi dei canali ds e sn (-180...+180):' read(*,*) faseds,fasesn write(*,*)'hai detto: ',faseds,fasesn faseds = faseds * pi2/360.0 fasesn = fasesn * pi2/360.0 ! write(*,*)'Numero Bit Significativi (4-16):' read(*,*)bitsi IF (bitsi<4) THEN bitsi=4 END IF IF (bitsi>16) THEN bitsi=16 END IF write(*,*)'hai detto: ',bitsi,' (',2**bitsi,' livelli in uscita)' bitsi=2**(16-bitsi) ! !!!!!!!!!!!!!! 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 altre variabili ! NTOT=TTIME*fsample +0.5 ! !loop principale ! do I=1,NTOT !istante di tempo t=i t=t/fsample ! soundds=(ampds*sin(t*pi2*freq + faseds))*iduemax soundsn=(ampsn*sin(t*pi2*freq + fasesn))*iduemax ! ii=NINT(soundds) iii=mod(ii,bitsi) jj=ii-iii call MVBITS(jj,0,8,iids,8) call MVBITS(jj,8,8,iids,0) ! ii=NINT(soundsn) iii=mod(ii,bitsi) jj=ii-iii call MVBITS(jj,0,8,iisn,8) call MVBITS(jj,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 sinus