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