!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
! Sergio Steffe' - Laboratorio Sperimentale di Matematica Computazionale
! Dipartimento di Matematica - Universita' di Pisa - AA 2002/2003
!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
program creasuono
!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!   creasuono.f90
!   crea 1 secondo di suono di forma sinusoidale
!   16 bit stereo 44.100Hz big-endian formato raw
!   in un file di nome assegnato
!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
!   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 dei records
INTEGER NTOT
!
!per i loop
INTEGER I
!
!tempo
REAL t
!
!canali ds e sn
REAL soundds,soundsn
!
!interi di due bytes
INTEGER(KIND=2) ii,iids,iisn
!
!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
!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
!
!   fine dichiarazioni
!
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
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
!
pi2=8*atan(1.0D0)
fsample=44100.0
!
freq=400.0
!
TTIME=1.0
!
NTOT=TTIME*fsample +0.5
!
!loop principale
!
do I=1,NTOT
!istante di tempo
t=i-1
t=t/fsample
!
soundds=(sin(t*pi2*freq))*iduemax
soundsn=(sin(t*pi2*freq))*iduemax
!
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)

end program creasuono
