Fondamenti di Informatica: esercitazione di laboratorio Programmi in linguaggio C per manipolare file bitmap e audio (II parte)
Pier Luca Montessoro
1.
Generazione segnale a dente di sega
Un segnale a dente di sega in frequenze audio produce un suono molto ricco di armoniche in quanto ogni ciclo è composto da una rampa lineare ascendente seguita da un gradino discendente (si veda l’immagine in figura).
Si scriva un programma che crei un file audio contenente un segnale a dente di sega per ciascun canale i cui parametri sono passati al programma sulla riga di comando nel seguente ordine:
• frequenza del canale sinistro (in Hz)
• ampiezza del canale sinistro (percentuale rispetto all’ampiezza massima)
• frequenza del canale destro (in Hz)
• ampiezza del canale destro (percentuale rispetto all’ampiezza massima)
• durata (in secondi)
2.
256 sfumanture di grigio
Si scriva un programma in linguaggio C che riceva sulla riga di comando il nome di un file bitmap di uscita e le sue dimensioni (numero di pixel in altezza e larghezza), e generi in tale file di uscita un’immagine contenente, da sinistra verso destra, tutte le 256 gradazioni di grigio rappresentabili
con una bitmap in modalità “true color”.
3.
Melodia con campanelli
Si vuole costruire una melodia basandosi sul suono registrato di 12 campanellini (uno per nota musicale). Si ha a disposizione un vettore di strutture dati già inizializzato definito come riportato a lato.
Ogni elemento del vettore contiene quindi il nome della nota e la registrazione del relativo campanellino. I nomi delle note memorizzate nel vettore di strutture sono composti da una singola parola. Per esempio: “do”, “sibemolle”, “solbemolle”, “re” (si considerano solo i “bemolle”, non i
“diesis”).
La melodia è descritta da una sequenza di stringhe che identificano le note come sopra descritto. Ad esempio:
do do mibemolle mibemolle sol sol la sibemolle fa fa fa re re re do do do do
La durata di ogni nota della melodia è costante e vale 300 ms. La durata delle registrazioni dei campanellini è variabile, ma sempre inferiore a 300 ms.
Si scriva un programma in linguaggio C che riceva sulla riga di comando il nome di un file wave di uscita e la melodia nel formato sopra descritto. Il programma deve scrivere nel file la melodia in formato audio.
Si assuma già disponibile la funzione void carica_suoni (struct suoni campanelli[]) che inizializza il vettore.
NOTA: all’indirizzo http://web.diegm.uniud.it/pierluca/public_html/downloads/teaching/melodia_con_campanelli/
sono disponibili i file wave e il file C contenente la funzione carica_suoni.
4.
Vedo doppio
Tra gli effetti speciali fotografici, uno dei più semplici consiste nel far comparire nella stessa foto la stessa persona due volte. Una possibile tecnica prevede di scattare due foto mantenendo la camera immobile e lo sfondo inalterato. Il soggetto si posiziona sul lato destro della foto durante il primo scatto, e sul lato sinistro nel secondo. Poi, le due foto vengono “tagliate” a metà e vengono unite le due parti in cui è presente il soggetto.
Si vuole realizzare tale effetto speciale mediante immagini bitmap. L’immagine sia identificata da un nome (una stringa senza spazi, nel seguito indicata con s). Il file di uscita avrà come nome il contenuto della stringa s ed estensione bmp, mentre le immagini contenenti i due scatti sopra descritti avranno la stessa estensione, ma come nome il contenuto di s seguito, rispettivamente, da
“_LEFT” e “_RIGHT”. Per esempio, le immagini dei due scatti sono contenute nei file vedodoppio_LEFT.bmp e vedodoppio_RIGHT.bmp e il nome del file da generare è vedodoppio.bmp.
Si scriva un programma in linguaggio C che riceva sulla riga di comando il nome dell’immagine (vedodoppio, nell’esempio di cui sopra) e la generi secondo quanto fin qui descritto.
Esempio:
vedodoppio_LEFT.bmp vedodoppio_RIGHT.bmp vedodoppio.bmp
(immagine risultante)
NOTA: all’indirizzo http://web.diegm.uniud.it/pierluca/public_html/downloads/teaching/vedo_doppio/ sono disponibili i file bitmap utili per provare il programma.
struct suoni {
char nome_nota[16];
WAVE suono_nota;
} campanellini[12];