Nota di Copyright Interfaccia audio Libreria portaudio Un piccolo

Transcript

Nota di Copyright Interfaccia audio Libreria portaudio Un piccolo
Fondamenti di Informatica
Fondamenti di Informatica - Real-time audio
Fondamenti di Informatica - Real-time audio
Nota di Copyright
FONDAMENTI DI INFORMATICA
Questo insieme di trasparenze (detto nel seguito slide) è protetto dalle leggi sul copyright
e dalle disposizioni dei trattati internazionali. Il titolo ed i copyright relativi alle slides (ivi
inclusi, ma non limitatamente, ogni immagine, fotografia, animazione, video, audio,
musica e testo) sono di proprietà dell’autore prof. Pier Luca Montessoro, Università degli
Studi di Udine.
Le slide possono essere riprodotte ed utilizzate liberamente dagli istituti di ricerca,
scolastici ed universitari afferenti al Ministero della Pubblica Istruzione e al Ministero
dell’Università e Ricerca Scientifica e Tecnologica, per scopi istituzionali, non a fine di
lucro. In tal caso non è richiesta alcuna autorizzazione.
Ogni altro utilizzo o riproduzione (ivi incluse, ma non limitatamente, le riproduzioni su
supporti magnetici, su reti di calcolatori e stampe) in toto o in parte è vietata, se non
esplicitamente autorizzata per iscritto, a priori, da parte degli autori.
L’informazione contenuta in queste slide è ritenuta essere accurata alla data della
pubblicazione. Essa è fornita per scopi meramente didattici e non per essere utilizzata in
progetti di impianti, prodotti, reti, ecc. In ogni caso essa è soggetta a cambiamenti senza
preavviso. L’autore non assume alcuna responsabilità per il contenuto di queste slide (ivi
incluse, ma non limitatamente, la correttezza, completezza, applicabilità, aggiornamento
dell’informazione).
In ogni caso non può essere dichiarata conformità all’informazione contenuta in queste
slide.
In ogni caso questa nota di copyright e il suo richiamo in calce ad ogni slide non devono
mai essere rimossi e devono essere riportati anche in utilizzi parziali.
Prof. PIER LUCA MONTESSORO
Facoltà di Ingegneria
Università degli Studi di Udine
Libreria in linguaggio C per
elaborazione audio in real time
© 2010 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2)
1
© 2010 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2)
Fondamenti di Informatica - Real-time audio
Fondamenti di Informatica - Real-time audio
Interfaccia audio
dispositivo
hardware
driver
software
2
Libreria portaudio
• http://www.portaudio.com/
“Portable cross-platform Audio API”
programma
applicativo
• Compatibile con cygwin/gcc
qui ci pensa il
costruttore…
• Wrapper per le esercitazioni di
“Architettura dei calcolatori”:
rtalib (real-time audio library)
qui tocca a
noi!
© 2010 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2)
3
© 2010 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2)
Fondamenti di Informatica - Real-time audio
4
Fondamenti di Informatica - Real-time audio
Un piccolo problema
Callback function
Il driver software esiste già. Come fa a
chiamare una funzione della nostra
applicazione?
driver
software
programma
applicativo
f_inizializzazione (indirizzo_fz_appl)
chiamata di (*indirizzo_fz_appl)()
Funzioni di CALLBACK!!!
© 2010 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2)
5
© 2010 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2)
© 2000 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2)
6
1
Fondamenti di Informatica
Fondamenti di Informatica - Real-time audio
Fondamenti di Informatica - Real-time audio
rtalib
rtalib: funzioni di inizializzazione
• Limitata al formato CD audio
(44.1 KHz, 16 bit, stereo)
int init_stream_for_input (void)
• Richiede i file cygportaudio-2.dll e
libportaudio.dll.a (Windows) o
libportaudio.so (Linux), portaudio.h,
rtalib.c, rtalib.h, wav.c, wav.h, (sul sito
www.montessoro.it)
int init_stream_for_output (void)
int init_stream_for_input_and_output (void)
• per compilare:
cc_rta <nome programma>
© 2010 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2)
7
© 2010 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2)
Fondamenti di Informatica - Real-time audio
8
Fondamenti di Informatica - Real-time audio
rtalib: funzioni di callback
rtalib: temporizzazione e chiusura
void write_buffer_to_play
(signed short int *buffer, int buffer_size)
void sleep_while_stream_is_running
(double seconds)
void read_recorded_buffer
(signed short int *buffer, int buffer_size)
int close_stream (void)
void read_and_write_buffer
(signed short int *input_buffer,
signed short int *output_buffer,
int buffer_size)
© 2010 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2)
9
© 2010 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2)
Fondamenti di Informatica - Real-time audio
Fondamenti di Informatica - Real-time audio
Esempio: play_wave (inizializzazione)
WAVE wave;
int current_playback_position;
Esempio:
play_wave
(main)
10
int main (int argc, char *argv[])
{
FILE *fpin;
void play_wave (void)
{
current_playback_position = 0;
if (init_stream_for_output() == -1)
{
printf ("error opening output stream\n");
exit (EXIT_FAILURE);
}
if (argc != 2) ...
fpin = fopen (argv[1], "rb");
if (fpin == NULL) ...
wave = ReadWave (fpin);
fclose (fpin);
sleep_while_stream_is_running
(wave.numofstereosamples / (double) SAMPLINGRATE);
play_wave ();
return;
}
ReleaseWaveData (&wave);
return EXIT_SUCCESS;
}
© 2010 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2)
11
© 2010 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2)
© 2000 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2)
12
2
Fondamenti di Informatica
Fondamenti di Informatica - Real-time audio
Fondamenti di Informatica - Real-time audio
Esempio: play_wave (callback)
void write_buffer_to_play
(signed short int *buffer, int buffer_size)
{
int i;
for (i = 0; i + current_playback_position <
wave.numofstereosamples && i < buffer_size; i++) {
*buffer++ = SAMPLE(wave, LEFT,
i + current_playback_position);
*buffer++ = SAMPLE(wave, RIGHT,
i + current_playback_position);
}
while (i < buffer_size)
/* silence left ...
*buffer++ = 0;
}
Esempio: wire
void wire (void)
{
if (init_stream_for_input_and_output() == -1)
{
printf ("error opening output stream\n");
exit (EXIT_FAILURE);
}
{
and right */
*buffer++ = 0;
printf ("Playing... 'X' to terminate.\n");
while (toupper(getchar()) != 'X');
i++;
return;
}
current_playback_position += buffer_size;
return;
}
© 2010 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2)
13
© 2010 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2)
Fondamenti di Informatica - Real-time audio
Esempio: wire
14
Fondamenti di Informatica - Real-time audio
Esempio: overdrive
void read_and_write_buffer
(signed short int *input_buffer,
signed short int *output_buffer, int buffer_size)
{
int i;
for (i = 0; i < buffer_size; i++)
{
*output_buffer++ = *input_buffer++;
*output_buffer++ = *input_buffer++;
}
/* left */
/* right */
return;
}
© 2010 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2)
15
© 2010 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2)
Fondamenti di Informatica - Real-time audio
16
Fondamenti di Informatica - Real-time audio
Overdrive analogico
Overdrive analogico
© 2010 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2)
17
© 2010 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2)
© 2000 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2)
18
3
Fondamenti di Informatica
Fondamenti di Informatica - Real-time audio
Fondamenti di Informatica - Real-time audio
Overdrive analogico:
il caldo suono delle valvole
Il diodo ideale: clip
30000
20000
10000
0
-40000
-30000
-20000
-10000
0
10000
20000
30000
40000
-10000
-20000
-30000
© 2010 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2)
19
© 2010 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2)
Fondamenti di Informatica - Real-time audio
20
Fondamenti di Informatica - Real-time audio
Verso un suono più caldo:
saturazione esponenziale
Il diodo ideale in linguaggio C
40000
sample = input_buffer[current_position];
30000
overdriven_sample = fabs (sample * gain);
20000
if (overdriven_sample > DYNRANGE * MAXVALUE)
overdriven_sample = DYNRANGE * MAXVALUE;
10000
0
-40000
-30000
-20000
-10000
if (sample < 0) overdriven_sample = -overdriven_sample;
output_buffer[current_position = overdriven_sample;
0
10000
20000
30000
40000
-10000
-20000
-30000
-40000
© 2010 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2)
21
© 2010 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2)
Fondamenti di Informatica - Real-time audio
22
Fondamenti di Informatica - Real-time audio
Verso un suono più caldo:
saturazione esponenziale asimmetrica
Verso un suono più caldo:
saturazione esponenziale
15000
10000
sample =
input_buffer[current_position] * gain / MAXVALUE;
5000
0
-40000
overdriven_sample = 1 - (exp (-K * fabs(sample)));
-30000
-20000
-10000
-5000
0
10000
20000
30000
40000
-10000
if (sample < 0) overdriven_sample = -overdriven_sample;
output_buffer[current_position] =
overdriven_sample * MAXVALUE;
-15000
-20000
-25000
-30000
-35000
© 2010 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2)
23
© 2010 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2)
© 2000 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2)
24
4
Fondamenti di Informatica
Fondamenti di Informatica - Real-time audio
Verso un suono più caldo:
saturazione esponenziale asimmetrica
Fondamenti di Informatica - Real-time audio
Esempio: delay (eco)
sample =
input_buffer[current_position] * gain / MAXVALUE;
if (sample < 0)
overdriven_sample =
- (1 - (exp(-K*fabs(sample))));
else
overdriven_sample =
(1 - (exp(-K*fabs(sample*ASYMGAIN))))/ASYMGAIN;
output_buffer[current_position] =
overdriven_sample * MAXVALUE;
© 2010 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2)
25
© 2010 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2)
Fondamenti di Informatica - Real-time audio
L’effetto eco prima del digitale
© 2010 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2)
26
Fondamenti di Informatica - Real-time audio
L’effetto eco prima del digitale
27
Fondamenti di Informatica - Real-time audio
© 2010 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2)
Delay digitale
28
Fondamenti di Informatica - Real-time audio
L’effetto eco prima del digitale
© 2010 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2)
29
© 2010 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2)
© 2000 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2)
30
5
Fondamenti di Informatica
Delay digitale
Fondamenti di Informatica - Real-time audio
Fondamenti di Informatica - Real-time audio
Il “nastro magnetico” digitale in C
• Buffer circolare
posizione di
estrazione
posizione di
inserimento
avanzamento degli indici
© 2010 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2)
31
© 2010 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2)
32
Fondamenti di Informatica - Real-time audio
Il “nastro magnetico” digitale in C
• Per il delay, scrittura e lettura sono
sincronizzate (semplificazione!)
output_buffer[i] =
input_buffer[i] +
nastro[indice_estrazione]*attenuazione;
nastro[indice_inserimento] =
output_buffer[i];
if (++indice_inserimento >= DIM_BUFFER)
indice_inserimento = 0;
if (++indice_estrazione >= DIM_BUFFER)
indice_estrazione = 0;
© 2010 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2)
33
© 2000 Pier Luca Montessoro (si veda la nota di copyright alla slide n. 2)
6