• Non ci sono risultati.

La voce di Elvis Presley, la chitarra di David Gilmour e le funzioni di callback in linguaggio C

N/A
N/A
Protected

Academic year: 2021

Condividi "La voce di Elvis Presley, la chitarra di David Gilmour e le funzioni di callback in linguaggio C"

Copied!
34
0
0

Testo completo

(1)

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

(2)

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

(3)

Effetto eco

(4)

L’effetto eco prima del digitale

(5)

L’effetto eco prima del digitale

(6)

L’effetto eco prima del digitale

(7)

Overdrive

(8)

Overdrive analogico

(9)

E in digitale?

(10)

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]

(11)

Interfaccia audio

driver software dispositivo

hardware

programma applicativo

qui tocca a noi!

qui ci pensa il

costruttore…

(12)

Libreria portaudio

• http://www.portaudio.com/

“Portable cross-platform Audio API”

• Compatibile con cygwin/gcc

• Wrapper per le esercitazioni di

“Architettura dei calcolatori”:

(13)

Un piccolo problema

Il driver software esiste già. Come fa a chiamare una funzione della nostra

applicazione?

Funzioni di CALLBACK!!!

(14)

Callback function

driver software

programma applicativo f_inizializzazione (indirizzo_fz_appl)

chiamata di (*indirizzo_fz_appl)()

(15)

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>

(16)

rtalib: funzioni di inizializzazione

int init_stream_for_input (void) int init_stream_for_output (void)

int init_stream_for_input_and_output (void)

(17)

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)

(18)

rtalib: temporizzazione e chiusura

void sleep_while_stream_is_running

(double seconds)

int close_stream (void)

(19)

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;

}

(20)

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 */

}

(21)

Overdrive analogico

(22)

Overdrive analogico

(23)

Overdrive analogico:

il caldo suono delle valvole

(24)

Il diodo ideale: clip

-10000 0 10000 20000 30000

-40000 -30000 -20000 -10000 0 10000 20000 30000 40000

(25)

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;

(26)

Verso un suono più caldo:

saturazione esponenziale

-20000 -10000 0 10000 20000 30000 40000

-40000 -30000 -20000 -10000 0 10000 20000 30000 40000

(27)

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;

(28)

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

(29)

Verso un suono più caldo:

saturazione esponenziale asimmetrica

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;

(30)

L’effetto eco digitale

(31)

Delay digitale

(32)

Delay digitale

(33)

Il “nastro magnetico” digitale in C

• Buffer circolare

posizione di estrazione

posizione di inserimento

avanzamento degli indici

(34)

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;

Riferimenti

Documenti correlati

Analisi Matematica A – Secondo modulo Corso di Laurea in Matematica.. Università

•  Essa si basa sulla definizione di grandezze fisiche, sulla loro quantificazione in termini di un numero, la misura, e di una unità di misura, un campione della

Calcolo degli errori: media, errore massimo, errore relativo ed errore percentuale.. Cifre significative di una misura indiretta e dell’errore

Nella società attuale, il linguaggio, viva espressione della dinamica dei mutamenti sociali, è particolarmente sollecitato dalla velocità e dai nuovi strumenti

Il contenitore può essere ritirato presso i Punti Prelievo Distrettuali o il Laboratorio Analisi. Raccogliere una piccola quantità di feci nel contenitore idoneo (circa

Teorema di integrabilit`a, teorema di equivalenza, propriet`a di ad- ditivit`a rispetto all’insieme di integrazione, teorema di Fubini, insiemi sem- plici e formule di

Il tipo intero viene utilizzato per tutte le grandezze che possono essere rappresentate come numeri interi, come per es.: età, numero di figli, ecc.. Campo di variabilità Campo

Priorità degli operatori può essere alterata con le parentesi tonde: vengono valutate per prima le operazioni all’interno delle parentesi tonde più