!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! ! Sergio Steffe' - Laboratorio Sperimentale di Matematica Computazionale ! Dipartimento di Matematica - Universita' di Pisa - AA 2002/2003 ! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! program fase1 ! !!!!!!!!!!!!!!! descrizione !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! ! !genera un suono di 8 secondi stereo sui due auricolari, con assegnata ! frequenza, ! con la fase che varia tra +-pi greco in 8 passi ! !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 DOUBLE PRECISION pi2 ! !frequenza di campionamento DOUBLE PRECISION fsample ! !frequenza del suono generato DOUBLE PRECISION freq ! !durata totale del suono DOUBLE PRECISION TTIME ! !numero capionature INTEGER NTOT ! !ampiezza del suono generato DOUBLE PRECISION amp ! !sfasatura del suono si due canali DOUBLE PRECISION faseds, fasesn ! !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 DOUBLE PRECISION t ! !segnale sonoro a ds e sn in scala arbitraria tra -1 e +1 DOUBLE PRECISION soundds,soundsn ! !interi usati per conversioni da real a intero due bytes big little endian INTEGER(2) iids,iisn,ii ! ! !!!!!!!!!!!!!! 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 ! write(*,*)'Frequenza:' read(*,*) freq write(*,*)'hai detto: ',freq ! !ampiezza massima amp=1.0 ! ! ! !!!!!!!!!!!!!! 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 ! pi2=8*atan(1.0) fsample=44100.0 ! TTIME=8.0 ! NTOT=TTIME*fsample +0.5 ! !loop principale ! do I=1,NTOT !istante di tempo t=i t=t/fsample ! ! IF (t-INT(t) < 0.5) THEN faseds=-INT(t)*pi2/16 fasesn=INT(t)*pi2/16 ! soundds=(amp*sin(t*pi2*freq+faseds))*iduemax soundsn=(amp*sin(t*pi2*freq+fasesn))*iduemax ELSE soundds=0.0 soundsn=0.0 END IF ! 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) write(*,*)'Scritti 8 secondi suono (PCM 2x16 bit big endian) nel file:',FILENAME end program fase1