Prof. PIER LUCA MONTESSORO
Facoltà di Ingegneria
Università degli Studi di Udine
La voce di Elvis Presley, la chitarra di David Gilmour
e le funzioni di callback in linguaggio C
l’ingegneria elettronica nella musica moderna
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).
Nota di Copyright
Effetto eco
L’effetto eco prima del digitale
L’effetto eco prima del digitale
L’effetto eco prima del digitale
Overdrive
Overdrive analogico
E in digitale?
In linguaggio C…
• I campioni da 16 bit sono rappresentati da valori di tipo signed short int
• La sequenza di campioni è memorizzata in un vettore in cui i valori del canale
destro e canale sinistro sono alternati
signed short int buffer[88200]
Interfaccia audio
driver software dispositivo
hardware
programma applicativo
qui tocca a noi!
qui ci pensa il
costruttore…
Libreria portaudio
• http://www.portaudio.com/
“Portable cross-platform Audio API”
• Compatibile con cygwin/gcc
• Wrapper per le esercitazioni di
“Architettura dei calcolatori”:
Un piccolo problema
Il driver software esiste già. Come fa a chiamare una funzione della nostra
applicazione?
Funzioni di CALLBACK!!!
Callback function
driver software
programma applicativo f_inizializzazione (indirizzo_fz_appl)
chiamata di (*indirizzo_fz_appl)()
rtalib
• Limitata al formato CD audio (44.1 KHz, 16 bit, stereo)
• 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)
• per compilare:
cc_rta <nome programma>
rtalib: funzioni di inizializzazione
int init_stream_for_input (void) int init_stream_for_output (void)
int init_stream_for_input_and_output (void)
rtalib: funzioni di callback
void write_buffer_to_play
(signed short int *buffer, int buffer_size)
void read_recorded_buffer
(signed short int *buffer, int buffer_size)
void read_and_write_buffer
(signed short int *input_buffer,
signed short int *output_buffer,
int buffer_size)
rtalib: temporizzazione e chiusura
void sleep_while_stream_is_running
(double seconds)
int close_stream (void)
Esempio: wire
void wire (void) {
if (init_stream_for_input_and_output() == -1) {
printf ("error opening output stream\n");
exit (EXIT_FAILURE);
}
printf ("Playing... 'X' to terminate.\n");
while (toupper(getchar()) != 'X');
return;
}
Esempio: wire
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++; /* left */
*output_buffer++ = *input_buffer++; /* right */
}
Overdrive analogico
Overdrive analogico
Overdrive analogico:
il caldo suono delle valvole
Il diodo ideale: clip
-10000 0 10000 20000 30000
-40000 -30000 -20000 -10000 0 10000 20000 30000 40000
Il diodo ideale in linguaggio C
sample = input_buffer[current_position];
overdriven_sample = fabs (sample * gain);
if (overdriven_sample > DYNRANGE * MAXVALUE) overdriven_sample = DYNRANGE * MAXVALUE;
if (sample < 0) overdriven_sample = -overdriven_sample;
output_buffer[current_position = overdriven_sample;
Verso un suono più caldo:
saturazione esponenziale
-20000 -10000 0 10000 20000 30000 40000
-40000 -30000 -20000 -10000 0 10000 20000 30000 40000
Verso un suono più caldo:
saturazione esponenziale
sample =
input_buffer[current_position] * gain / MAXVALUE;
overdriven_sample = 1 - (exp (-K * fabs(sample)));
if (sample < 0) overdriven_sample = -overdriven_sample;
output_buffer[current_position] =
overdriven_sample * MAXVALUE;
Verso un suono più caldo:
saturazione esponenziale asimmetrica
-25000 -20000 -15000 -10000 -5000 0 5000 10000 15000
-40000 -30000 -20000 -10000 0 10000 20000 30000 40000