INDIETRO
  Primi programmi
AVANTI

Nota sui compilatori

Nota su octave

Nota su matlab

creazione di un file.cdr in C

Il file creasuono.c è un semplice programma in C che crea un file contenente 1 secondo di suono con frequenza di campionamento di 44100HZ, stereo, 16 bit, big-endian.
Il suono è una sinusoide di frequenza di 400Hz e ampiezza massima (32766).
Per compilarlo si usa il comando:

cc creasuono.c -o creasuono -lm

Il flag -lm serve ad accedere alla libreria /usr/lib/libm.a che contiene le funzioni matematiche elementari, come sin(x).

Una volta compilato, il comando
creasuono sinus400.cdr
crea il file sinus400.cdr, che si può ascoltare con
playcdr sinus400.cdr ( su alcuni sistemi semplicemente: play sinus400.cdr ).

creazione di un file.cdr in fortran

Il file creasuono.f90 è un semplice programma in fortran90 che crea un file contenente 1 secondo di suono con frequenza di campionamento di 44100HZ, stereo, 16 bit, big-endian.
Il suono è una sinusoide di frequenza di 400Hz e ampiezza massima (32766).
Per compilarlo si usa il comando:

f95 creasuono.f90 -o creasuono

Una volta compilato, il comando
creasuono sinus400.cdr
crea il file sinus400.cdr, che si può ascoltare con
playcdr sinus400.cdr ( su alcuni sistemi semplicemente: play sinus400.cdr ).

Si noti che le variabili ii, iids,iisn sono interi a 2 BYTES, e si noti le chiamate all routine MVBITS che scambia di posto i primi 8 bit con i secondi 8 bit per passare da little-endian a big-endian.
Il file è stato aperto in modo UNFORMATTED con accesso DIRECT dichiarando i record di lunghezza RECL=4 (bytes).
L'istruzione di scrittura deve indicare quale record si vuole scrivere (rec=i), e in effetti si devono scrivere ogni volta non più di 4 bytes.

creazione di un file.cdr in octave


octave:1> x=[0:1/44100:1];
octave:2> y=sin(x*2*pi*400);
octave:3> n=size(y)(2)
n = 44101
octave:4> myfile=fopen("sinus400.cdr","w")
myfile = 3
octave:5> for i=1:n
> fwrite(myfile,int16(32766*y(i)),"int16","ieee-be");
> fwrite(myfile,int16(32766*y(i)),"int16","ieee-be");
> end
octave:6> fclose(myfile)
ans = 0
octave:7>


Abbiamo qui un videocamera  filmato (20MB) dell'intera operazione.

Purtroppo risulta che le chiamate di fwrite in matlab e ancor più in octave sono terribilmente inefficienti e richiedono tempi lunghissimi, per cui appena si arriva a un minuto di musica la scrittura richiede decine di minuti.
Una soluzione allora puo' essere quella di salvare il suono in uscita da matlab o octave nel fomato ascii ed usare un programma di conversione matconv.c separato per creare il file.cdr.

L'esempio di prima diventa allora più semplice ma in due passi:
octave:1> x=[0:1/44100:1];
octave:2> y=sin(x*2*pi*400)*32766;
octave:3> c(:,1)=y';
octave:4> c(:,2)=y';
octave:5> save('-ascii','out.octave','c');
octave:6> exit;


steffe@wallis:$ ./matconv out.octave out.cdr  


INDIETRO
Laboratorio Sperimentale di Matematica Computazionale - parte II
Sergio Steffè - AA 2015/2016 - PISA
AVANTI